一、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跟踪系统调用和信号可以同时查看二者相关的信息。