驱蚊器喵的翻译平台

Can you hear the gravity?

  1. 1. 问题 1:配置文件在哪里?
  2. 2. 问题 2: 这个程序还依赖哪些文件?
  3. 3. 问题 3: 为什么这个程序会挂起?
  4. 4. 问题 4: 这个程序卡住了吗?
  5. 5. 问题 5: 为什么这个程序很慢?
  6. 6. 问题 6: 隐藏的权限错误
  7. 7. 问题 7: 使用的是什么命令行参数?
  8. 8. 问题 8: 为什么这个网络连接会失败?
  9. 9. 问题 9: 为什么这个程序以一种方式运行时会成功,而以另一种方式运行时会失败?
  10. 10. 问题 10: 这个 Linux 内核 API 是如何工作的?
  11. 11. 问题 11: 普遍的逆向工程
  12. 12. 我在做什么:慢慢建立一些挑战
  13. 13. 以上就是全部!

原文地址:https://jvns.ca/blog/2021/04/03/what-problems-do-people-solve-with-strace/
原文标题:What problems do people solve with strace?
原文作者:Julia Evans
原文写于:2021/04/03

译者:驱蚊器喵#ΦωΦ
翻译水平有限,有不通顺的语句,请见谅。


昨天我在 Twitter 上问大家用 strace 解决过什么样的问题,和往常一样,大家都很给力!我收获了 200 个答案,然后花了些时间把它们手动分为 9 类。

所有的问题都是关于寻找程序依赖的文件,找出程序卡住或慢的原因,或者找出程序失败的原因。这些问题通常与我自己使用 strace 的情况相吻合,但也有一些我没有想到的问题。

我不打算在本文中解释 strace 是什么,但我有一本关于它的免费杂志一个讲座以及一些博客文章

问题 1:配置文件在哪里?

最受欢迎的问题之一是 “这个程序有一个配置文件,但我不知道它在哪里”。这可能也是我最常使用 strace 的问题,因为这个问题很简单。

这很好,因为一个程序有一百万种方法来记录它的配置文件在哪里(在 man page 中,或是在程序的网站上,或是在 --help 中,等等),但只有一种方法让程序真正打开了配置文件,那就是系统调用!

问题 2: 这个程序还依赖哪些文件?

你也可以用 strace 来查找程序依赖的其他类型的文件,比如:

问题 3: 为什么这个程序会挂起?

你有一个程序,它只是运行在那里什么也不做,这是怎么回事?这个问题特别容易回答,因为很多时候你只需要运行 strace -p PID,看看当前运行的是什么系统调用。你甚至不需要看上百行的输出结果!

答案通常是 “等待某种 I/O”。对于 “为什么会卡住” 的一些可能的答案(当然还有很多):

  • 程序永远在轮询 select() 的内容
  • 程序正在 wait() 一个子进程的完成
  • 程序向没有反应的东西发出了网络请求
  • 程序正在进行 write(),但由于缓冲区已满而被阻塞
  • 程序正在对 stdin 进行 read() 操作,并等待输入。

有人还举了一个很好的例子,用 strace 来调试卡住的 df :”用strace df -h 你可以找到卡住的挂载点,然后卸载它”。

问题 4: 这个程序卡住了吗?

前一个问题的变种:有时一个程序的运行时间比你预期的要长,你只想知道它是否被卡住了,或者它是否还在继续运行。

只要程序在运行时进行了系统调用,用 strace 就可以很容易地回答这个问题 - 只要 strace 一下,看看它是否在进行新的系统调用就可以了。

问题 5: 为什么这个程序很慢?

你可以用 strace 作为一种粗略的分析工具 - strace -t 会显示每个系统调用的时间戳,所以你可以寻找较大的时间间隔,找到罪魁祸首。

