使用 dtrace、lldb 或 gdb 查找哪个文件或代码行负责 stdout 或 stderr 中的一行输出?

逆向工程 数据库 数据库
2021-07-02 19:50:51

当我运行一个可执行文件时,我看到一个字符串被输出到我的终端。我有可执行文件的源代码(C 语言),但它不是我写的。我用 -g 标志编译它。有什么方法可以通过 dtrace、lldb、gdb 或任何其他方式知道哪个文件中的哪一行导致了输出?

我使用的是 macOS 10.13。当我运行 gdb 和以下内容时:catch syscall write

我收到此错误:此架构尚不支持“catch syscall”功能。

有什么方法可以实现我的目标吗?

1个回答

您可以使用strace

strace --instruction-pointer --stack-traces -e write ./your-app

这将显示二进制文件中的位置,例如:

[00007fe942df6537] write(1, "c", 1c)     = 1
 > /usr/lib64/libc-2.31.so(write+0x17) [0xf2537]
 > /usr/lib64/libc-2.31.so(_IO_file_write@@GLIBC_2.2.5+0x2c) [0x8285c]
 > /usr/lib64/libc-2.31.so(new_do_write+0x65) [0x81b95]
 > /usr/lib64/libc-2.31.so(_IO_do_write@@GLIBC_2.2.5+0x18) [0x83948]
 > /usr/lib64/libc-2.31.so(_IO_file_sync@@GLIBC_2.2.5+0xa7) [0x819b7]
 > /usr/lib64/libc-2.31.so(_IO_fflush+0x85) [0x76595]
 > /tmp/a.out(main+0x62) [0x4011a8]
 > /usr/lib64/libc-2.31.so(__libc_start_main+0xf1) [0x27041]
 > /tmp/a.out(_start+0x2d) [0x40108d]

这意味着 0x4011a8 (main+0x62)。您可以使用您最喜欢的反汇编程序来判断代码中的哪个位置。

编辑:哦,该死,我没有意识到stracemacOS没有我想我会留下答案。