linux strace調式定位系統問題

strace 的基本功能

strace?的主要功能包括:

  • 跟蹤系統調用:顯示進程執行時調用的系統函數及其參數和返回值。
  • 監控信號:記錄進程接收到的信號。
  • 性能分析:統計系統調用的執行時間和次數。
  • 調試支持:幫助定位程序崩潰、性能瓶頸或其他異常行為。
  • ?strace 的常用參數
  • 以下是?strace?常用參數及其功能:

  • -p <PID>:跟蹤指定進程 ID 的系統調用。
  • -c:統計系統調用的執行時間、次數和錯誤次數。
  • -e <事件>:指定要跟蹤的事件類型,例如?-e trace=open,read,write
  • -f:跟蹤由?fork()?創建的子進程。
  • -t:在輸出中顯示時間戳(秒)。
  • -tt:顯示更精確的時間戳(包括微秒)。
  • -T:顯示每個系統調用花費的時間。
  • -d:輸出?strace?本身的調試信息。

1,查看某個函數的調用情況:

strace -e? trace=function, function2 -p $pid

root@ubuntu:/home/lark# strace -e trace=epoll_wait -p 1051
strace: Process 1051 attached
epoll_wait(3,?

[], 1, 10000) ? ? ? ? ? ? = 0
epoll_wait(3,?
[], 1, 10000) ? ? ? ? ? ? = 0
epoll_wait(3,?

2,系統調用 strace ls

lark@ubuntu:~$ strace ls
execve("/usr/bin/ls", ["ls"], 0x7ffe76d6d020 /* 48 vars */) = 0
brk(NULL) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? = 0x55dca912f000
arch_prctl(0x3001 /* ARCH_??? */, 0x7fffb5cf4f70) = -1 EINVAL (Invalid argument)
access("/etc/ld.so.preload", R_OK) ? ? ?= -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=89543, ...}) = 0
mmap(NULL, 89543, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f7aac2b7000
close(3) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?= 0
mprotect(0x7f7aac290000, 135168, PROT_NONE) = 0
pread64(3,"\4\0\0\0\24\0\0\0\3\0\0\0GNU\0\\\373\211m\324\17\220\252\214l\213\270V\0M\37"..., 68, 824) = 68
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f7aabfdc000
arch_prctl(ARCH_SET_FS, 0x7f7aabfdd400) = 0
mprotect(0x7f7aac280000, 16384, PROT_READ) = 0
munmap(0x7f7aac2b7000, 89543) ? ? ? ? ? = 0
set_tid_address(0x7f7aabfdd6d0) ? ? ? ? = 2021
set_robust_list(0x7f7aabfdd6e0, 24) ? ? = 0
rt_sigaction(SIGRT_1, {sa_handler=0x7f7aabfe4c90, sa_mask=[], sa_flags=SA_RESTORER|SA_RESTART|SA_SIGINFO, sa_restorer=0x7f7aabff2420}, NULL, 8) = 0
rt_sigprocmask(SIG_UNBLOCK, [RTMIN RT_1], NULL, 8) = 0
prlimit64(0, RLIMIT_STACK, NULL, {rlim_cur=8192*1024, rlim_max=RLIM64_INFINITY}) = 0
statfs("/sys/fs/selinux", 0x7fffb5cf4ec0) = -1 ENOENT (No such file or directory)
brk(NULL) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? = 0x55dca912f000
brk(0x55dca9150000) ? ? ? ? ? ? ? ? ? ? = 0x55dca9150000
openat(AT_FDCWD, "/proc/filesystems", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0
read(3, "nodev\tsysfs\nnodev\ttmpfs\nnodev\tbd"..., 1024) = 387
read(3, "", 1024) ? ? ? ? ? ? ? ? ? ? ? = 0
ioctl(1, TIOCGWINSZ, {ws_row=45, ws_col=203, ws_xpixel=0, ws_ypixel=0}) = 0
getdents64(3, /* 24 entries */, 32768) ?= 768
close(3) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?= 0
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(0x88, 0), ...}) = 0
write(1, "1.txt ?Desktop\tDocuments ?Downlo"..., 871.txt ?Desktop?? ?Documents ?Downloads ?Music ?Pictures ?Public ?share ?Templates ?Videos
) = 87
close(1) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?= 0
close(2) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?= 0
exit_group(0) ? ? ? ? ? ? ? ? ? ? ? ? ? = ?
+++ exited with 0 +++

3,監控信號:strace -p pid? -e trace=signal -e trace=sigsegv

示例 1:監控進程接收到的所有信號

假設進程 ID 為?1234,可以使用以下命令:

