人们用strace解决了什么问题?

2021-04-08 14:55:27

昨天我询问推特关于人们解决的问题,常见的是每个人都真正交付!我有200个答案,然后花一束手动将它们分为9类问题。

所有问题都是关于查找文件一个程序取决于的,弄清楚为什么程序卡或慢,或者找出为什么程序无法进行。这些一般与我自己使用符号的东西匹配,但有些事情我也没有想过的东西!

我不会解释这篇文章中的帖子,但我有一个有关它的自由杂志和谈话和大量的博客帖子。

#1最受欢迎的问题是“该程序具有配置文件,我不知道它在哪里”。这可能是我对垒的最常见的用途,因为这是一个如此简单的问题。

这很好,因为程序有一百万种方法来记录配置文件(在手册页中,在其网站上的网页,在--help等),但只有它实际打开它的一种方式(与一个系统称呼!)

您还可以使用scrace来查找程序取决于的其他类型的文件,如:

动态链接库(“为什么我的程序加载错误版本的错误版本?”)像在2014年调试的这个Ruby问题

它正在寻找它的红宝石宝石(Ruby专门出现了几次!) 你有一个节目,它只是坐在那里无所事事,怎么了? 这一个特别容易回答,因为很多时候你刚刚逃跑strace -p pid并看看目前正在运行的系统调用。你甚至不必看一行数百行输出! 答案通常是'等待某种I / O'。 一些可能的答案“为什么卡住”(虽然有很多!): 它正在编写(),但它被阻止,因为缓冲区已满 它在stdin上做了一个read(),它正在等待输入 有人还给出了一个很好的例子,使用scrace调试困难的df:'with strace df -h你可以找到卡住的挂载并卸下它“。 前一个的变体:有时程序已经超过了你的预期运行,你只想知道它是否被困或者是在取得进展中。

只要该程序在运行时使系统调用,这是超级的,以便与strace回答 - 只是留下它,看看它是否正在制作新闻系统呼叫!

您可以使用strace作为一种粗糙分析工具 - Strace -t将显示每个系统调用的时间戳,因此您可以查找大差距并找到罪魁祸首。

以下是使用scrace推特的9个短篇小说“为什么这个程序慢?”。

回到2000年,一个基于Java的网站,我帮助支持的是愚蠢的负载:页面慢慢加载,如果有的话。我们删除了J2EE Applicationserver,发现它是读取类文件一个。字节。在。一个。时间。 devswer没有使用bufferedreader,经典的java错误。

优化应用程序启动时间...运行strace可以是令人眼生的经验,就不必要的文件系统交互的数量(例如在同一配置文件上又一次地打开/读/关闭;加载速度慢速的字体文件的gob NFS安装等)

询问自己为什么要从PHP中的会话文件中读取(通常是100字节)令人难以置信的速度。结果一些植绒-Syscalls花了〜60岁

一个程序表现得很慢。使用strace弄清楚它是在从/开发/随机和耗尽熵读取的每个请求中初始化其内部伪随机数发生器

我记得的最后一件事是附在工作者上,看看它正在制作多少个网络调用(意外)。

为什么这个程序开始如此缓慢? scrace显示它打开/读取相同的配置文件数千次。

服务器使用100%CPU时间随机使用低实际流量。事实证明它正在击中接受套接字的打开文件限制的数量,并在获得EMFile后重新恢复并未报告它。

工作流程运行超级慢但没有日志,最终尝试做一个在时间之前服用30秒的帖子请求,然后重试5次......结束了后端服务被淹没,但也没有可见性

使用strace注意gethostbyname()花了很长时间才能返回(您无法直接看到GethostByName,但您可以在符件中看到DNS数据包)

有时,程序无法出于一个神秘的原因,但问题是just,它有一些文件,它没有权限打开。在理想世界的程序中会报告那些错误(“错误打开文件/开发/可随身:权限被拒绝”),但当然,世界并不完美,所以符号大纲帮助这个!

这实际上是我使用的最近的帖子:我正在使用Anaxidraw Pen绘图仪,并且当Itried启动它时它会打印出一个缺乏的错误消息。我搞砸了它,事实证明我的用户只是没有打开USB设备的权限。

有时脚本正在运行另一个程序,您想知道它是Whatummand线标志它的传递!

基本上这里的目标只是为了找到网络连接的域/ IP地址。您可以查看DNS请求以查找域中的Connect系统调用以查找IP。

通常,当TCPdump无法出于某种原因时,使用strace与调试网络有很多故事,或者只是因为它是人更熟悉的话。

问题9:为什么这个程序在运行一种方式时会成功,并在另一种方式运行时失败?

当您运行它时,将其运行为“SU - User / Some / Script”失败

能够比较两种情况下的符号输出非常有用。虽然在调试时,但是在调试时的第一步是“当我的用户一样失败,并且在同一台计算机上的方框中运行时失败”将“查看我的环境variables”。

另外一个有很多人提到的是弄清楚Linux Kernelapi(例如NetLink,IO_URE,HDPARM,I2C等)。

即使这些API通常被记录,有时文档是iscusing或者没有很多示例,所以通常它更容易才能静置现有的应用程序,并查看它是如何与Linux内核交互的。

纹章也很好,只是普遍弄明地“这个程序如何?”。作为一个简单的例子,这是一个博客帖子,用于弄清楚Killall如何使用strace。

我正在考虑的原因是我一直在慢慢研究somechallenges,帮助人们使用strace和其他命令行工具练习。这个想法是你有问题来解决,终端,你是FreeTo以任何你想要的方式解决它。

因此,我的目标是使用它来构建一些练习问题,你可以解决他们能够反映人们实际使用它的问题的问题。

可能有更多的问题可以用我在这里覆盖的符号来解决 - 我很乐意听到我错过的东西!

我真的很喜欢看到一遍又一遍的用途和过度的用途 - 至少有20个不同的人回答说,他们使用strace tofind配置文件。一如既往,我认为这真的很令人愉快地如何诸如仿制工具(“跟踪系统调用!”)可以用来解决这么多不同的问题。