调试器如何获取命令的行号?

发布于 2024-10-16 08:28:56 字数 269 浏览 4 评论 0原文

我正在尝试使用 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

数理化全能战士 2024-10-23 08:28:56

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

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++ or g--, 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 from SymGetLineFromAddr64, you can use SymGetLineNext64 and SymGetLinePrev64 to get information about the surrounding lines.

蛮可爱 2024-10-23 08:28:56

唯一的方法是使用编译器生成的符号文件,例如 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)?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文