我想知道巨大的应用程序里面的某个消息是打印出来的。应用程序是如此庞大和陈旧,它使用所有可能的方式将文本打印到终端;例如printf(),fprintf(stdout,...)等。
我写了在write()系统调用上设置了一个断点,但是由于使用write()的各种文件I / O操作,我遇到了太多的断点停止。
所以基本上我希望gdb在程序向终端输出内容时停止,但同时我不希望gdb在程序向文件写入内容时停止。
答案 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编号