我怎么可以把一个断点“的东西被打印到终端”在gdb?
-
20-09-2019 - |
题
我想从内部的巨大的被打印,其中应用某个消息就知道了。该应用程序是如此之大,老,它使用文本打印到终端的所有可能的方式;例如printf()的,fprintf中(标准输出,...)等等。
我写把一个断点在write()系统调用,但然后我用,因为各种文件使用write(I / O操作的太多断点停止淹没)为好。
所以基本上我想用gdb停止每当程序打印一些东西到终端,但在同一时间,我不想GDB停止时,程序写的东西到一个文件中。
解决方案
使用条件断点,检查第一个参数。在64位x86系统的条件将是:
(GDB)b记录如果1 == $ RDI
在32位系统中,这是比较复杂的,因为该参数是在栈上,这意味着你需要ESP投$为int *和指数的FD参数。在该点的堆叠具有返回地址,长度,缓冲器和最后的fd。
此硬件平台之间变化很大。
其他提示
使用GDB 7.0,则可以设置在系统调用写条件断点():
(gdb) catch syscall write
Catchpoint 1 (syscall 'write' [4])
(gdb) condition 1 $ebx==1
$ EBX包含第一系统调用参数 - 此处FD数目
不隶属于 StackOverflow