【问题标题】:GDB breakpoints confused after a function call?函数调用后 GDB 断点混淆?
【发布时间】: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


【解决方案1】:

vfork(2)exec(2) 的组合搞砸了。引用自 gdb 手册 (debugging forks):

在某些系统上,当vfork 生成子进程时,在exec 调用完成之前,您无法调试子进程或父进程。
...
默认情况下,在执行exec 调用后,gdb 会丢弃前一个可执行映像的符号。您可以使用 set follow-exec-mode 命令更改此行为。


follow-fork-mode 设置为parent 并将follow-exec-mode 设置为same

或者,如果您的安装支持多进程调试(它应该支持多进程调试,因为您的gdb 版本是 7.1),请尝试使用 info inferiors 找到您的原始进程并使用 inferior <num> 切换到它。

【讨论】:

  • 非常感谢您花时间回答我的问题!我检查了我的 gdb 配置,follow-fork-mode 和 follow-exec-mode 已经按照您建议的默认方式设置:/。如果我切换配置以跟随孩子,它会在 fork 或 exec 或其他东西之后中断,但如果我尝试切换回调试父级(使用劣质 )它没有执行上下文。它甚至不认为它正在运行!
  • "在某些系统上,gdb 支持使用 fork 或 vfork 函数创建附加进程的调试程序。目前,具有此功能的唯一平台是 HP-UX(仅 11.x 及更高版本? ) 和 gnu/Linux(内核版本 2.5.60 及更高版本)。”我使用的是 gdb 7.1,但内核版本是 2.4:/ 也许这也导致了我的问题?
  • 所以我将问题追溯到 popen 调用的 vfork。显然 gdb 不适合 popen 吗?一旦我从弹出的 vfork 进程中分离出来,我就会丢失所有的符号。
  • 嗯,2.4 内核现在已经过时了。有机会升级到2.6系列吗?也可以尝试file 命令再次加载符号。
猜你喜欢
  • 1970-01-01
  • 2021-06-20
  • 2018-09-17
  • 1970-01-01
  • 2011-04-13
  • 2021-09-17
  • 2016-02-14
  • 1970-01-01
  • 2016-06-18
相关资源
最近更新 更多