如何追踪Linux进程系统调用 strace调试工具使用指南

我上周尝试过 strace。
这非常有用。

strace是Linux中检查系统调用的工具。

格式为 strace + 选项 + 命令。

例如,strace ls。

输出显示读写打开调用。

-f是查看子进程。

-pPID is to look at the specified process.
-o 允许您保存文件。

-t或-tt可以显示时间。

-T可以看到每次调用需要多长时间。

输出一行就是一次调用。

例如openat(AT_FDCWD,"/etc/passwd",O_RDONLY)=3 <0>
表示打开文件。

返回值为3
花费了0.00001 2 秒。

注意是否有过多的阅读或写作。

检查返回值是否为负数。

检查通话之间所花费的时间。

使用 -p 附加进程。

例如,strace -p 1 2 3 4
如果可以 fork,请添加 -f。

使用 -o 保存输出。

示例:strace -o debug.log ls。

使用 grep 进行过滤。

例如,grep '^open' debug.log。
使用
-etrace= 跟踪特定调用。

例如 strace -etrace=networkcurl http://example.com。

您必须有足够的权限,通常是 root。

不要在生产环境中使用它太久,因为它可能会堵塞流程。

无法看到内核线程。

可以与 ltrace 一起使用。

ltrace 查看库函数调用。

strace 查看系统调用。

简单来说,还是蛮有用的。

linuxstrace命令详解

前两天在公司开技术分享会,看到同事小王演示如何使用strace调试程序。
他打开终端,输入命令“strace ls”,然后ls命令运行正常,但他在终端中看到了一系列系统调用信息,比如open、read、close等,他解释说这就是strace跟踪系统调用的方式。

我记得您提到过 strace 工具特别有用,尤其是在解决网络编程或文件操作等问题时。
比如,他曾经在调试一个网络爬虫,发现它永远无法连接到某个服务器。
使用strace追踪后,发现是DNS解析的问题。

我好奇地问:“怎么用strace?”
小王回答:“简单,比如要跟踪一个进程,只要输入strace加进程ID即可,或者跟踪一个命令,直接在命令前加上strace即可。
还有,可以使用-f选项来跟踪fork和vfork创建的新进程,使用-e选项来指定跟踪的事件类型。

我突然想到strace的输出信息好像是这样的。
相当复杂,如何解读呢?
小王笑道:“你得慢慢学。
比如系统调用的返回值,0通常代表成功,-1 代表失败,下面的错误码可以告诉你失败的原因。

等等,还有一件事,我记得他说strace还可以用来分析性能瓶颈,比如跟踪系统调用的次数和某个操作的耗时,从而优化程序的性能。

嗯,看来strace是一个非常强大的工具。
下次遇到类似问题时我必须尝试这个。
不过使用起来会不会有问题呢?

UNIX/Linux下的exit系列函数

_exit(2 ) 直接退出,不返回值,关闭文件描述符并向父进程发送SIGCHLD。
使用 Linux 特定函数“exit_group(2 )”可以同时终止所有线程。
_exit 和 exit_group 在功能上是等效的,glibc2 .3 将 _exit 包装为 exit_group。
_Cstdlib中的_exit(3 )具有良好的跨平台可移植性,与_exit(2 )等效。
exit(3 ) 调用 _exit(2 ) 来执行清理操作,例如关闭文件。
atexit(3 ) 是一个在注册和退出之前运行的函数,成功时返回 0。
on_exit(3 )支持参数,更加灵活,是Linux独有的。
atexit 和 on_exit 确保退出前完成清理。
在 main 结束之前调用 exit 并注册 atexit/on_exit 来实现逻辑。
使用这些功能来控制流程生命周期并提高稳健性。
你自己掂量一下吧。