2

xperf トレースで完全なコール スタックを取得する際に問題が発生しています。これはWin7 64ビットPC上にあります。より高いレベルでは、複数の dll をロードする exe があり、これらも大部分の作業を行います。すべての pdb ファイルは 1 つのディレクトリにあり、実行可能コードで有効なシンボルとコール スタックを取得できるので、シンボル パスが正しく設定されていると確信できます。

私の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

これは xperf を示しているようです

  • 「...アドレスにある実行可能イメージがわかりません」
  • "...最大スタック深度を超えています" .

私が見つけたこれの考えられる原因は、FPO (フレーム ポインターの最適化) がオンになっている (/Oy で明示的に無効にしましたが、オンにする必要はありません)、または最大スタック深度を超えていることです。これが私が当たっているかどうかを判断する方法がわかりません。

dll のどこで時間が費やされているかを確認できなければ、あまり有用な情報を得ることができないので、何が起こっているのかを突き止めたいと思います。

読んだり試したりすることについて、何か推奨事項はありますか? 私が見逃しているスタックウォークの制限はありますか? dll のコール スタックに固有の、シンボル用の特別な設定はありますか?

4

3 に答える 3

0

新しい環境変数 DBGHELPを作成し、それを1に設定します。環境変数DBGHELP_LOGを作成し、D:\DbgHelpLog.txtのようなログ ファイルに設定します。シンボルの読み込みが完了したら、xperfview/wpa を閉じて、シンボルの読み込みが失敗した理由をログで調べます。

DBGHELP シンボルのロードの診断

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

于 2013-08-06T09:09:31.410 に答える
0

ここから次のことを試してください:Paging Executiveを無効にする

64 ビット Windows でトレースを機能させるには、DisablePagingExecutive レジストリ キーを設定する必要があります。これは、カーネル モード ドライバーとシステム コードをディスクにページングしないようにオペレーティング システムに指示します。これは、xperf を使用して 64 ビット コール スタックを取得するための前提条件です。 xperf スタック ウォーク コードは、ページ アウトされたページにアクセスできません。管理者特権でのコマンド プロンプトから次のコマンドを実行すると、このレジストリ キーが設定されます。

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

このレジストリ キーを設定したら、コール スタックを記録する前にシステムを再起動する必要があります。このフラグを設定すると、Windows カーネルがより多くのページを RAM にロックすることになるため、おそらく約 10 MB の追加の物理メモリが消費されます。

于 2012-10-23T11:04:32.460 に答える