我如何在gdb中的“打印到终端上的东西”中加上断点?

时间:2009-10-08 15:11:44

标签: gdb printf breakpoints conditional-breakpoint

我想知道巨大的应用程序里面的某个消息是打印出来的。应用程序是如此庞大和陈旧,它使用所有可能的方式将文本打印到终端;例如printf(),fprintf(stdout,...)等。

我写了在write()系统调用上设置了一个断点,但是由于使用write()的各种文件I / O操作,我遇到了太多的断点停止。

所以基本上我希望gdb在程序向终端输出内容时停止,但同时我不希望gdb在程序向文件写入内容时停止。

2 个答案:

答案 0 :(得分:26)

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

(gdb)b写1 == $ rdi

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

硬件平台之间的差异很大。

答案 1 :(得分:12)

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

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

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