VS2010 の debug でエラーを表示するプログラムがあります。
Error: Stack around the variable 'x' was corrupted
これにより、スタック オーバーフローが発生する可能性が高い関数が得られますが、問題がどこにあるかを視覚的に確認できません。
VS2010 でこのエラーをデバッグする一般的な方法はありますか? どの書き込み操作が誤ったスタック メモリを上書きしているのかを特定することは可能でしょうか? ありがとう
VS2010 の debug でエラーを表示するプログラムがあります。
Error: Stack around the variable 'x' was corrupted
これにより、スタック オーバーフローが発生する可能性が高い関数が得られますが、問題がどこにあるかを視覚的に確認できません。
VS2010 でこのエラーをデバッグする一般的な方法はありますか? どの書き込み操作が誤ったスタック メモリを上書きしているのかを特定することは可能でしょうか? ありがとう
VS2010 でこのエラーをデバッグする一般的な方法はありますか?
いいえ、ありません。あなたが行ったことは、どういうわけか未定義の動作を呼び出すことです。これらの動作が定義されていない理由は、一般的なケースを検出/診断するのが非常に難しいためです。そうすることが明らかに不可能な場合もあります。
ただし、通常、問題の原因となるいくつかの事柄があります。
free
で割り当てられたものnew
など) を使用して、これは、一般的に見にくいいくつかの問題が原因である可能性があります。
delete
で割り当てられた変数new[]
またはで割り当てられdelete[]
た変数new
delete
割り当てられたものmalloc
delete
自動ストレージ変数すぐにわからない場合は、メモリ デバッガーを使用します (Windows 用の Rational Purify が思い浮かびます)。
実際に表示される内容は非常に有益です。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 ツールを使用できます。
このメッセージは、配列の境界違反が原因である場合もあります。関数 (および関数が呼び出すすべての関数、特にスタックベースのオブジェクトのメンバー関数) が、使用される配列の境界に従っていることを確認してください。
この状況で私が行うことは次のとおりです。
問題の変数の(正しい)値を確認できる場所にブレークポイントを設定しますが、エラーが発生する前に設定します。スタックが破損している変数のメモリアドレスが必要になります。デバッガーがアドレスを簡単に取得できるようにするために、コード行を追加しなければならない場合があります(int * x =&y)
この時点で、メモリブレークポイントを設定できます([デバッグ]->[新しいブレークポイント]->[新しいデータブレークポイント])。
Playを押すと、メモリが書き込まれるときにデバッガが停止します。スタックを調べて(通常、いくつかのアセンブリコードで壊れます)、何が呼び出されているかを確認します。
これは、13 項目のポインター配列を作成し、14 番目の項目を設定しようとしたときに発生しました。配列を14項目に変更すると、問題が解決しました。どなたかの参考になれば幸いです^_^