这里有 9 个来自 Twitter 的小故事,人们用 strace 来调试 “为什么这个程序运行得很慢?”

  • 早在 2000 年,我帮助支持的一个基于 Java 的网站在正常负载下奄奄一息:页面加载缓慢,甚至压根儿就加载不出来。我们对 J2EE 应用服务器进行了跟踪,发现它是一次一个字节地读取 class 文件。开发人员没有使用 BufferedReader ,这是典型的 Java 错误。
  • 优化应用程序的启动时间……运行 strace 可以让人大开眼界,因为可以看到有很多不必要的文件系统交互正在进行(例如,反复打开/读取/关闭同一个配置文件;通过缓慢的 NFS 挂载加载大量的字体文件,等等)。
  • 我问自己为什么在 PHP 中读取会话文件(通常小于 100 字节)的速度慢得惊人。结果发现一些 flock 系统调用需要 60 秒来完成。
  • 一个程序表现得异常缓慢。使用 strace 发现它在每次请求时都会通过从 /dev/random 读取并耗尽熵来重新初始化其内部的伪随机数发生器。
  • 我记得的最后一件事是连接到一个作业 worker 节点,然后看到它正在进行很多次网络调用(这是意想不到的)。
  • 为什么这个程序的启动速度这么慢?strace 显示它成千上万次的打开/读取同一个配置文件。
  • 服务器有时使用 100% 的 CPU 时间,而实际流量很低。结果发现它在接受一个套接字时遇到了打开文件数的限制,在得到 EMFILE 后永远重试,而没有报告错误。
  • 一个工作流程运行得超慢,而且没有日志,最后发现它试图做一个 post 请求,在超时前花了 30 秒,然后重试了 5 次……最后发现后端服务已经不堪重负,而且并没有可见性。
  • 使用 strace 注意到 gethostbyname() 需要很长时间才能返回(你不能直接看到 gethostbyname,但你可以在 strace 中看到 DNS 数据包)。

问题 6: 隐藏的权限错误

有时一个程序因为一个神秘的原因而运行失败,结果问题只不过是有一些文件没有权限打开。在一个理想的世界里,程序会报告这些错误(”Error opening file /dev/whatever: permission denied”),当然这个世界并不完美,所以 strace 真的可以帮助解决这个问题!

这实际上是我最近用 strace 做的事情。我正在使用一个 AxiDraw 绘图仪,当我试图启动它时,它打印出了一个难以捉摸的错误信息。我 strace 了它,结果发现我的用户没有权限打开 USB 设备。

问题 7: 使用的是什么命令行参数?

有时候,一个脚本正在运行另一个程序,而你想知道它传递的是什么命令行选项!

来自 Twitter 的几个例子:

  • 找出被用于构建代码的编译器选项
  • 一个命令由于命令行太长而失败了

问题 8: 为什么这个网络连接会失败?

基本上,这里的目标只是为了找到网络连接是通过哪个域/IP 地址进行的。你可以通过查看 DNS 请求来找到域名,或者通过 connect 系统调用来找到 IP。

一般来说,当 tcpdump 由于某种原因不能使用时,或者仅仅是因为这个人更熟悉的原因,有很多关于使用 strace 来调试网络问题的故事。

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

比如说:

  • 同样的二进制文件在一台机器上可以运行,但在另一台机器上却不能运行
  • 当你运行它时可以成功,当被 systemd 单元文件开启时却失败了
  • 当你运行它时可以成功,以 “su - user /some/script” 的方式运行时失败。
  • 当你运行它时可以成功,作为定时任务运行时失败。

能够比较两种情况下的 strace 输出是非常有用的。虽然我在调试 “这东西以我的用户身份可以运行,而在同一台电脑上以不同方式运行时失败”时,第一步会是 “看看我的环境变量”。

问题 10: 这个 Linux 内核 API 是如何工作的?

另一个不少人提到的问题是弄清楚一个 Linux 内核 API(例如 netlink, io_uring, hdparm, I2C 等)是如何工作的。

尽管这些 API 通常都有文档,但有时文档是混乱的,或者没有很多例子,所以通常更容易的是直接跟踪一个现有的应用程序,看看它是如何与 Linux 内核交互的。

问题 11: 普遍的逆向工程

strace 也很适合于普遍的弄清楚 “这个程序是如何工作的?”。作为一个简单的例子,这里有一篇关于使用 strace 弄清 killall 如何工作的文章。

我在做什么:慢慢建立一些挑战

我思考这个问题的原因是,我一直在慢慢建立一些挑战,帮助人们练习使用 strace 和其他命令行工具。这个想法是,给你一个要解决的问题,一个终端,你可以自由地以任何方式解决它。

因此,我的目标是利用这一点来建立一些你可以用 strace 解决的练习问题,这些问题反映了人们在现实生活中实际使用它的各种问题。

以上就是全部!

可能还有更多的问题可以用 strace 来解决,而我在这里没有涉及到 - 我很想听听我遗漏了什么!

我真的很喜欢看到许多相同的用途一次又一次地出现 - 至少有20个不同的人回答说他们用 strace 来寻找配置文件。像往常一样,我认为这样一个简单的工具(”跟踪系统调用!”)可以用来解决这么多不同类型的问题,真是令人高兴。

本文作者 : meow
This blog is under a CC BY-NC-SA 4.0 Unported License
本文链接 : https://translation.meow.page/post/what-problems-do-people-solve-with-strace/

本文最后更新于 天前,文中所描述的信息可能已发生改变