当前位置: 首页 > 面试题库 >

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

陈铭晨
2023-03-14
问题内容

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

(gdb)c
...
[新线程47513671297344(LWP 15279)]
[新线程47513667103040(LWP 15280)]
[新线程47513662908736(LWP 15281)]

程序退出,代码为0177。
(gdb)

退出函数驻留在libc中,因此没有延迟的负载共享库问题。有人知道其他无法捕获的神秘触发吗?

编辑:问题现在仅是学术性的。我尝试了二进制搜索调试,撤消了部分更改(问题消失了)。再次按顺序应用它们之后,即使恢复到原始状态,我也无法再解决问题。

EDIT2:我最近发现了这种错误的一个原因,这可能是此问题的原始出处。由于历史原因,我们的产品使用了邪恶的链接器标志-
Bsymbolic。这样做的副作用之一是,当一个符号未定义但被调用时,GLIBC运行时链接程序将以这种方式轰炸,您会在调试器中将其视为进程以0177退出。当运行时链接程序以这种方式中止时,我猜想它会使syscall直接调用_exit(而不是使用C运行时库exit()或_exit())。这与我无法通过调试器中的退出断点捕捉到这一事实是一致的。


问题答案:

_exit断点“丢失”的常见原因有两个-要么GDB未将断点设置在正确的位置,要么程序执行了(在道德上等效)syscall(SYS_exit, ...)

什么info breakdisassemble _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

更新:
您的注释表明_exit断点设置正确,因此您的进程很可能没有执行_exit

这留下syscall(SYS_exit, ...)了另一种可能性(我之前没有提到过):所有线程正在执行pthread_exit。您可能还希望在其上设置一个断点pthread_exit(并在info thread每次单击该断点时执行-最后一个线程执行pthread_exit将导致进程终止)。

编辑:

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

(gdb) catch syscall exit exit_group
Catchpoint 2 (syscalls 'exit' [1] 'exit_group' [252])


 类似资料:
  • 问题内容: 我正在使用python 2.7.2,sqlalchemy 0.7,unittest,eclipse 3.7.2和pydev 2.4进行项目。我正在python文件(单元测​​试文件)中设置断点,但是它们被完全忽略了(在某些时候,它们起作用了)。到现在为止,我已经升级了所有相关软件(参见上文),开始了新项目,使用设置进行播放,将屏幕催眠,但是没有任何效果。 我从某篇文章中得到的唯一想法是

  • 问题内容: 我正在使用Java 8(内部版本1.8.0_25),Netbeans 8.0.2,并将Java 8的某些功能合并到现有应用程序中。排序和.forEach无法正常工作,因此我创建了一些测试代码以确保我了解lambda等,并诊断出问题。以下是新代码以及与我的系统中的数据进行交互的代码的组合: 注册是一个POJO,反映事件的数据,其中包括一个RegistrationItem(s)列表,这是另

  • 我有一个工作流,它执行一系列模糊测试,最后计算所有崩溃程序子目录中的文件总数。后来,在另一份工作中,我使用该号码向Slack发送通知。但是,由于某些原因,不会产生任何输出,最重要的是,即使崩溃程序的数量不是零,下一个作业也不会运行! 有人知道我做错了什么吗?谢谢!

  • 问题内容: 我正在尝试编写一个断言,以检查用户提供的大小是否为正值,如果不是,则使其为正,此语句位于类构造函数内部,该类构造函数采用大小值,然后生成array [size]。我写了下面的代码,我认为是正确的。 尽管我似乎从未评估过我的断言并继续执行程序,但会导致NegativeArraySize错误(我正在尝试避免) 我也尝试过 并且程序无法停止为负值。 我最近在Mac上运行Java时遇到了一些问

  • 问题内容: 一个较早的问题解释说,在x86上,要监视的对象的大小受调试寄存器的限制。不出所料,我可以“观看”一个双变量。但例如,我看不到双重数据成员, 产生 但是当您尝试继续执行时,它说 无法插入硬件断点:您可能请求了太多的硬件断点/观察点。 即使这是 唯一的 断点/观察点。 我很好奇为什么会这样,但更重要的是有没有办法解决?根据GDB文档,如果不能使用硬件,则可以使用软件观察点。在这种情况下,它

  • 使用断点来暂停JavaScript代码,审查变量的值和在特定时刻所调用的堆栈。 一旦你设置了断点,你应该学习如何遍历你的代码,并审查你的变量和调用堆栈。 TL;DR 设置断点的最基本的方法是在特定的代码行上手动添加一个断点。您也可以将这些断点配置为仅在满足特定条件时触发。 您还可以设置在满足一般条件时触发的断点,例如事件,DOM更改或未捕获异常。 在代码特定行上设置断点 当您知道要审查的语句时,在