【问题标题】:How do debuggers get line numbers of commands?调试器如何获取命令的行号?
【发布时间】:2011-02-06 06:26:44
【问题描述】:

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

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

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

【问题讨论】:

  • 这是用于发布构建代码吗?是的,这些行不会生成任何代码,例如函数体被翻译成 DoSomething(g+1)。
  • 不,只是调试构建...

标签: c++ debugging line-numbers


【解决方案1】:

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

【讨论】:

  • 但据我了解,这些函数给了我行号的地址。我想反过来。
【解决方案2】:

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

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

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

【讨论】:

  • 那么您可以尝试使用这些 pdb,这也是调试器所做的。 No pdb:没有源代码级调试,不匹配 pdb:则突出显示的行与正在调试的程序中的当前状态不匹配。 Pdbs 明确包含您需要的信息。但它不是一种开放格式。 msdn.microsoft.com/en-us/library/yd4f8bd1(v=VS.90).aspx
猜你喜欢
  • 1970-01-01
  • 2011-05-11
  • 2013-02-09
  • 1970-01-01
  • 1970-01-01
  • 2019-09-08
  • 1970-01-01
  • 2015-05-25
  • 2014-07-31
相关资源
最近更新 更多