【发布时间】:2010-07-15 19:37:21
【问题描述】:
我有一个依赖于外部共享库的程序,但是在执行库中的函数后,我失去了使用断点的能力。
在我执行这个函数之前,我可以像往常一样中断和步进,但之后它完成它永远不会中断。如果我第二次尝试使用start 执行程序,它甚至不会中断主程序。这不是内联函数问题,因为我之前已经破坏了这些函数,当我注释掉这个特定函数时,一切又开始工作了。
有没有人遇到过这样的事情?我能做什么?
将 gdb 7.1 与 gcc 3.2.3 一起使用
编辑: 经过用户的一些提示后,我发现该过程正在库调用内部分叉。我不确定它在做什么(我真的不在乎)。我能以某种方式弥补这一点吗?我小时候一直在尝试跟随分叉模式,但我真的很困惑一旦分叉会发生什么,我似乎无法弄清楚如何继续执行或做任何有用的事情。
编辑: 进一步的调查。我能说的最接近的是,gdb 在某处丢失了所有符号信息。在第二次运行之后,所有符号都解析为 @plt 地址,而不是它们在第一次运行时解析到的实际地址。就像以某种方式第二次加载该过程会丢失它第一次获得的所有信息并拒绝重新加载它。我很困惑!
编辑: 所以我将问题追溯到 popen 调用的 vfork 。显然 gdb 不适合 popen 吗?一旦我从 popen'd vfork 进程中分离出来,我就会失去所有的符号。我也在网上阅读了一些关于此的报道。 还有希望吗?
【问题讨论】:
-
您的共享库是否产生了新进程?
-
也许你的图书馆调用 somwhow 最终退出你的调用应用程序?
-
gcc 3.2.3 已经很老了,什么平台? Linux?
-
平台是linux(一个redhat EL3 box)。 vfork is 在库例程中的某处调用。当我将 gdb 中的 follow-mode 设置为 child 时,它的行为会有所不同。
-
@jdizzle:这就是正在发生的事情。谜团已揭开;您的断点适用于当前进程,并且不会被孩子神奇地继承。
标签: gdb breakpoints