1

プロファイリングしているツールのシンボルを取得するために、xperf で歯と爪と戦ってきました。ツール内で実行される私のコードは、.exe と .dll に分かれています。プロファイリングする重要なものは .dll にあります。xperf を実行しました:

xperf -on PROC_THREAD+LOADER+INTERRUPT+DPC+PROFILE -stackwalk profile

そして、ツールを少し実行してから、

xperf -d profile.etl

次に、xperfview を試してみました。プロファイルをロードし、「シンボルのロード」をオンにして、サマリー テーブルを開きました。シンボルはまったくありません-文字通りモジュールは関数列で「不明」になりました。私はこれについて他のスレッドを精査しましたが、これが私が試したことです:

  1. 環境変数 _NT_SYMBOL_PATH および _NT_SYMCACHE を設定しました
  2. シンボル キャッシュをクリアし、xperf -symbols -i profile_results.etl を実行しました。
  3. 最近のバージョンの Windows Debugging Tools から dbghelp.dll をコピーし、上記を繰り返しました。

これをすべて実行した後、自分のコードではないほとんどのモジュールで関数名が正しく表示されるようになりましたが、dll を表示できません。dll はリリース モード (最適化あり) でコンパイルされていますが、特に pdb を作成するように Visual Studio プロジェクトを設定しました。pdb が存在し、_NT_SYMBOL_PATH のディレクトリ内にあることを確認しました。これを修正する方法、または少なくともさらにデバッグする方法を知っている人はいますか?

4

4 に答える 4

2

シンボルの読み込み中に診断ログを有効にするために、いくつかの環境変数を設定できます。

  • DBGHELP_DBGOUT = 1
  • DBGHELP_LOG = C:\dbghelp.log
于 2011-12-21T22:28:03.940 に答える
1

私はちょうど同じ問題に遭遇しました...すべて同じ手順を試しました...すべての(明らかに)同様のアドバイスを閲覧しました...

symchkさらに、WPA の「bin」フォルダーにコピーしたのと同じdbghelp.dll/ DLL を使用して起動を試みsymsrv.dll、PDB が検索可能であることを確認しました。(まだ頭おかしくなってる気がする…)

注: 私の _NT_SYMBOL_PATH 値には、lcl キャッシュとまっすぐなローカル ロケーションを持つサーバーが含まれていました: _NT_SYMBOL_PATH=srv*D:\SymbolCache*http://msdl.microsoft.com/download/symbols;D:\GitHub\....

次に、「パートナー」EXE によって使用される DLL がLoadLibrary()/GetProcAddress() を介して動的にロードされることに気付きました ... これは XPerf の問題でしょうか?????

これを試すのもためらいました...

不要なエクスポートを DLL に追加し、それを EXE で直接呼び出します (DLL のインポート テーブル エントリをトリガーするため)。したがって、EXEは DLL に依存してロードします。

結局のところ...

.............その後、XPerf はすべてのシンボルをロードしました :)。

編集: MSDN でこのURLを見つけたところ、誰かが '11 年に同様の (同じ?) 問題を示すコードを投稿しました。

編集

最近、これについて同僚と話し合ったところ、XPerf は、プログラムによって読み込まれた DLL のシンボルを読み込むことを適切に "決定" することを知りました...プロセスが終了するまで DLL が読み込まれたままの場合。

そのため、実行中にロードおよびアンロードされ、終了時にアンロードされる DLL の場合、XPerf はこれらのシンボルのロードをスキップします。

于 2016-06-01T00:44:51.787 に答える
0

xperfview の代わりに wpa を使用してみてください。xperfview と同じシステムを使用してシンボルをロードしますが、診断コンソールも備えており、シンボルのロード メッセージを確認できます。

また、_NT_SYMBOL_PATH の設定内容をお知らせください。誤って設定される可能性がある多くの方法があります。

また、_NT_SYMBOL_PATH で、PDB ファイルのローカル キャッシュを指定する必要があります。そこで、PDB がローカル キャッシュにコピーされているかどうかを確認できます。

また、WPT .symcache ファイルが格納されている SymCache パス (_NT_SYMCACHE_PATH が指す、デフォルトは c:\symcache) を調べることもできます。PDB ファイルはこの形式に変換され、.symcache ファイルは最終的に WPA と xperfview によって読み込まれます。

詳細については、次を参照してください。

http://randomascii.wordpress.com/2012/10/04/xperf-symbol-loading-pitfalls/

于 2013-12-13T04:29:54.927 に答える
0

これが役立つかどうかはわかりませんが、 xperf can't load my DLL's symbolsの Q&A に加えて、今日見つけたもう 1 つの詳細を次に示します。

私にとって、xperfview はマップされたネットワーク ドライブ上の PDB ファイルが好きではありません。コードがビルドされたマシンとは別のマシンで xperf と xperfview を実行していたため、マップしたネットワーク共有から実行可能ファイルと PDB ファイルの両方を取得していました。ビルド マシンとまったく同じ絶対パスを再作成するためのドライブ文字 - うまくいきません。PDB ファイルを含むフォルダーをシンボル パスに追加しても役に立ちませんでした。

.pdb ファイルがローカル フォルダーにあることを確認すると、すべてが期待どおりに機能しました。

于 2012-01-10T14:04:01.017 に答える