2009-05-28 22 views
5

多くのC/C++/Fortranや他のプログラマは、「スタックオーバーフロー」というエラーに遭遇していました。 私の質問は、プログラム、実行中にスタックのサイズを監視または確認できるツール、プログラム、または単純なコードスニペットがあるかどうかです。これは、スタックが蓄積されている場所を特定し、最終的にオーバーフローを引き起こすのに役立ちます。スタックサイズを監視してスタックオーバーフローを防止する方法はありますか?

答えて

1

あなたのためにやるプログラムがあるかどうかわかりませんが、スタックポインタがある場所(少なくともCとC++では)を簡単に調べることができます。変数のメモリ位置を見てください。それは正確な場所ではありませんが、ローカル変数はスタック上に定義されているので、数バイト以内でなければなりません(これはあなたの目的にとっては問題ありません)。あなたが正確な価値を望むなら、私はそれをアセンブリを通して得ることができます。

しかし、プログラムがクラッシュしたときにスタックトレースを見るほうが簡単かもしれません。

+0

グローバルなアクセス可能な変数に最下位のスタックフレーム(main())からのローカル変数のアドレスを格納する場合は、 "g_my_stack_base"と呼ぶと、approx_stack_size = my_local_function_variable - g_my_stack_baseを持つ関数のスタックサイズの概算を確認できます。醜いが動作する。ポインタ演算がバイトを返すようにchar *ポインタを使用するようにしてください。 – tucuxi

1

このquestionをご覧ください。受け入れられた回答は、Raymond Chenを引用しています。

If you have to ask, you're probably doing something wrong. 

解決策/ツールはプラットフォームに依存します。 1つの簡単なトリックは、スタックに既知のバイト値(例えばAA)を充填し、この値を持たない最初のバイトの位置を監視することである。これは現在のスタックサイズではなく、使用される最大スタックサイズを与えます。

+0

私は同意します。たとえば、DSP/BIOSオペレーティングシステムは、新たに割り当てられたスタックに0xDEADBEEFというパターンを埋め込み、それを使用してスタックの使用状況を追跡します。 x86プロセッサの別の方法(簡単には実装されていない、OSによって実行されなければならない)は、スタックを別のセグメントに置くことです。 OSは、セグメント記述子を割り当てられた長さに設定し、オーバーフローによってGPFが発生し、その時点でスタックの内容が上に移動して拡張されます。誰もが実際にこれを実装するかどうかは分かりません! –

関連する問題