9

このようなプログラムがあるとしましょう

// 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と関係があることは知っていますが、アドレスからシンボルへの変換方法が完全にはわかりません。

4

2 に答える 2

8

これはまさにあなたが探しているもののようです: Retrifying Symbol Information by Address。これは DbgHelp.dll を使用し、 SymFromAddr の呼び出しに依存しています。実行中のアプリケーション内から、またはミニダンプファイルを読み取ることによって、それを行う必要があります (私はそう思います)。

DIA を使用することもできますが、呼び出しシーケンスはもう少し複雑です。IDiaDataSource ::loadDataForExeおよびIDiaDataSource::openSessionを呼び出してIDiaSessionを取得し、次にIDiaSession::getSymbolsByAddrを呼び出してIDiaEnumSymbolsByAddrを取得します。次に、IDiaEnumSymbolsByAddr::symbolByAddrを使用すると、アドレスでシンボルを検索できます。すべてのシンボルを列挙する方法 (最後のリンクの例を参照) もあります。

編集:この DIA サンプル アプリケーションは、DIA を使用するための出発点として適している可能性があります: http://msdn.microsoft.com/en-us/library/hd8h6f46%28v=vs.71%29.aspx。特に を使用している部分をチェックしてくださいIDiaEnumSymbolsByAddr

おそらく /SYMBOLS または /DISASM オプションを使用して、 dumpbinの出力を解析することもできます。

于 2013-01-04T07:52:31.440 に答える
1

Linux を使用している場合は、addr2line を試すことができます

addr2line addr -e execuablebin -f
于 2013-01-08T03:50:20.660 に答える