linux使用truss、strace和ltrace、gdb命令诊断软件运行问题

     strace、ltrace、truss三个命令的目的是

  1. 了解一个程序的工作原理(可以了解Linux下很多常用的命令实现的原理);
  2. 帮助定位程序中的问题(在开发工作时帮助定位问题);        

     strace

        strace(strace - trace system calls and signals)能够跟踪进程使用的系统调用,并显示其内容。因此,当遇到调试不明的故障时,首先使用strace找出系统调用中出错的地方,通常能得到故障发生的线索,特别是与文件有关的错误、参数错误等。使用strace能够有效地发现系统调用失败有关的故障,但无法发现用户写出的程序或共享库中发生的错误。strace 命令是一种强大的工具,它能够显示所有由用户空间程序发出的系统调用。跟踪程序的每个系统调用strace 显示这些调用的参数并返回符号形式的值。strace 从内核接收信息,而且不需要以任何特殊的方式来构建内核。

  • -i  找到地址方便GDB详细调试。给strace添加 -i 选项即可显示程序在哪个地址进行了系统调用,可以将该地址作为断点使用,然后使用GDB进一步定位问题。

     ltrace

        ltrace能够跟踪进程的库函数调用

     truss

        truss和strace命令达成的效果是基本一致的。truss和strace用来跟踪一个进程的系统调用或信号产生的情

     strace ltrace区别是

  1. strace —— Trace system calls and signals (跟踪一个进程的系统调用或信号产生的情况)
  2. ltrace —— A library call tracer (跟踪进程调用库函数的情况)   
  3. ltrace与strace都可以指定PID,即对运行中的程序进行跟踪.
  4. ltrace与strace都可以跟踪程序fork或clone子进程.
  5. ltrace是用-f参数,而strace是用-f(fork/clone)和-F(vfork)
  6. ltrace -p PID与strace -p PID

     strace、ltrace、truss共用参数

  • -f -F选项告诉strace同时跟踪fork和vfork出来的进程。除了可以跟踪当前进程,还可以跟踪其子进程。
  • -o file 将输出信息写到文件file中,而不是显示到标准错误输出(stderr)。
  • -e execve 只记录 execve 这类系统调用
  • -p pid :绑定到一个由pid对应的正在运行的进程。此参数常用来调试后台进程。

  •      strace、ltrace、truss命令使用示例

     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的已经在运行的进程。

     gdb命令

 

     参考资料

  • http://www.ibm.com/developerworks/cn/linux/l-tsl/
  • http://blog.chinaunix.net/uid-20775448-id-3791949.html

你可能感兴趣的:(Linux)