我有一个依赖于外部共享库的程序,但是在库中的函数被执行后,我失去了使用断点的能力。
在执行此功能之前,我可以像往常一样打破并步进,但之后它就完成了它永远不会中断。如果我第二次尝试使用start
执行程序,它甚至不会在main上断开。这不是一个内联函数问题,因为我在注释掉这个特定函数之前和之后都打破了这些函数,一切都开始重复了。
以前有没有遇到过这样的事情?我该怎么办?
将gdb 7.1与gcc 3.2.3一起使用
编辑: 在得到用户的一些提示之后,我发现该进程在库调用中分叉。我不确定它在做什么(我真的不在乎)。我可以以某种方式弥补这一点吗?我一直在尝试使用后叉模式作为孩子,但我真的很困惑,一旦它出现后会发生什么,我似乎无法弄清楚如何继续执行或做任何使用。
编辑: 进一步的调查。我能说的最近,gdb正在丢失所有符号信息。第二次运行后,所有符号都解析为@plt地址,而不是第一次运行时解析为的实际地址。就像某种程度上,第二次加载过程会丢失它第一次获得的所有信息,并拒绝重新加载它。我很困惑!!
编辑: 所以我把问题追溯到popen电话的vfork。显然gdb与popen不搭配?一旦我脱离了popen'd vforked进程,我就失去了所有的符号。我也在网上看过一些有关这方面的报道。 有希望吗?
答案 0 :(得分:1)
vfork(2)
和exec(2)
的组合使得事情搞得一团糟。引自gdb
手册(debugging forks):
在某些系统上,当vfork
生成子进程时,在exec
调用完成之前,您无法调试子进程或父进程。
...
默认情况下,执行exec
调用后,gdb会丢弃先前可执行映像的符号。您可以使用setfollow-exec-mode
命令更改此行为。
将follow-fork-mode
设置为parent
并将follow-exec-mode
设置为same
。
或者,如果您的安装支持多进程调试(因为gdb
版本为7.1),请尝试使用info inferiors
查找原始进程并使用{{1}切换到该进程}。