避免源级"跳跃"在gdb中

时间:2015-04-29 10:52:41

标签: debugging gcc gdb

使用g ++(即选项" -O0 -ggdb")构建C ++代码并使用最新的gcc(5.1.0)和gdb(7.9),gdb中的源代码显示仍然是使用" next"时非常不线性命令。作为一个例子,这个函数调用可能会通过单个" next":

逐步执行
7757|   SDValue NewRoot = TLI->LowerFormalArguments(
7758|      DAG.getRoot(), F.getCallingConv(), F.isVarArg(), Ins, dl, DAG, InVals);

然而它需要四个,显示的执行行首先是7757,然后是7758,然后是7757,然后是7758.如果函数调用被压缩为一行,那么只需要一个" next"需要。如果通话被荒谬地夸大,则需要七个"接下来的#(显示为'#'注释)

       7757|   SDValue
       7758| NewRoot
       7759| =
  #1,6 7760| TLI
       7761| ->
       7762| LowerFormalArguments(
    #5 7763|       DAG.getRoot(),
       7764| F.getCallingConv(),
    #3 7765| F.isVarArg(),
       7766| Ins,
       7767| dl,
       7768| DAG,
       7769| InVals
#2,4,7 7770| );

所以它与#34相关但不那么简单;在不同的行上的每个函数调用都是一个步骤"。这在递归函数中的断点尤其令人困惑,我发现自己检查了callstack,看它是否真的是一个新的调用,或者只是一个虚假的向后步骤。

由于回流所有LLVM源以在一行中包含函数调用并不是一个可行的选项,是否有一些gcc / gdb选项可用于控制此行为?

编辑:现在用clang 3.5和lldb 3.5检查:当用clang构建时只有三个"下一个" s发生。并且gdb和lldb看到相同的" next"在任何一种情况下的行为(即4与gcc,3与clang)

1 个答案:

答案 0 :(得分:0)

调试器中的这种行为是一种“GIGO”情况 - 也就是说,通常gdb正在执行调试信息告诉它要做的任何事情。也就是说,当存在奇怪的行为时,通常是由编译器做出的决定。它可能是一个错误,可能值得一个错误报告,但如果由于某种原因打算以这种方式工作,我也不会感到惊讶。

您可以使用readelfobjdump检查线路表来调查此类问题。