2

非常に簡単に言えば、C++ プログラムが次の関数を実行した場合 (たとえば、任意の VS バージョンでコンパイルされた Windows 7 で)、その後クラッシュし、WER を使用してデバッガーをアタッチするか、WER にクラッシュ ダンプを生成させ、後でこのクラッシュ ダンプを分析します。 .

ダンプ内の情報から、この関数が実行されたことを直接推測すること、つまり、この関数が実行されたことを実行したスレッドに関するトレースを見つけることは可能ですか?

または、スタック全体を破損すると、すべての実行トレースが失われますか?

void bye_bye_stack() {
  int local = 42;
  int* stackaddr = &local;
  while(time(NULL) != NULL) { // prevent optimizations via call to time()
    ++stackaddr; // stack grows towards smaller addresses, so increasing the pointer will point to info we already put on the stack
    *stackaddr = local; // destroy stack content
    // program will (likely) crash here once we reach a read-only page
  }
}
4

3 に答える 3

1

それはあなたの質問への直接の回答ではありません。

ただし、スタックの上書きが発生したときは、スタックの上書きを開始するとすぐにアサートされるユーティリティgflagsを起動していました。

GflagsはMicrosoftによって提供されます

于 2013-01-18T14:20:03.753 に答える
1

一般に、このようにスタックを破棄すると、'callstack' が破棄されます。つまり、以前に呼び出されたルーチンに関する情報が失われます。ただし、このルーチン内からアクセス違反/セグメンテーション違反をトリガーすると、これが発生した命令ポインターが格納され、このルーチンを指します。

ただし、スタックが破損していて、このルーチンから戻った場合、何が起こったのかを理解することは、不可能ではないにしても非常に困難です。

何が起こったのかを理解しようとしている場合は、デバッグ ツールを使用して、スタックが「壊れた」場所を見つけることをお勧めします。実行の証拠を破棄することが目的の場合は、例外をトリガーせずに、このルーチンから「ジャンプ」または「リターン」するようにしてください。

于 2013-01-18T14:32:04.853 に答える
-1

それは本当に依存します。クラッシュ ダンプで提供されるバックレースは、スタックに格納されている情報に直接依存します。これは通常、スタックの破損が疑われる場合にバックトレースを信頼できないことを意味します。

提供された関数は、スタック全体を破損する可能性が非常に高く、セグメントの制限を超えるか、プロセスで使用できないメモリに到達すると、例外が発生します。この時点で、スタックには容疑者を示すものは何もありません。

于 2013-01-18T14:29:45.020 に答える