Visual Studioでコールスタックサイズを監視する方法はありますか?実行中にコールスタックウィンドウが表示されますが、スタックのサイズは表示されません。C ++を使用していて、スタックオーバーフローの問題に直面しています。使用している再帰関数の一部に問題がある可能性があることはわかっていますが、これらの問題を解決する前に、呼び出しスタックのサイズを監視して何が起こっているかを確認したいと思います。
3 に答える
ここでは、データブレークポイントを使用すると便利です。コード内のどこにいても、正しいスレッドにいる限り問題はありません。デバッグ+新しいブレークポイント+新しいデータブレークポイントを使用してください。アドレスボックスに「。」と入力し@esp - 250000
ます。F5キーを押して実行を続行すると、使用可能なスタックスペースの4分の1が消費されると、再帰内のどこかで中断します。espからの正確なオフセットは重要ではありません。
いくつかの方法があります:
- ウォッチウィンドウでESPを調べます。
@esp
これは、ウォッチウィンドウで見ることによって行うことができます。これを、プロセスの開始時のESPと比較してください。 - 同様に、最初/最後のスタックフレームでスタックに割り当てられた変数のアドレスを調べます。
スタックは通常逆方向に割り当てられるため、スタックが大きくなるにつれて、ESPはどんどん小さくなっていくことに注意してください。
「Microsoft推奨ネイティブルール」コード分析は、コードを調べて、スタックをオーバーフローする可能性のあるコードの問題を見つけることができます。再帰の問題を見つけるのがどれほど優れているかはわかりませんが、非常に大きい(1MB)クラスのローカルインスタンスを使用したコードで問題が見つかりました。実行時の唯一のエラーはスタックオーバーフローでした。もちろん、スタック上で大きなオブジェクトを使用することはお勧めできません。小さなオブジェクトと、汚れた洗濯物のほとんどをヒープに保存するオブジェクトのみを使用する必要があります。
VS2012では、プロジェクトのプロパティを右クリックし、[コード分析]を選択してから、チェックボックスをクリックして[コード分析を有効にする]を選択します。実行には数分かかります。