【问题标题】:How to make strace print addresses of string arguments instead of just their values?如何使字符串参数的 strace 打印地址而不仅仅是它们的值?
【发布时间】:2014-03-16 03:42:44
【问题描述】:

我正在尝试使用strace 来了解二进制程序如何使用内存。

但是,strace 的默认输出为了更加用户友好,会将任何 char * 缓冲区打印为相应的字符串。

read(3, "Tell me, Muse, of that man of ma"..., 4096) = 270

有没有办法告诉strace 在其内容旁边打印字符串的实际地址?

如果不能同时拥有两者,只打印字符串的地址而不是截断的内容也可以。

【问题讨论】:

  • 我认为这不是 strace(1) 的用途。您可能想看看 ltrace 和 gdb。
  • 也许它不受支持,但我看不出我所描述的内容超出了 strace 的范围。它已经完成了这项工作,但没有以我需要的格式打印信息。我已经检查过 ltrace 并且它具有相同的行为(即 char * 缓冲区被打印为字符串)。 gdb 用于交互式调试,这不是我想要的。

标签: linux debugging reverse-engineering strace


【解决方案1】:

-e raw=read 应该已经做你想做的事了。应该不需要修改源代码。

broadway@creepspread:~% strace -e raw=read ls 2>&1|grep ^read
读取(0x3,0x7fff5ea52e78,0x340)= 0x340
读取(0x3,0x7fff5ea52e48,0x340)= 0x340
读取(0x3,0x7fff5ea52e18,0x340)= 0x340
读取(0x3,0x7fff5ea52de8,0x340)= 0x340
读取(0x3,0x7fff5ea52ca8,0x340)= 0x340
读取(0x3,0x7fff5ea52c48,0x340)= 0x340
读取(0x3,0x7fff5ea52c18,0x340)= 0x340
读取(0x3,0x7fef1433f000,0x400)= 0x136
读取(0x3, 0x7fef1433f000, 0x400) = 0

【讨论】:

  • 很高兴知道这一点。尽管如此,在调试时,知道什么和在哪里是很有用的。默认情况下,strace 只向您显示写入的内容。使用此选项,它只会向您显示写入的位置。通过我的补丁所做的修改,它向您展示了这两个:read(3, 0x9118000:"This is strace, a system call tr​​"..., 32768) = 592
  • -e raw=read -e read=all 显示读取系统调用的未解码数据以及读取内容的十六进制转储。 -e read 的参数是一个文件描述符列表,所以你可以这样过滤它。
【解决方案2】:

您可以下载the source of strace并将所有这些tprintf("%s", ...)修改为tprintf("%p", ...),并构建strace的本地副本。

【讨论】:

  • 源修改是一个选项。我正在对此进行调查,但它比看起来要复杂一些。
  • 期待您分享您对此问题的解决方案。
  • 我为此目的制作了这个补丁:gist.github.com/m000/9240954 添加命令行开关来打开或关闭此行为应该相当容易。但除非 strace 维护者有兴趣将其合并到主干,否则不值得麻烦。
  • @m000 太好了,你的补丁看起来不错。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-10
相关资源
最近更新 更多