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