我想知道从一个巨大的应用程序内部的哪个位置打印出特定的消息。该应用程序又大又旧,以至于它使用所有可以想象的方式将文本打印到终端;例如 printf()、fprintf(stdout, ...) 等。
我写是为了在 write() 系统调用上放置一个断点,但是由于各种文件 I/O 操作也使用 write(),我被太多的断点停止所淹没。
所以基本上我希望gdb在程序向终端打印一些东西时停止,但同时我不希望gdb在程序向文件写入一些东西时停止。
我想知道从一个巨大的应用程序内部的哪个位置打印出特定的消息。该应用程序又大又旧,以至于它使用所有可以想象的方式将文本打印到终端;例如 printf()、fprintf(stdout, ...) 等。
我写是为了在 write() 系统调用上放置一个断点,但是由于各种文件 I/O 操作也使用 write(),我被太多的断点停止所淹没。
所以基本上我希望gdb在程序向终端打印一些东西时停止,但同时我不希望gdb在程序向文件写入一些东西时停止。
使用检查第一个参数的条件断点。在 64 位 x86 系统上,条件是:
(gdb) b 写如果 1==$rdi
在 32 位系统上,它更复杂,因为参数在堆栈上,这意味着您需要将 $esp 强制转换为 int * 并索引 fd 参数。此时的堆栈具有返回地址、长度、缓冲区,最后是 fd。
这在硬件平台之间差异很大。
使用 gdb 7.0,您可以在系统调用 write() 上设置条件断点:
(gdb) catch syscall write
Catchpoint 1 (syscall 'write' [4])
(gdb) condition 1 $ebx==1
$ebx 包含第一个系统调用参数 - 此处为 FD 编号