使用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)
答案 0 :(得分:0)
调试器中的这种行为是一种“GIGO”情况 - 也就是说,通常gdb正在执行调试信息告诉它要做的任何事情。也就是说,当存在奇怪的行为时,通常是由编译器做出的决定。它可能是一个错误,可能值得一个错误报告,但如果由于某种原因打算以这种方式工作,我也不会感到惊讶。
您可以使用readelf
或objdump
检查线路表来调查此类问题。