小编Ale*_*x Z的帖子

如何在GDB中为open(2)syscall返回-1设置断点

操作系统: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中的系统调用(例如)返回?

作为当前的解决方法,我执行以下操作:

  1. 在GDB下运行有问题的程序
  2. 从另一个终端启动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)
  3. 之后open(2)返回-1我收到SIGSTOP在GDB会话,我可以调试问题.

TIA.

最好的问候,
亚历克斯.

UPD:即使我之前尝试过nm建议的方法并且无法使其工作,我还是决定再试一次.2小时后,它现在按预期工作.但有一些奇怪的解决方法:

  1. 我仍然无法区分调用和从syscall返回
  2. 如果我使用finishin comm我无法使用continue,根据GDB文档即可,
    即以下内容确实会在每次中断时降至gdb提示符:

    gdb> comm
    gdb> finish …
    Run Code Online (Sandbox Code Playgroud)

c gdb systemtap

20
推荐指数
2
解决办法
6694
查看次数

标签 统计

c ×1

gdb ×1

systemtap ×1