主要观点:strace
作为调试工具的优势是无论程序是否编译有调试信息都能显示程序在做什么,但只能看到系统调用,不知其起源。若程序编译有调试信息,strace
可显示二进制文件中每个系统调用的栈跟踪。
关键信息:通过示例展示了编译含调试信息的程序,使用strace --stack-trace
或-k
选项可获取系统调用的栈跟踪,包括标准库函数的调用以及程序自身函数的调用,如main
调用print_info
,还介绍了栈跟踪中每行末尾的地址及如何用addr2line
工具将地址解析为源文件和行号,最后给出了用 Python 脚本pretty_print_strace.py
美化strace
输出的方法。
重要细节:示例程序hello.c
使用printf
函数输出三行,实际调用了系统调用write
,编译命令为gcc -g -o hello hello.c
;strace
输出的栈跟踪从底部到顶部读取,顶部为实际发起系统调用的函数;addr2line
工具可将地址解析为源文件和行号,但strace
本身不显示;通过 Python 脚本可将strace
输出中的地址替换为源文件和行号,美化后的栈跟踪更易理解。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。