当我运行一个可执行文件时,我看到一个字符串被输出到我的终端。我有可执行文件的源代码(C 语言),但它不是我写的。我用 -g 标志编译它。有什么方法可以通过 dtrace、lldb、gdb 或任何其他方式知道哪个文件中的哪一行导致了输出?
我使用的是 macOS 10.13。当我运行 gdb 和以下内容时:catch syscall write
我收到此错误:此架构尚不支持“catch syscall”功能。
有什么方法可以实现我的目标吗?
当我运行一个可执行文件时,我看到一个字符串被输出到我的终端。我有可执行文件的源代码(C 语言),但它不是我写的。我用 -g 标志编译它。有什么方法可以通过 dtrace、lldb、gdb 或任何其他方式知道哪个文件中的哪一行导致了输出?
我使用的是 macOS 10.13。当我运行 gdb 和以下内容时:catch syscall write
我收到此错误:此架构尚不支持“catch syscall”功能。
有什么方法可以实现我的目标吗?
您可以使用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没有。我想我会留下答案。