代码之家  ›  专栏  ›  技术社区  ›  jdizzle

函数调用后是否混淆了gdb断点?

  •  1
  • jdizzle  · 技术社区  · 14 年前

    我有一个依赖于外部共享库的程序,但是在库内的函数执行之后,我就失去了使用断点的能力。

    在执行这个函数之前,我可以像正常人一样中断和单步执行,但在完成之后,它永远不会中断。如果我试着用的话,它甚至不会在主机上坏掉。 start 第二次执行程序。这不是一个内联函数问题,因为我之前已经讨论过这些函数,当我评论这个特殊的函数时,一切都会重新开始工作。

    以前有人遇到过这样的事情吗?我能做什么?

    使用gdb 7.1和gcc 3.2.3

    编辑: 从用户那里得到一些提示后,我发现这个过程在库调用中是分叉的。我不知道它在做什么(我真的不在乎)。我能补偿这个吗?作为孩子,我一直在尝试follow fork模式,但我真的很困惑,一旦它分叉了会发生什么,我似乎不知道如何继续执行或做任何有用的事情。

    编辑: 进一步调查。据我所知,gdb在某个地方丢失了所有的符号信息。第二次运行后,所有符号解析为@plt地址,而不是第一次运行时解析为的实际地址。就像第二次加载进程一样,它会丢失第一次获得的所有信息,并拒绝重新加载。我很困惑!!

    编辑: 所以我把这个问题追溯到一个波本电话的工作上。显然GDB对波本不好?一旦我脱离了波本的工作流程,我就失去了所有的符号。我也在网上读过一些关于这个的报道。 有什么希望吗 ?

    1 回复  |  直到 14 年前
        1
  •  1
  •   Nikolai Fetissov    14 年前

    它是 vfork(2) exec(2) 这把事情搞砸了。引用 gdb 手动(手动) debugging forks ):

    在某些系统上,当子进程由 vfork ,您无法调试子级或父级,直到 exec 调用完成。

    默认情况下,在 执行程序 调用执行,gdb丢弃上一个可执行映像的符号。你可以改变这种行为 follow-exec-mode 命令。


    保持 follow-fork-mode 设置为 parent 并设置 遵循执行模式 same .

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