我正在尝试使用symgetlinefromaddr64获取我在stackwalk中收集的地址的行号,但我似乎无法获取简单命令或其行的地址。
例如,如果我正在查看方法:
void Test(int g)
{
g++;
DoSomething(g);
g--;
}
我只会获得“DoSomething”的行号,但我想要“g ++”等行号。 我认为它是可行的,因为调试器会这样做。 我怎么能在Windows上的c ++中自己做?
答案 0 :(得分:0)
堆栈遍历只会检索存储在堆栈中的地址,这几乎意味着函数调用。如果您需要g++
或g--
的地址,则需要使用堆栈步行以外的其他内容来获取它们(例如SymGetFileLineOffsets64
)。如果您从Stackwalk开始并获得SymGetLineFromAddr64
的信息,则可以使用SymGetLineNext64
和SymGetLinePrev64
获取有关周围行的信息。
答案 1 :(得分:0)
唯一的方法是使用编译器生成的符号文件,例如用于microsoft visual studio编译器的*.pdb
文件(pdb代表程序数据库)。这些文件包含编译步骤中使用的所有符号。即使对于发布编译,您也会获得有关正在使用的符号的信息(有些可能已被优化掉)。
主要缺点是这是高度依赖编译器的/特定的。例如,gcc可以在可执行文件或可执行文件中包括符号信息。其他编译器有其他格式......
您使用什么编译器(名称/版本)?