1

スタックから取得したアドレスからシンボルを取得しようとしていますが、SymFromAddrがシステムエラー126で失敗し続けます(指定されたモジュールが見つかりませんでした)

SymInitialize(m_processHandle, NULL, TRUE);

(最後のパラメーター== true ==> PDBを自動的にロードします)

そして私はこのようにSymFromAddrを使用します:

SYMBOL_INFO_PACKAGE sym = { sizeof(sym) };
sym.si.MaxNameLen = MAX_SYM_NAME; 
DWORD64 displacement = 0;
bool ok = SymFromAddr(m_processHandle, address, &displacement, &sym.si);

コードはWindowsのC++です。そして、PDBファイルはEXEのディレクトリにあります!私は何が間違っているのですか?ありがとう :)

4

1 に答える 1

1

SymFromAddrは少し気まぐれです。

  1. SymInitializeとSymFromAddrの間にLoadLibraryが発生すると、機能しない場合があります。SymFromAddrを使用すると、SymInitializeを再度実行できます(ヒント:アドレスをキャッシュして、CPUを大量に消費するSymInitializeを大量に回避できます)
  2. SymFromAddr(つまり、SymFromAddr64)の64ビット実装の方がうまく機能します
  3. コードが最適化されていない場合は、より適切に機能します
  4. VC9で生成されたpdbは、古いバージョンよりもうまく機能します。

次のコードでいくつかのアイデアを見つけることができます http://code.google.com/p/nprof/source/browse/0.11/Hook/StackWalker.cpp?r=281

于 2010-12-23T08:12:29.443 に答える