- 1、本文档共9页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
使用truss-ltrace.pdf
使用 truss、strace 或 ltrace 诊断软件的疑难杂症
- -
进程无法启动,软件运行速度突然变慢,程序的Segment Fault等等都是让每
个 Unix 系统用户头痛的问题,本文通过三个实际案例演示如何使用 truss、
strace 和 ltrace 这三个常用的调试工具来快速诊断软件的疑难杂症。
truss 和 strace 用来跟踪一个进程的系统调用或信号产生的情况,而
ltrace 用来跟踪进程调用库函数的情况。truss 是早期为 System V R4开发的调
试程序,包括Aix、FreeBSD在内的大部分 Unix 系统都自带了这个工具;而 strace
最初是为 SunOS 系统编写的,ltrace 最早出现在 GNU/Debian Linux中。这两个
工具现在也已被移植到了大部分 Unix 系统中,大多数 Linux 发行版都自带了
strace 和 ltrace,而 FreeBSD 也可通 过 Ports 安装它们。
你不仅可以从命令行调试一个新开始的程序,也可以把 truss、strace 或
ltrace 绑定到一个已有的 PID 上来调试一个正在运行的程序。三个调试工具的
基本使用方法大体相同,下面仅介绍三者共有,而且是最常用的三个命令行参数:
-f :除了跟踪当前进程外,还跟踪其子进程。
-o file :将输出信息写到文件 file 中,而不是显示到
标准错误输出(stderr)。
-p pid :绑定到一个由 pid 对应的正在运行的进程。此
参数常用来调试后台进程。
使用上述三个参数基本上就可以完成大多数调试任务了,下面举几个命令行
例子:
truss -o ls.truss ls -al: 跟踪 ls -al 的运行,将输
出信息写到文件/tmp/ls.truss 中。
strace -f -o vim.strace vim: 跟踪 vim 及其子进程的
运行,将输出信息写到文件 vim.strace。
ltrace -p 234: 跟踪一个pid 为 234 的已经在运行的进
程。
三个调试工具的输出结果格式也很相似,以 strace 为例:
brk(0) =
0x8062aa8
brk(0x8063000) =
0x8063000
mmap2(NULL, 4096, PROT_READ, MAP_PRIVATE, 3, 0x92f)
= 0
每一行都是一条系统调用,等号左边是系统调用的函数名及其参数,右边是
该调用的返回值。 truss、strace 和 ltrace 的工作原理大同小异,都是使用
ptrace 系统调用跟踪调试运行中的进程,详细原理不在本文讨论范围内,有兴
趣可以参考它们的源代码。
举两个实例演示如何利用这三个调试工具诊断软件的疑难杂症:
案例一:运行 clint 出现 Segment Fault 错误
操作系统:FreeBSD-5.2.1-release
clint 是一个 C++静态源代码分析工具,通过 Ports 安装好之后,运行:
# clint foo.cpp
Segmentation fault (core dumped)
文档评论(0)