Xperfは私のDLLのシンボルをロードできません
質問
Xperfを使用してDLLをプロファイルしようとしていますが、DLLのPDBファイルの使用を拒否しています。 -symbolsを使用して.etlでxperfを実行してください、私は取得します:
DBGHELP: mydll- private symbols & lines
C:\mydll\debugu\mydll.pdb - unmatched
これにより、PDBがアプリケーションが使用しているDLLと一致していないと考えていると信じています。これは間違っています;一致します。私は、アプリケーションがprocexpの使用とリンクしているDLLのパス、プロジェクトを完全に再構築するなどを確認しました。それはまだ一致しないと考えています。
何が間違っているのかについてのアイデアはありますか?
解決 2
申し訳ありませんが、私はこの質問をして、それを忘れました。
実際には2つの問題がありました。
1つ目は、Xperfが実際に私のシンボルの古いキャッシュバージョンを使用していたことです。これは、シンボルキャッシュから削除することで修正されました。
2つ目は、XperfViewにシンボルをロードしたとき、実際に最新のPDBをシンボルキャッシュに入れなかったことです。ただし、PDBはディレクトリにあり、_nt_symbol_path変数に含まれていることが確認されました。残念ながら、私はこれを修正するために使用された正確なコマンドを覚えていませんが、私はそれがだったと思いますxperf file.etl -symbols' 変異体。このコマンドは、ETLを正しく解析し、遭遇したときに関連するすべてのシンボルをロード/キャッシュしました。この後、XperfViewは私の記号を正しく表示できます。
XperfViewがまだシンボルキャッシュに含まれていないものに触れないため、PDBが変更されたときはいつでもコマンドを再実行する必要があることに注意してください。なぜそれが私のマシンでこのように振る舞うのかはまだわかりませんが、他の人はこの問題を抱えていないようです。
他のヒント
システム環境変数を設定してみてください_NT_SYMBOL_PATH .pdbファイルを指す_nt_symcache_path c: symbolsを指す。 xperfシンボルの処理に関するドキュメントを参照してください http://msdn.microsoft.com/en-us/library/ff191023(vs.85).aspx
また、XperfのシンボルハンドをカバーするWindowsitpro Dot Comには、「Xperfとのカバーの下」というタイトルの良いブログ記事もあります。
正しい値でシステム環境変数を設定する必要があることに注意してください。バッチファイルに環境を設定するとXperfViewによって環境がピックアップされませんでした(XperfViewを起動する直後にシンボルパスメニューオプションを構成します)
私はちょうど投稿しました 答え 同様の質問に、それがここで経験された問題に関連する可能性があります...
基本的に、DLLが動的にロードされている場合、シンボルロードに関してXPERFに問題を引き起こす可能性があります。
個人的には、私です 推測 Xperfの決定内の論理についてです 試してみるかどうか 特定のモジュールのシンボルをロードします。たとえば、「すべてのEXEとIATエントリをロード」(すべての動的なDLLをスキップします - これは当てはまらないように見えますが、同様のことが起こっています)
編集:
私は最近、これについて大学と話し合い、XperfがプログラムでロードされたDLLのシンボルをロードすることを適切に「決定」することを知りました... もしも DLLは、プロセスの終了までロードされたままです。
したがって、ロードされたDLLの場合 と 実行中にアンロードされ、終了時にアンロードされます... Xperfは、これらのシンボルをロードする試みをスキップします。