一、trace介紹
trace
是用於跟蹤系統調用和信號的Linux命令行工具。它可以幫助開發者診斷和調試系統性能問題。
跟蹤系統調用可以查看程序執行期間發生的事件,包括調用函數、參數及返回值。跟蹤信號可以查看程序在運行過程中接收到的信號。
使用trace
工具需要查看man頁面,根據需要指定不同的參數,例如-e
選項指定要跟蹤的事件,-p
選項指定要跟蹤的進程ID。
二、使用trace跟蹤系統調用
跟蹤系統調用可以幫助我們了解程序運行時調用哪些函數,以及函數的執行時間、返回值等信息。
下面我們以一個簡單的C程序為例:
#include <stdio.h>
#include <unistd.h>
int main() {
printf("Hello World!\n");
sleep(2);
return 0;
}
我們可以使用ltrace
工具跟蹤上述程序的系統調用:
sudo ltrace -c ./hello
上述命令將跟蹤./hello
程序執行的系統調用,並輸出每個函數符號被調用的次數和總的執行時間。
輸出結果如下:
printf 1 0.0001215650
write 1 0.0000266710
sleep 1 2.0000766010
__libc_start_main 1 0.0000192630
_start 1 0.0000128610
fflush 1 0.0000108650
puts 1 0.0000107710
_IO_putc 1 0.0000077480
_IO_new_file_overflow 1 0.0000032520
_IO_flush_all_lockp 1 0.0000002200
___printf_chk 2 0.0000000000
以上輸出結果告訴我們,printf
函數被調用了一次,write
函數被調用了一次,sleep
函數被調用了一次等。
三、使用trace跟蹤信號
跟蹤信號可以幫助我們了解程序在運行過程中接收到的信號,比如SIGINT、SIGSEGV等。
下面我們以一個簡單的C程序為例:
#include <stdio.h>
#include <signal.h>
void handler(int signum) {
printf("Received signal %d\n", signum);
}
int main() {
signal(SIGINT, handler);
while(1) {
}
return 0;
}
我們可以使用strace
工具跟蹤上述程序接收到的信號:
sudo strace -e trace=sigterm ./signal
上述命令將跟蹤./signal
程序接收到的SIGINT
信號,並輸出相關信息。
使用Ctrl-C
觸發SIGINT
信號後,輸出結果如下:
Process 2628 attached
--- SIGINT {si_signo=SIGINT, si_code=SI_TKILL, si_pid=2628, si_uid=1000} ---
+++ killed by SIGINT +++
以上輸出結果告訴我們,程序在接收到SIGINT
信號後被殺死。
四、使用trace跟蹤系統調用和信號
trace不僅可以用於跟蹤系統調用和信號,還可以同時跟蹤二者。
下面我們以一個簡單的C程序為例:
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
void handler(int signum) {
printf("Received signal %d\n", signum);
}
int main() {
signal(SIGINT, handler);
while(1) {
printf("Hello World!\n");
sleep(2);
}
return 0;
}
我們可以使用strace
工具跟蹤上述程序的系統調用和信號:
sudo strace -e trace=all -e signal=SIGINT ./signal
上述命令將跟蹤./signal
程序的系統調用和SIGINT
信號,並輸出相關信息。
使用Ctrl-C
觸發SIGINT
信號後,輸出結果如下:
Process 2726 attached
Hello World!
--- SIGINT {si_signo=SIGINT, si_code=SI_KERNEL} ---
Received signal 2
Hello World!
--- SIGINT {si_signo=SIGINT, si_code=SI_KERNEL} ---
Received signal 2
^C+++ killed by SIGINT +++
以上輸出結果告訴我們,程序被循環地執行,每隔兩秒鐘輸出一次Hello World!
,程序接收到SIGINT
信號後終止。
五、總結
trace命令是一個簡單而實用的工具,可以幫助我們診斷和調試系統性能問題。使用trace跟蹤系統調用可以了解程序運行時調用哪些函數,以及函數的執行時間、返回值等信息。使用trace跟蹤信號可以了解程序在運行過程中接收到的信號。使用trace跟蹤系統調用和信號可以同時查看二者相關的信息。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/309214.html