我想知道在一个巨大的应用程序里面打印某个消息.应用程序是如此庞大和陈旧,它使用所有可能的方式将文本打印到终端; 例如printf(),fprintf(stdout,...)等.
我写了在write()系统调用上设置了一个断点,但是由于使用write()的各种文件I/O操作,我遇到了太多的断点停止.
所以基本上我希望gdb在程序向终端输出内容时停止,但同时我不希望gdb在程序向文件写入内容时停止.
操作系统:GNU/Linux发行版
:OpenSuSe 13.1
Arch:x86-64
GDB版本:7.6.50.20130731-cvs
程序语言:主要是带有少量汇编的C语言
想象一下,我有一个相当大的程序,有时无法打开文件.是否可以在GDB中设置断点,使其在open(2)syscall返回-1 后停止?
当然,我可以通过源代码查找并查找所有open(2)调用并缩小错误open()调用,但也许有更好的方法.
我试图用"catch syscall open"然后"condition N if $rax==-1"但显然它并没有被击中.
顺便说一句,是否可以区分对系统调用(例如open(2))的调用和从open(2)GDB中的系统调用(例如)返回?
作为当前的解决方法,我执行以下操作:
从另一个终端启动systemtap脚本:
stap -g -v -e 'probe process("PATH to the program run under GDB").syscall.return { if( $syscall == 2 && $return <0) raise(%{ SIGSTOP %}) }'
Run Code Online (Sandbox Code Playgroud)open(2)返回-1我收到SIGSTOP在GDB会话,我可以调试问题.TIA.
最好的问候,
亚历克斯.
UPD:即使我之前尝试过nm建议的方法并且无法使其工作,我还是决定再试一次.2小时后,它现在按预期工作.但有一些奇怪的解决方法:
如果我使用finishin comm我无法使用continue,根据GDB文档即可,
即以下内容确实会在每次中断时降至gdb提示符:
gdb> comm
gdb> finish …Run Code Online (Sandbox Code Playgroud)最近我正在研究操作系统.我只想知道:
系统调用(如write())和标准库函数(如printf())之间有什么区别?