strace -p 1234 -e trace=signal -e trace=sigsegv

lark@ubuntu:~$ kill -9 3242?

lark@ubuntu:~$ strace -p 3242 -e trace=signal
strace: Process 3242 attached
+++ killed by SIGKILL +++?

參數trace=sigsegv可選擇。

4,查看耗時 strace -T ls

ark@ubuntu:~$ strace -T ls
execve("/usr/bin/ls", ["ls"], 0x7ffe710124f8 /* 49 vars */) = 0 <0.000544>
brk(NULL) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? = 0x56352a5b2000 <0.000145>
arch_prctl(0x3001 /* ARCH_??? */, 0x7ffe72b0ca50) = -1 EINVAL (Invalid argument) <0.000143>
access("/etc/ld.so.preload", R_OK) ? ? ?= -1 ENOENT (No such file or directory) <0.000188>
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3 <0.000167>
fstat(3, {st_mode=S_IFREG|0644, st_size=89543, ...}) = 0 <0.000144>
mmap(NULL, 89543, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f9c94839000 <0.000328>
close(3) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?= 0 <0.000112>
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libselinux.so.1", O_RDONLY|O_CLOEXEC) = 3 <0.000093>
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0@p\0\0\0\0\0\0"..., 832) = 832 <0.000059>
fstat(3, {st_mode=S_IFREG|0644, st_size=163200, ...}) = 0 <0.000096>
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f9c94837000 <0.000060>
mmap(NULL, 174600, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f9c9480c000 <0.000061>

查看ls系統的耗時 strace -tt ls,使用?-tt?顯示微秒級時間戳

lark@ubuntu:~$ strace -tt ls
07:03:25.416052 execve("/usr/bin/ls", ["ls"], 0x7ffc6f804288 /* 49 vars */) = 0
07:03:25.416881 brk(NULL) ? ? ? ? ? ? ? = 0x56445be62000
07:03:25.417351 arch_prctl(0x3001 /* ARCH_??? */, 0x7ffccbd1e540) = -1 EINVAL (Invalid argument)
07:03:25.418487 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
07:03:25.418825 openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
07:03:25.419105 fstat(3, {st_mode=S_IFREG|0644, st_size=89543, ...}) = 0
07:03:25.419404 mmap(NULL, 89543, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f1ede6b8000
07:03:25.419930 close(3) ? ? ? ? ? ? ? ?= 0
07:03:25.420121 openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libselinux.so.1", O_RDONLY|O_CLOEXEC) = 3
07:03:25.420316 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0@p\0\0\0\0\0\0"..., 832) = 832
07:03:25.420479 fstat(3, {st_mode=S_IFREG|0644, st_size=163200, ...}) = 0

5,系統調用次數統計

strace -c?參數能夠對程序執行過程中的系統調用進行統計分析,輸出以下信息:

  • 調用次數:每個系統調用被調用的總次數。
  • 錯誤次數:每個系統調用失敗的次數。
  • 總耗時:每個系統調用所消耗的總時間。

strace -c ./my_program
查看my_program(while(1)循環函數)的調用次數

lark@ubuntu:~$ strace -c ?./a.out?
^Cstrace: Process 3382 detached
% time ? ? seconds ?usecs/call ? ? calls ? ?errors syscall
------ ----------- ----------- --------- --------- ----------------
? 0.00 ? ?0.000000 ? ? ? ? ? 0 ? ? ? ? 1 ? ? ? ? ? read
? 0.00 ? ?0.000000 ? ? ? ? ? 0 ? ? ? ? 2 ? ? ? ? ? close
? 0.00 ? ?0.000000 ? ? ? ? ? 0 ? ? ? ? 2 ? ? ? ? ? fstat
? 0.00 ? ?0.000000 ? ? ? ? ? 0 ? ? ? ? 7 ? ? ? ? ? mmap
? 0.00 ? ?0.000000 ? ? ? ? ? 0 ? ? ? ? 3 ? ? ? ? ? mprotect
? 0.00 ? ?0.000000 ? ? ? ? ? 0 ? ? ? ? 1 ? ? ? ? ? munmap
? 0.00 ? ?0.000000 ? ? ? ? ? 0 ? ? ? ? 1 ? ? ? ? ? brk
? 0.00 ? ?0.000000 ? ? ? ? ? 0 ? ? ? ? 6 ? ? ? ? ? pread64
? 0.00 ? ?0.000000 ? ? ? ? ? 0 ? ? ? ? 1 ? ? ? ? 1 access
? 0.00 ? ?0.000000 ? ? ? ? ? 0 ? ? ? ? 1 ? ? ? ? ? execve
? 0.00 ? ?0.000000 ? ? ? ? ? 0 ? ? ? ? 2 ? ? ? ? 1 arch_prctl
? 0.00 ? ?0.000000 ? ? ? ? ? 0 ? ? ? ? 2 ? ? ? ? ? openat
------ ----------- ----------- --------- --------- ----------------
100.00 ? ?0.000000 ? ? ? ? ? ? ? ? ? ?29 ? ? ? ? 2 total

6,strace 的?-d?參數用于輸出調試信息,幫助用戶更清晰地理解系統調用的細節。這些信息包括:

  • 系統調用的名稱和參數。
  • 調用的返回值。
  • 錯誤信息(如果有)。
  • 時間戳(如果與?-tt?參數結合使用)。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/82059.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/82059.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/82059.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

告別手抖困擾:全方位健康護理指南

手抖&#xff0c;醫學上稱為震顫&#xff0c;是常見的身體癥狀&#xff0c;可能由多種原因引發&#xff0c;了解其成因并采取科學護理措施&#xff0c;對改善癥狀、維護健康至關重要。 生理性手抖往往因情緒激動、過度勞累、大量飲用咖啡或酒精等引起&#xff0c;這種手抖通常較…

華為2025年校招筆試真題手撕教程(一)

一、題目 輸入&#xff1a; 第一行為記錄的版本迭代關系個數N&#xff0c;范圍是[1&#xff0c;100000]; 第二行到第N1行&#xff1a;每行包含兩個字符串&#xff0c;第一個字符串為當前版本&#xff0c;第二個字符串為前序版本&#xff0c;用空格隔開。字符串包含字符個數為…

Qt 的多線程

Qt 中的多線程主要用于處理耗時操作&#xff0c;避免阻塞主線程&#xff08;UI 線程&#xff09;&#xff0c;從而提高程序的響應性和運行效率。以下是 Qt 多線程的相關技術總結&#xff1a; 常見的多線程實現方式 繼承 QThread 類 &#xff1a;最基礎的實現方式&#xff0c;具…

基于ITcpServer/IHttpServer框架的HTTP服務器

https://www.cnblogs.com/MuZhangyong/p/16839231.html 在基于ITcpServer/IHttpServer框架的HTTP服務器實現中,OnBody方法主要用于接收HTTP請求體數據,而觸發HTTP響應通常是在OnMessageComplete方法中完成。以下是完整的響應觸發機制說明: sequenceDiagramClient->>…

Windows 下 Qt 項目配置 FFmpeg 簡明指南

一、作用 在qt項目中配置ffmpeg庫 二、步驟 1、直接使用已經編譯好的ffmpeg庫文件&#xff0c;分為win32版本和win64版本&#xff1b; 2、win32版本下載地址&#xff1a;https://github.com/sudo-nautilus/FFmpeg-Builds-Win32/releases/tag/latest 3、win64版本下載地址&a…

Attu下載 Mac版與Win版

通過Git地址下載 Mac 版選擇對于的架構進行安裝 其中遇到了安裝不成功&#xff0c;文件損壞等問題 一般是兩種情況導致 1.安裝版本不對 2.系統權限限制 https://www.cnblogs.com/similar/p/11280162.html打開terminal執行以下命令 sudo spctl --master-disable安裝包Git下載地…

SpringBoot3集成Oauth2.1——5資源地址配置

配置問題說明 如下所示&#xff0c;代碼配置了兩個&#xff0c;過濾器&#xff0c;一個是資源保護&#xff0c;一個是不保護。 /** Description: 配置需要保護的資源* author: 胡濤* mail: hutao_2017aliyun.com* date: 2025年5月23日 下午2:28:20*/BeanOrder(2)public Securi…

Python urllib.parse 模塊中的 urljoin 方法

Python urllib.parse 模塊中的 urljoin 方法 urljoin 是 Python 標準庫中 urllib.parse 模塊的一個方法&#xff0c;用于將基礎 URL 和相對路徑拼接成完整的 URL。它會根據傳入的基礎 URL 自動處理協議、域名以及路徑的部分匹配邏輯。 以下是關于該方法的具體說明和示例&…

AI大模型和SpringAI簡介

一、Spring AI 簡介 SpringAI整合了全球&#xff08;主要是國外&#xff09;的大多數大模型&#xff0c;而且對于大模型開發的三種技術架構都有比較好的封裝和支持&#xff0c;開發起來非常方便。 不同的模型能夠接收的輸入類型、輸出類型不一定相同。SpringAI根據模型的輸入…

在TIA 博途中下載程序時找不到對應的網卡怎么辦?

1. 檢查物理連接 確認網線已正確連接PLC和PC&#xff0c;接口指示燈正常。 嘗試更換網線或交換機端口&#xff0c;排除硬件故障。 2. 確認網卡驅動已安裝 設備管理器檢查&#xff1a; 右鍵點擊“此電腦” → “管理” → “設備管理器”。 展開“網絡適配器”&#xff0c;確…

Zabbix實踐!客戶端自動發現

在線答疑&#xff1a;樂維社區 一、客戶端狀態檢查 1.檢查客戶端的zabbix-agent2是否正常 [rootnode1 ~]# systemctl is-active zabbix-agent2.service active 2.從服務端檢查是否可以獲得客戶端信息 [rootIT-01 ~]# zabbix_get -s ‘192.168.200.135’ -p 10050 -k ‘agent.p…

動態規劃中的 求“最長”、“最大收益”、“最多區間”、“最優策略” 雙重 for + 狀態轉移

以最長遞增子序列為例 &#x1f3af; 首先明確目標 以最長上升子序列&#xff08;LIS&#xff09;為例&#xff0c;假設輸入是&#xff1a; nums : []int{10, 9, 2, 5, 3, 7, 101, 18}我們定義&#xff1a; dp[i]&#xff1a;以 nums[i] 為結尾的最長上升子序列長度目標&…

SEO關鍵詞與長尾詞高效布局

內容概要 在SEO優化實踐中&#xff0c;關鍵詞布局的科學性與系統性直接影響流量的獲取效率與可持續性。本文以核心關鍵詞篩選為起點&#xff0c;結合長尾詞挖掘工具與語義關聯分析技術&#xff0c;逐步構建覆蓋用戶全搜索場景的內容矩陣。通過金字塔結構模型&#xff0c;實現高…

考研數一公式筆記

考研數學&#xff08;一&#xff09;核心結論與易錯點詳細筆記 第一部分&#xff1a;高等數學 一、函數、極限、連續 (一) 重要結論與公式 等價無窮小替換 (僅限乘除運算&#xff0c;極限過程為 x → 0 或某特定值導致因子→0)&#xff1a; sin x ~ x tan x ~ x arcsin x …

Debezium TableSchemaBuilder詳解

Debezium TableSchemaBuilder詳解 1. 類的作用與功能 1.1 核心作用 TableSchemaBuilder是Debezium中負責構建表Schema的核心類,主要功能包括: Schema構建:將數據庫表結構轉換為Kafka Connect的Schema定義主鍵處理:生成表的主鍵Schema值Schema處理:生成表的非主鍵字段Sc…

49 python Matplotlib之Pandas 數據可視化

Pandas 是 Python 中用于數據處理的核心庫,其內置了基于 Matplotlib 的可視化功能,可通過 DataFrame.plot() 和 Series.plot() 方法快速生成常見圖表,無需手動編寫繪圖代碼,大幅提升效率。 一、Pandas 核心繪圖方法 基礎語法如下:該代碼為偽代碼,僅做語法說明,無法執行…

《微服務架構設計模式》筆記

思維導圖 1-3章 4-6 章 5-13 章 資料 配套代碼倉庫&#xff1a;https://github.com/microservices-patterns/ftgo-application 作者網站&#xff1a;https://microservices.io/

手寫一個簡單的線程池

手寫一個簡單的線程池 項目倉庫&#xff1a;https://gitee.com/bossDuy/hand-tearing-thread-pool 基于一個b站up的課程&#xff1a;https://www.bilibili.com/video/BV1cJf2YXEw3/?spm_id_from333.788.videopod.sections&vd_source4cda4baec795c32b16ddd661bb9ce865 理…

手機打電話時由對方DTMF響應切換多級IVR語音菜單(完結)

手機打電話時由對方DTMF響應切換多級IVR語音菜單&#xff08;完結&#xff09; --本地AI電話機器人 上一篇&#xff1a;手機打電話時由對方DTMF響應切換多級IVR語音菜單&#xff08;話術腳本與實戰&#xff09; 下一篇&#xff1a;編寫中 一、前言 經過前面幾個篇章的詳細闡…

Android.mk解析

一、變量說明: 1.LOCAL_PATH:= $(call my-dir) 此行代碼在Android.mk的開頭,用于給出當前文件的路徑 LOCAL_PATH 用于在開發樹中查找源文件 宏函數’my-dir’, 由編譯系統提供,用于返回當前路徑(即包含Android.mk file文件的目錄) 2.LOCAL_PACKAGE_NAME := SecSettings …