2012-01-14 16 views
1

xperfトレースでフルコールスタックを取得する際に問題が発生しています。これはWin7 64bit PC上にあります。より高いレベルでは、いくつかのDLLをロードするexeを持っています。すべてのpdbファイルは1つのディレクトリにあり、実行可能なコードで有効なシンボルと呼び出しスタックを取得するので、シンボルパスが正しく設定されていることを確認できます。xperfコールスタックトレース(DLL固有)

私のexeがロードされたDLLの1つを呼び出すとすぐに、コールスタック情報が失われ、スタック列にplugin_name.dll!?が表示され、展開されたときにそれ自体が呼び出されます。ウェイトタブは高い割合(50〜90%)と高いカウントを示していますが、スタックの実際の関数呼び出しを取得できません。たとえば、次のようにこれらをもとに

Process, Stack, Module, Function, Weight, % Weight, Count, TimeStamp 
, |  kernel32.dll!BaseThreadInitThunk, , , 59067.075556, 73.29, 59075, 
, |  |- plugin_name.dll!?, , , 45036.186642, 55.88, 45042, 
, |  |  plugin_name.dll!?, , , 45036.186642, 55.88, 45042, 

http://blogs.msdn.com/b/pigscanfly/archive/2009/08/06/stack-walking-in-xperf.aspx http://msdn.microsoft.com/en-us/library/windows/desktop/ff191014(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/ff191014.aspx

これは何のexecを知らない...そのXperfは

  • 」を示しているようです"
  • " ...最大スタック深度を超えました "

FPO(フレームポインタの最適化)がオンになっている(私は明示的に/ Oyを使用していないにもかかわらず無効にしています)、またはスタックの最大深度を超えているため、これが私の打撃であるかどうかを判断する方法がわかりません。

dllでどこの時間が費やされているか分かりませんが、私は非常に有用な情報を得ることができないので、何が起こっているのか把握したいと思います。

誰かが読んだり、試してみることをおすすめしますか? stackwalkには何か制限がありますか?シンボルの特別な設定はありますか?dllの呼び出しスタックに特有ですか?

+0

、これは古い質問です確かに - 私はまだこれが私のDLLのシンボルが時々ロードに失敗WPAに問題があることがわかり、私は望んでいましたすべてのシンボルパスがc:\(ローカルとキャッシュの場所)を指していることを確認するために、私はc:から(mklink経由で)プロファイルしたいものを実行し、DLLをアンロードしません。それが更新されると更新されます – g3cko

答えて

0

hereから、次のことを試してみてください。 無効にページングエグゼクティブ

64ビットWindows上で動作するようにトレースするあなたはDisablePagingExecutiveのレジストリキーを設定する必要があるため。これはオペレーティングシステムにカーネルモードのドライバとシステムコードをディスクに書き込まないように指示します。これはxperfを使用して64ビットコールスタックを取得するための前提条件です.64ビットスタックウォーキングは実行可能イメージのメタデータに依存します。 xperfスタックウォークコードはページアウトされたページには触れません。昇格したコマンドプロンプトから次のコマンドを実行すると、このレジストリキーが設定されます。あなたは、コールスタックを記録することができます前に、システムを再起動する必要があります。このレジストリキーを設定した後

REG ADD "HKLM\System\CurrentControlSet\Control\Session Manager\Memory Management" -v DisablePagingExecutive -d 0x1 -t REG_DWORD -f 

。このフラグを設定すると、WindowsカーネルがRAMにさらに多くのページをロックするので、おそらく約10 MBの追加物理メモリが消費されます。

+0

応答のおかげで、残念ながら、私はすでにこのセットを持っていました。私が奇妙に思ったことの1つは、私のDLLのどれもシンボルディレクトリ(c:\ symbols)にキャッシュされていません。私の_NT_SYMBOL_PATHには、pdbが入っているディレクトリがあり、xperf -symbols -i trace.etlを使ってもどちらも役に立ちませんでした。 – g3cko

0

新しいenvvarを作成するDBGHELPをに設定します。DBGHELP_LOGを作成し、D:\ DbgHelpLog.txtのようなログファイルに設定します。シンボルの読み込みが終了したら、xperfview/wpaを閉じて、なぜシンボルの読み込みに失敗したのかを調べます。

診断DBGHELPシンボルロード

http://blogs.msdn.com/b/matt_pietrek/archive/2005/04/12/407721.aspx

関連する問題