Linux驱动(基础):28---调试技术之(监视调试工具strace)

一、什么是监视调试

  • 有时,通过监视用户空间中应用程序的运行情况,可以捕捉到一些小问题。监视程序同时也有助于确认驱动程序工作是否正常
  • 例如,查看scull的read实现如何响应不同数据量的read请求,就可以判断它是否工作正常
  • 有许多方法可用来监视用户空间程序的工作情况,比如使用调试器,或者在strace状态下运行程序等。在检查内核代码时,strace技术最值得关注

二、strace工具介绍

  • 功能:
    • strace命令是一个功能非常强大的工具,它可以显示由用户空间程序所发出的所有系统调用
    • 它不仅可以显示调用。而且还能显示调用参数以及用符号形式表示的返回值。当系统调用失败时,错误的符号值(如ENOMEM)和对应的字符串(如“Out of memory”)都能被显示出来
    • strace将跟踪信息打印到stderr
    • gdb等调试器可以连接到一个正在运行的进程并控制该进程,strace也可以跟踪一个正在运行的进程
  • 参数:
    • -t:该选项用来显示调用发生的时间
    • -T:显示调用所花费的时间
    • -e:限定被跟踪的调用类型
    • -o:将输出重定向到一个文件中
  • 总结:
    • 我们可以在strace的输出中发现很多有用信息,但如果觉得这些符号过于拖累的话,则可以仅限于监视文件方法(read、write等)的工作成功
    • strace对于查找系统调用运行时的细微错误最为有用,例如确切查明系统调用的哪个参数引发了错误

三、演示案例

  • 例如,下面给出了strace ls /dev > /dev/scull0命令的最后几行输出信息:
    • ls完成对目标目录的检索后,在首次对wrie的调用中,其试图写入4KB数据,但是实际只写入了4000个字节,接着它重试这一操作。然而,我们知道scull的write实现每次最多只写入一个量子(scull中设置的量子大小为4000个字节),所以我们所预期的就是下图的部分写入。经过一些步骤之后,每个工作都顺利通过,程序正常退出

Linux驱动(基础):28---调试技术之(监视调试工具strace)_第1张图片

  • 例如,我们对scull设备进行读操作(使用wc命令):
    • 正如所预料的,read每次只能读取4000个字节,但数据总量与前面例子中写入的总量是相同的。与上面的写入跟踪相比,请注意本例中的重试是如何组织的。为了快速读取数据,wc被优化了,因而其绕过了标准库,试图通过一次系统调用读取更多的数据,这可以从read的跟踪行中看到:wc每次均试图读取16KB数据

Linux驱动(基础):28---调试技术之(监视调试工具strace)_第2张图片

你可能感兴趣的:(Linux驱动(基础))