1

xperf を使用して DLL をプロファイリングしようとしていますが、DLL の PDB ファイルの使用を拒否しています。-symbols を使用して .etl で xperf を実行すると、次のようになります。

DBGHELP: mydll- private symbols & lines
         C:\mydll\debugu\mydll.pdb - unmatched

これは、私の PDB がアプリケーションが使用している DLL と一致しないと考えていると私に信じさせます。これは間違っています; それは一致します。アプリケーションがリンクしている DLL のパスを procexp で確認したり、プロジェクトを完全に再構築したりしました。それはまだ一致しないと考えています。

何が間違っている可能性がありますか?

4

3 に答える 3

2

すみません、この質問をしたのに忘れていました。

実際には2つの問題がありました。

1 つ目は、xperf が実際には古いキャッシュ バージョンのシンボルを使用していたことです。これは、シンボル キャッシュから削除することで修正されました。

2 つ目は、xperfview にシンボルをロードしたときに、実際には最新の pdb がシンボル キャッシュに入れられなかったことです。ただし、pdb は _NT_SYMBOL_PATH 変数に含まれていることを確認したディレクトリにありました。残念ながら、これを修正するために使用した正確なコマンドは覚えていませんが、' xperf file.etl -symbols ' バリアントだったと思います。このコマンドは、etl を正しく解析し、関連するすべてのシンボルを見つけたときにロード/キャッシュしました。この後、xperfview はシンボルを正しく表示できました。

pdb が変更されるたびにコマンドを再実行する必要があったことに注意してください。これは、xperfview がまだシンボル キャッシュにないものには触れないためです。なぜ私のマシンでこのように動作するのかはまだわかりません.他の人はこの問題を抱えていないようです.

于 2010-08-01T02:41:19.837 に答える
2

SYSTEM 環境変数 _NT_SYMBOL_PATH を .pdb ファイル _NT_SYMCACHE_PATH を指すように設定して、c:\Symbols を指すようにしてください。XPerf シンボル処理に関するドキュメントをhttp://msdn.microsoft.com/en-us/library/ff191023(VS.85).aspxで参照してください。

XPerf でのシンボル処理について説明している WindowsItPro ドットコムの「XPerf のカバーの下」というタイトルの優れたブログ記事もあります。

システム環境変数を正しい値で設定する必要があったことに注意してください。バッチ ファイルで環境を設定すると、xperfview によって取得されませんでした (XPerfView の起動直後に [トレース]、[シンボル パスの構成] メニュー オプションをチェックしてください)。

于 2010-07-21T16:37:42.713 に答える
1

ここで経験した問題に関連している可能性のあるSOに関する同様の質問への回答を投稿しました...

基本的に、DLL が動的に読み込まれると、シンボルの読み込みに関して XPerf に問題が発生する可能性があります。

個人的には、特定のモジュールのシンボルをロードしようとするかどうかを決定する XPerf 内のロジックに関するものだと推測しています。たとえば、「すべての EXE とその IAT エントリをロードする」(すべての動的 DLL をスキップします - これは事実ではないようですが、似たようなことが起こっています)。

編集:

私は最近、これについて同僚と話し合い、XPerf がプログラムでロードされた DLL のシンボルをロードすることを適切に「決定」することを知りました...プロセスが終了するまで DLL がロードされたままの場合。

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

于 2016-06-01T00:56:23.207 に答える