32

我想知道从一个巨大的应用程序内部的哪个位置打印出特定的消息。该应用程序又大又旧,以至于它使用所有可以想象的方式将文本打印到终端;例如 printf()、fprintf(stdout, ...) 等。

我写是为了在 write() 系统调用上放置一个断点,但是由于各种文件 I/O 操作也使用 write(),我被太多的断点停止所淹没。

所以基本上我希望gdb在程序向终端打印一些东西时停止,但同时我不希望gdb在程序向文件写入一些东西时停止。

4

2 回答 2

33

使用检查第一个参数的条件断点。在 64 位 x86 系统上,条件是:

(gdb) b 写如果 1==$rdi

在 32 位系统上,它更复杂,因为参数在堆栈上,这意味着您需要将 $esp 强制转换为 int * 并索引 fd 参数。此时的堆栈具有返回地址、长度、缓冲区,最后是 fd。

这在硬件平台之间差异很大。

于 2009-10-08T15:20:40.630 回答
17

使用 gdb 7.0,您可以在系统调用 write() 上设置条件断点:

(gdb) catch syscall write
Catchpoint 1 (syscall 'write' [4])
(gdb) condition 1 $ebx==1

$ebx 包含第一个系统调用参数 - 此处为 FD 编号

于 2010-01-06T20:09:41.463 回答