当前位置:  开发笔记 > 编程语言 > 正文

怎么应该使用strace?

如何解决《怎么应该使用strace?》经验,为你挑选了7个好方法。

一位同事曾告诉我,当Linux上的所有内容都无法调试时,最后一个选项是使用strace.

我试图学习这个奇怪工具背后的科学,但我不是系统管理大师,我没有真正得到结果.

所以,

究竟是什么,它做了什么?

如何以及在何种情况下使用它?

如何理解和处理输出?

简而言之,简单来说,这些东西是如何工作的?



1> John Mulder..:

Strace Overview
strace可以看作是轻量级调试器.它允许程序员/用户快速了解程序如何与OS交互.它通过监视系统调用和信号来实现.


当你没有源代码或不想被打扰时,使用 Good for.
此外,如果您不想打开GDB,但只是对了解外部交互感兴趣,则对您自己的代码很有用.

一个很好的小介绍
我在这个介绍中遇到了前几天的使用:strace hello world



2> bltxd..:

简单来说,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



3> Asaf Bartov..:

strace列出了应用它的进程完成的所有系统调用.如果您不知道系统调用的意思,那么您将无法获得多少里程数.

然而,如果您的问题涉及文件或路径或环境值,在有问题的程序上运行strace并将输出重定向到文件然后为您的路径/文件/ env字符串grepping该文件可能会帮助您查看您的程序实际尝试的内容做,与你的预期截然不同.


`strace `来跟踪程序.`strace -o `输出到文件
或者只是:`strace -e open myprog`或者所有与文件相关的sys调用:**`strace -e file myprog`**
strace prog 2>&1 | grep ^ open \\(
对于非平凡的程序来说,这通常就像是从一根消防水管中喝水,所以你的工作会因为你的结果而得到切断......

4> terson..:

Strace作为调查生产系统的工具脱颖而出,您无法在调试器下运行这些程序.特别是,我们在以下两种情况下使用了strace:

程序foo似乎陷入僵局并且变得反应迟钝.这可能是gdb的目标; 但是,我们并不总是有源代码,或者有时候处理的脚本语言不是直接在调试器下运行.在这种情况下,您在已经运行的程序上运行strace,您将获得正在进行的系统调用列表.如果您正在研究客户端/服务器应用程序或与数据库交互的应用程序,这将特别有用

调查程序缓慢的原因.特别是,我们刚刚迁移到新的分布式文件系统,系统的新吞吐量非常慢.您可以使用'-T'选项指定strace,它将告诉您每次系统调用花费了多少时间.这有助于确定文件系统导致速度变慢的原因.

有关使用strace进行分析的示例,请参阅我对此问题的回答.



5> Jeff Sheffie..:

我一直使用strace来调试权限问题.技术如下:

$ strace -e trace=open,stat,read,write gnome-calculator

gnome-calculator您要运行的命令在哪里.



6> 小智..:

strace -tfp PID将监视PID进程的系统调用,因此我们可以调试/监视我们的进程/程序状态.



7> Marcin..:

Strace可以用作调试工具,也可以用作原始分析器.

作为调试器,您可以看到给定的系统调用如何被调用,执行以及它们返回的内容.这非常重要,因为它不仅可以让您看到程序失败,还可以看到程序失败的原因.通常,这只是糟糕的编码没有捕捉到程序的所有可能结果的结果.其他时候它只是文件的硬编码路径.没有strace,你可以猜到在哪里以及如何出错.使用strace,您可以获得系统调用的细分,通常只是查看返回值会告诉您很多.

分析是另一种用途.您可以使用它来单独执行每个系统调用,或者作为聚合执行.虽然这可能不足以解决您的问题,但它至少会大大缩小潜在嫌疑人名单的范围.如果你在一个文件上看到很多fopen/close对,你可能不必在每次执行循环时都打开和关闭文件,而不是在循环之外打开和关闭它.

Ltrace是strace的近亲,也非常有用.你必须学会​​区分你的瓶颈所在.如果总执行时间为8秒,并且您在系统调用上只花费了0.05秒,那么对程序进行支持并不会对您有好处,问题在于您的代码,这通常是逻辑问题,或者程序实际需要花那么长时间才能跑.

strace/ltrace的最大问题是读取它们的输出.如果您不知道如何进行调用,或者至少知道系统调用/函数的名称,那么解释其含义就很困难了.了解函数返回的内容也非常有用,尤其是对于不同的错误代码.虽然破译是一种痛苦,但它们有时真的会回归知识的一颗珍珠; 一旦我看到我用完inode但没有空闲空间的情况,所以所有常用的实用工具都没有给我任何警告,我只是无法创建一个新文件.从strace的输出中读取错误代码指向了正确的方向.

推荐阅读
刘美娥94662
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有