调试器如何获得命令行数?

时间:2011-02-06 06:26:44

标签: c++ debugging line-numbers

我正在尝试使用symgetlinefromaddr64获取我在stackwalk中收集的地址的行号,但我似乎无法获取简单命令或其行的地址。
例如,如果我正在查看方法:

void Test(int g)
{
  g++;
  DoSomething(g);
  g--;
}

我只会获得“DoSomething”的行号,但我想要“g ++”等行号。 我认为它是可行的,因为调试器会这样做。 我怎么能在Windows上的c ++中自己做?

2 个答案:

答案 0 :(得分:0)

堆栈遍历只会检索存储在堆栈中的地址,这几乎意味着函数调用。如果您需要g++g--的地址,则需要使用堆栈步行以外的其他内容来获取它们(例如SymGetFileLineOffsets64)。如果您从Stackwalk开始并获得SymGetLineFromAddr64的信息,则可以使用SymGetLineNext64SymGetLinePrev64获取有关周围行的信息。

答案 1 :(得分:0)

唯一的方法是使用编译器生成的符号文件,例如用于microsoft visual studio编译器的*.pdb文件(pdb代表程序数据库)。这些文件包含编译步骤中使用的所有符号。即使对于发布编译,您也会获得有关正在使用的符号的信息(有些可能已被优化掉)。

主要缺点是这是高度依赖编译器的/特定的。例如,gcc可以在可执行文件或可执行文件中包括符号信息。其他编译器有其他格式......

您使用什么编译器(名称/版本)?