代码之家  ›  专栏  ›  技术社区  ›  Peeter Joot

设置gdb出口断点不起作用?

  •  17
  • Peeter Joot  · 技术社区  · 16 年前

    我在exit和exit上设置了断点,我的程序(在linux 2.6.16.46-0.12 sles10上运行的多线程应用程序)仍然以某种我无法定位的方式退出

    (gdb) c
    ...
    [New Thread 47513671297344 (LWP 15279)]
    [New Thread 47513667103040 (LWP 15280)]
    [New Thread 47513662908736 (LWP 15281)]
    
    Program exited with code 0177.
    (gdb)
    

    exit函数位于libc中,因此不存在延迟加载共享库问题。有人知道其他一些无法抓到的神秘的出口触发装置吗?

    编辑:这个问题现在只是学术性的。我尝试了二进制搜索调试,放弃了一部分更改(问题消失了)。在我按顺序再次应用它们之后,我就不能再重新处理这个问题了,即使事情已经恢复到原来的状态。

    edit2:我最近发现了这种错误的一个原因,它可能是这个问题的原始来源。出于历史原因,我们的产品使用邪恶的链接器标志-bsymbolic。其中的一个副作用是,当一个符号未定义但被调用时,glibc运行时链接器将以这种方式进行轰炸,您在调试器中看到它是一个使用0177退出的进程。当运行时链接器以这种方式中止时,我想它会直接对退出进行系统调用(而不是使用c runtime library exit()或退出())。这与我无法用调试器中的出口断点捕获此问题的事实是一致的。

    3 回复  |  直到 11 年前
        1
  •  24
  •   Parthian Shot Roushan    11 年前

    有两个共同的原因 _exit 断点为“未命中”--或者 GDB 没有在正确的位置设置断点,或者程序执行(道德上等同于) syscall(SYS_exit, ...)

    做什么 info break 和 disassemble _exit 说什么?

    你也许能说服 GDB 正确设置断点 break *&_exit . 或者, GDB-7.0 支架 catch syscall . 这样的事情应该有效(假设 Linux/x86_64 ;请注意 ix86 无论程序如何退出,数字都会有所不同:

    (gdb) catch syscall 60
    Catchpoint 3 (syscall 'exit' [60])
    (gdb) catch syscall 231
    Catchpoint 4 (syscall 'exit_group' [231])
    (gdb) c
    
    Catchpoint 4 (call to syscall 'exit_group'), 0x00007ffff7912f3d in _exit () from /lib/libc.so.6
    

    更新:
    您的注释指示已正确设置了退出断点,因此您的进程可能没有执行 出口处 .

    那叶子 系统调用(系统退出…) 还有一种可能性(我之前错过了):所有线程都在执行 pthread_exit . 您可能希望在上设置断点 邮戳出口 以及(和执行 info thread 每次点击它——最后一个要做的线程 邮戳出口 将导致进程终止)。

    编辑:

    同样值得注意的是,您可以使用助记键名称,而不是系统调用编号。您还可以同时向catch列表添加多个syscall,如下所示:

    (gdb) catch syscall exit exit_group
    Catchpoint 2 (syscalls 'exit' [1] 'exit_group' [252])
    
        2
  •  1
  •   DigitalRoss    16 年前

    在出口设置断点是个好主意。

    您也可以尝试静态链接,只是为了从表中去掉一堆潜在的gdb并发症。

    0177与 等待状态 wait(2) 回报 儿童停止 但是GDB正在打印 退出状态 这是另一回事,所以这可能是一个真正的退出论点。

        3
  •  1
  •   Zbigniew Zagórski    16 年前

    可能是在加载到进程中的某个共享库中有一些未解析的惰性引用。我有一个完全相同的情况,“某个人”退出了进程,这似乎是未解决的参考。

    使用“ldd-r”选项检查您的流程。

    看起来像是ld.so或者其他什么东西,把一些符号懒散地解析成统一的出口函数(应该是abort imho)。

    我的情况:

    $ ldd ./program
    undefined symbol: XXXX  (/usr/lib/libYYY.so)
    
    $./program
    program: started! 
    ...
    <program is running regardless of undefined references>
    

    现在,当我调用了一些使用未定义函数的场景时,出现了exit。它总是以exitcode=127和gdb报告的0177退出。

    推荐文章