【发布时间】:2015-04-30 21:24:19
【问题描述】:
使用为使用 g++ 进行调试而构建的 C++ 代码(即选项“-O0 -ggdb”)并使用最新的 gcc (5.1.0) 和 gdb (7.9) 时,gdb 中源代码的显示仍然非常非线性使用“下一步”命令。举个例子,这个函数调用可能会通过一个“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| );
所以它与“不同行上的每个函数调用都是一个步进点”相关但并不那么简单。这与递归函数中的断点尤其令人困惑,我发现自己检查调用堆栈以查看它是否真的是一个新的调用或只是一个虚假的后退步骤。
由于重排所有 LLVM 源以在一行中包含函数调用并不是一个真正可行的选择,是否有一些 gcc/gdb 选项来控制这种行为?
编辑:现在使用 clang 3.5 和 lldb 3.5 检查:使用 clang 构建时,只会出现三个“下一个”。 gdb 和 lldb 在任何一种情况下都会看到相同的“下一个”行为(即 4 与 gcc,3 与 clang)
【问题讨论】: