操作系统: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)