调试器如何获取命令的行号?
我正在尝试使用 symgetlinefromaddr64 获取在 stackwalk 中收集的地址的行号,但我似乎无法获取简单命令或其行的地址。
例如,如果我正在查看该方法:
void Test(int g)
{
g++;
DoSomething(g);
g--;
}
我只会得到“DoSomething”的行号,但我想要“g++”等的行号。 我认为这是可行的,因为调试器可以做到这一点。 我怎样才能在Windows上用C++自己做呢?
I'm trying to get line numbers of address I collected in a stackwalk by using symgetlinefromaddr64, but I can't seem to get addresses of simple commands or their lines.
for example, if i'm looking at the method:
void Test(int g)
{
g++;
DoSomething(g);
g--;
}
I'll get only the line number of "DoSomething", but I want the line numbers of "g++" etc.
I suppose it is doable because debuggers do it.
how can I do it myself in c++ on windows?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
堆栈遍历只会检索存储在堆栈上的地址,这几乎意味着函数调用。如果您想要
g++
或g--
的地址,则需要使用堆栈遍历以外的其他方法来获取它们(例如,SymGetFileLineOffsets64
)。如果您从 stackwalk 开始并从SymGetLineFromAddr64
获得信息,则可以使用SymGetLineNext64
和SymGetLinePrev64
获取有关周围线路的信息。A stack walk will only retrieve addresses that are stored on the stack, which pretty much means function calls. If you want the address of your
g++
org--
, you'll need to use something other than a stack walk to get them (e.g.,SymGetFileLineOffsets64
). If you're starting from a stackwalk and have info fromSymGetLineFromAddr64
, you can useSymGetLineNext64
andSymGetLinePrev64
to get information about the surrounding lines.唯一的方法是使用编译器生成的符号文件,例如 Microsoft Visual Studio 编译器的 *.pdb 文件(pdb 代表程序数据库)。这些文件包含编译步骤中使用的所有符号。即使对于发布编译,您也会获得有关正在使用的符号的信息(有些可能已被优化掉)。
主要缺点是这高度依赖于编译器/特定于编译器。例如,gcc 可以在可执行 so 文件或可执行文件中包含符号信息。其他编译器有其他格式...
您使用什么编译器(名称/版本)?
The only way to do it is to use compiler generated symbol files like the
*.pdb
files for microsoft visual studio compilers (pdb stands for program database). These files contain all symbols used during the compilation step. Even for a release compilation you'll get information about the symbols in use (some may have be optimized away).The main disadvantage is that this is highly compiler dependent/specific. gcc for example may include symbol information in the executable so-file or executable. Other compilers have other formats...
What compiler do you use (name/version)?