25

VS2010 の debug でエラーを表示するプログラムがあります。

Error: Stack around the variable 'x' was corrupted

これにより、スタック オーバーフローが発生する可能性が高い関数が得られますが、問題がどこにあるかを視覚的に確認できません。

VS2010 でこのエラーをデバッグする一般的な方法はありますか? どの書き込み操作が誤ったスタック メモリを上書きしているのかを特定することは可能でしょうか? ありがとう

4

9 に答える 9

14

VS2010 でこのエラーをデバッグする一般的な方法はありますか?

いいえ、ありません。あなたが行ったことは、どういうわけか未定義の動作を呼び出すことです。これらの動作が定義されていない理由は、一般的なケースを検出/診断するのが非常に難しいためです。そうすることが明らかに不可能な場合もあります。

ただし、通常、問題の原因となるいくつかの事柄があります。

  • メモリの不適切な処理:
    • 何かを2回削除すると、
    • 間違ったタイプの削除 (freeで割り当てられたものnewなど) を使用して、
    • メモリが削除された後に何かにアクセスする。
  • ローカルへのポインターまたは参照を返します。
  • 配列の末尾を超えた読み取りまたは書き込み。
于 2012-10-30T16:08:05.603 に答える
8

これは、一般的に見にくいいくつかの問題が原因である可能性があります。

  • 二重削除
  • deleteで割り当てられた変数new[]またはで割り当てられdelete[]た変数new
  • delete割り当てられたものmalloc
  • delete自動ストレージ変数
  • 参照によってローカルを返す

すぐにわからない場合は、メモリ デバッガーを使用します (Windows 用の Rational Purify が思い浮かびます)。

于 2012-10-30T15:34:14.940 に答える
3

実際に表示される内容は非常に有益です。x 変数の場所の近くで、このエラーを引き起こす可能性のあるアクティビティがないか確認する必要があります。

以下は、そのような例外を再現する方法です。

int main() {
    char buffer1[10];
    char buffer2[20];
    memset(buffer1, 0, sizeof(buffer1) + 1);
    return 0;
}

生成されます (VS2010):

実行時チェックの失敗 #2 - 変数 'buffer1' の周りのスタックが壊れていました。

明らかに memset は必要以上に 1 文字多く書き込んでいます。オプション \GS を使用した VS では、このようなバッファ オーバーフロー (有効にしたもの) を検出できます。詳細については、http: //msdn.microsoft.com/en-us/library/Aa290051を参照してください。

たとえば、デバッガーを使用してコードをステップスルーし、変数の内容を監視するたびに、それらがどのように変化するかを確認できます。また、データ ブレークポイントで運を試すこともできます。メモリの場所が変更されたときにブレークポイントを設定すると、その時点でデバッガーが停止し、コールスタックのどこに問題があるかが示される可能性があります。しかし、これは実際には \GS フラグでは機能しない可能性があります。

ヒープ オーバーフローを検出するには、gflags ツールを使用できます。

于 2012-10-30T16:32:57.750 に答える
3

このメッセージは、配列の境界違反が原因である場合もあります。関数 (および関数が呼び出すすべての関数、特にスタックベースのオブジェクトのメンバー関数) が、使用される配列の境界に従っていることを確認してください。

于 2012-10-30T15:35:38.400 に答える
0

この状況で私が行うことは次のとおりです。

問題の変数の(正しい)値を確認できる場所にブレークポイントを設定しますが、エラーが発生する前に設定します。スタックが破損している変数のメモリアドレスが必要になります。デバッガーがアドレスを簡単に取得できるようにするために、コード行を追加しなければならない場合があります(int * x =&y)

この時点で、メモリブレークポイントを設定できます([デバッグ]->[新しいブレークポイント]->[新しいデータブレークポイント])。

Playを押すと、メモリが書き込まれるときにデバッガが停止します。スタックを調べて(通常、いくつかのアセンブリコードで壊れます)、何が呼び出されているかを確認します。

于 2012-10-30T16:04:25.567 に答える
0

これは、13 項目のポインター配列を作成し、14 番目の項目を設定しようとしたときに発生しました。配列を14項目に変更すると、問題が解決しました。どなたかの参考になれば幸いです^_^

于 2015-10-09T05:50:16.440 に答える