一位同事曾告诉我,当Linux上的所有内容都无法调试时,最后一个选项是使用strace.
我试图学习这个奇怪工具背后的科学,但我不是系统管理大师,我没有真正得到结果.
所以,
究竟是什么,它做了什么?
如何以及在何种情况下使用它?
如何理解和处理输出?
简而言之,简单来说,这些东西是如何工作的?
Strace Overview
strace可以看作是轻量级调试器.它允许程序员/用户快速了解程序如何与OS交互.它通过监视系统调用和信号来实现.
当你没有源代码或不想被打扰时,使用 Good for.
此外,如果您不想打开GDB,但只是对了解外部交互感兴趣,则对您自己的代码很有用.
一个很好的小介绍
我在这个介绍中遇到了前几天的使用:strace hello world
简单来说,strace跟踪程序发出的所有系统调用及其返回代码.想一想像文件/套接字操作这样的东西,以及更多不起眼的操作.
如果你有一些C的工作知识,这是非常有用的,因为这里系统调用更准确地代表标准C库调用.
假设你的程序是/ usr/local/bin/cough.只需使用:
strace /usr/local/bin/cough
要么
strace -o/usr/local/bin/cough
写入'out_file'.
所有strace输出都将转到stderr(请注意,它的绝对数量通常会要求重定向到文件).在最简单的情况下,您的程序将中止错误,您将能够看到它在strace输出中与OS的最后交互.
应提供更多信息:
man strace
strace列出了应用它的进程完成的所有系统调用.如果您不知道系统调用的意思,那么您将无法获得多少里程数.
然而,如果您的问题涉及文件或路径或环境值,在有问题的程序上运行strace并将输出重定向到文件然后为您的路径/文件/ env字符串grepping该文件可能会帮助您查看您的程序实际尝试的内容做,与你的预期截然不同.
Strace作为调查生产系统的工具脱颖而出,您无法在调试器下运行这些程序.特别是,我们在以下两种情况下使用了strace:
程序foo似乎陷入僵局并且变得反应迟钝.这可能是gdb的目标; 但是,我们并不总是有源代码,或者有时候处理的脚本语言不是直接在调试器下运行.在这种情况下,您在已经运行的程序上运行strace,您将获得正在进行的系统调用列表.如果您正在研究客户端/服务器应用程序或与数据库交互的应用程序,这将特别有用
调查程序缓慢的原因.特别是,我们刚刚迁移到新的分布式文件系统,系统的新吞吐量非常慢.您可以使用'-T'选项指定strace,它将告诉您每次系统调用花费了多少时间.这有助于确定文件系统导致速度变慢的原因.
有关使用strace进行分析的示例,请参阅我对此问题的回答.
我一直使用strace来调试权限问题.技术如下:
$ strace -e trace=open,stat,read,write gnome-calculator
gnome-calculator
您要运行的命令在哪里.
strace -tfp PID将监视PID进程的系统调用,因此我们可以调试/监视我们的进程/程序状态.
Strace可以用作调试工具,也可以用作原始分析器.
作为调试器,您可以看到给定的系统调用如何被调用,执行以及它们返回的内容.这非常重要,因为它不仅可以让您看到程序失败,还可以看到程序失败的原因.通常,这只是糟糕的编码没有捕捉到程序的所有可能结果的结果.其他时候它只是文件的硬编码路径.没有strace,你可以猜到在哪里以及如何出错.使用strace,您可以获得系统调用的细分,通常只是查看返回值会告诉您很多.
分析是另一种用途.您可以使用它来单独执行每个系统调用,或者作为聚合执行.虽然这可能不足以解决您的问题,但它至少会大大缩小潜在嫌疑人名单的范围.如果你在一个文件上看到很多fopen/close对,你可能不必在每次执行循环时都打开和关闭文件,而不是在循环之外打开和关闭它.
Ltrace是strace的近亲,也非常有用.你必须学会区分你的瓶颈所在.如果总执行时间为8秒,并且您在系统调用上只花费了0.05秒,那么对程序进行支持并不会对您有好处,问题在于您的代码,这通常是逻辑问题,或者程序实际需要花那么长时间才能跑.
strace/ltrace的最大问题是读取它们的输出.如果您不知道如何进行调用,或者至少知道系统调用/函数的名称,那么解释其含义就很困难了.了解函数返回的内容也非常有用,尤其是对于不同的错误代码.虽然破译是一种痛苦,但它们有时真的会回归知识的一颗珍珠; 一旦我看到我用完inode但没有空闲空间的情况,所以所有常用的实用工具都没有给我任何警告,我只是无法创建一个新文件.从strace的输出中读取错误代码指向了正确的方向.