0

Windows Server 2003 SP2 でプロセスを実行しています。そのスレッドの 1 つのスタック トレースを確認したい場合、常に 9 エントリに制限されています。これらのエントリは正しく解決されています (PDB が配置されています) が、リストは途中でカットされています。

Process Explorer の制限を知っていますか?

4

1 に答える 1

1

このスレッドの完全なスタック トレースには 9 つ以上のエントリが必要だと思われます。32 ビット OS か 64 ビット OS かについては言及されていませんが、32 ビット OS を想定し、64 ビットについては補足として説明します。

32 ビット システムでスタック トレースを収集するときに、スタック トレースの項目をまったく収集できない場合や、コールスタックがより深いことを知っていても、限られた量のスタック フレーム情報しか収集できない場合があります。この理由は次のとおりです。

  • 呼び出し規則が異なると、スタック上のさまざまな場所にデータが置かれるため、スタックをたどるのが難しくなります。4 つの定義を考えることができます。3 つは一般的に使用され、もう 1 つは風変わりなものです: cdecl、fastcall、stdcall、naked です。

  • リリース ビルドの場合、コード オプティマイザーは、Frame Pointer Omission (FPO) と呼ばれる手法を使用してフレーム ポインターを削除する場合があります。FPO がないと (場合によっては、PDB ファイルに FPO データがあっても)、コールスタックを正常にウォークできません。

  • フック - ヘルパー DLL、ウイルス対策、デバッグ フック、インストルメント化されたコード、マルウェアなどは、コールスタックに独自のスタブ コードを挿入しており、その小さなセクションはスタックによって実行できない可能性があるため、ある時点でコールスタックを台無しにする可能性があります。ウォーカー。

  • バイトコード仮想マシン。仮想マシンの作成方法に応じて、VM はその実行を支援するためにコールスタックにトランポリンを配置する場合があります。これらは、スタックをうまく歩くのを難しくします。

32 ビット Windows ではさまざまな呼び出し規則 (Microsoft と他のベンダーの両方) があるため、あるフレームから別のフレームに移動するときに何が期待できるかを理解するのは困難です。

64 ビット システムの場合、1 つの呼び出し規約が指定されています。それは人生をずっと楽にします。とは言っても、ヘルパー DLL とフックがスタックで独自の処理を行うという問題がまだ残っており、スタックをウォークするときに問題が発生する可能性があります。

Process Explorer に制限があるとは思えません。問題は、上に挙げた理由の 1 つが原因で、そのスレッドのコールスタックをたどることに問題があることだと思います。

于 2010-03-30T17:53:59.330 に答える