【问题标题】:How to convert a function address to a symbol如何将函数地址转换为符号
【发布时间】:2012-12-12 14:02:38
【问题描述】:

假设我有一个这样的程序

// print-addresses.cpp
#include <stdio.h>

void foo() { }

void bar() { }

void moo() { }

int main(int argc, const char** argv) {
  printf("%p\n", foo);
  printf("%p\n", bar);
  printf("%p\n", moo);
  return 0;
}

它会打印一些数字,例如

013510F0
013510A0
01351109

如何将这些数字转换回正确的符号?实际上,我希望能够做到这一点

print-addresses > address.txt
addresses-to-symbols < address.txt

然后打印出来

foo
bar
moo

我知道这与Debug Interface Access SDK 有关,但我并不完全清楚我是如何从地址变为符号的。

【问题讨论】:

    标签: windows debugging symbols debug-symbols


    【解决方案1】:

    这似乎正是您要查找的内容:Retrieving Symbol Information by Address。这使用 DbgHelp.dll 并依赖于调用 SymFromAddr。您必须(我认为)从正在运行的应用程序中执行此操作,或者通过读取 minidump 文件来执行此操作。

    您也可以使用 DIA,但调用顺序有点复杂。致电IDiaDataSource::loadDataForExeIDiaDataSource::openSession 获取IDiaSession,然后调用IDiaSession::getSymbolsByAddr 获取IDiaEnumSymbolsByAddr。然后,IDiaEnumSymbolsByAddr::symbolByAddr 将让您按地址查找符号。还有一种方法(如最后一个链接的示例所示)枚举所有符号。

    编辑: 这个 DIA 示例应用程序可能是使用 DIA 的一个很好的起点:http://msdn.microsoft.com/en-us/library/hd8h6f46%28v=vs.71%29.aspx。特别检查使用IDiaEnumSymbolsByAddr的部分。

    您还可以解析 dumpbin 的输出,可能使用 /SYMBOLS 或 /DISASM 选项。

    【讨论】:

    • 据我所知,这些解决方案都没有真正回答这个问题。我碰巧知道dumpbin中的数据是不够的。您的第一个答案需要在原始程序中运行。中间的答案可能有效,但不清楚。
    • @gman:对不起,你能告诉我中间答案有什么不清楚的地方吗?第一个答案确实在程序外部工作,您只需要生成一个小型转储文件并加载它。
    【解决方案2】:

    如果你在linux,你可以试试addr2line

    addr2line addr -e execuablebin -f
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-09
      • 2011-02-16
      • 2021-10-15
      • 1970-01-01
      • 2023-03-03
      相关资源
      最近更新 更多