多くのC/C++/Fortranや他のプログラマは、「スタックオーバーフロー」というエラーに遭遇していました。 私の質問は、プログラム、実行中にスタックのサイズを監視または確認できるツール、プログラム、または単純なコードスニペットがあるかどうかです。これは、スタックが蓄積されている場所を特定し、最終的にオーバーフローを引き起こすのに役立ちます。スタックサイズを監視してスタックオーバーフローを防止する方法はありますか?
答えて
あなたのためにやるプログラムがあるかどうかわかりませんが、スタックポインタがある場所(少なくともCとC++では)を簡単に調べることができます。変数のメモリ位置を見てください。それは正確な場所ではありませんが、ローカル変数はスタック上に定義されているので、数バイト以内でなければなりません(これはあなたの目的にとっては問題ありません)。あなたが正確な価値を望むなら、私はそれをアセンブリを通して得ることができます。
しかし、プログラムがクラッシュしたときにスタックトレースを見るほうが簡単かもしれません。
このquestionをご覧ください。受け入れられた回答は、Raymond Chenを引用しています。
If you have to ask, you're probably doing something wrong.
解決策/ツールはプラットフォームに依存します。 1つの簡単なトリックは、スタックに既知のバイト値(例えばAA)を充填し、この値を持たない最初のバイトの位置を監視することである。これは現在のスタックサイズではなく、使用される最大スタックサイズを与えます。
私は同意します。たとえば、DSP/BIOSオペレーティングシステムは、新たに割り当てられたスタックに0xDEADBEEFというパターンを埋め込み、それを使用してスタックの使用状況を追跡します。 x86プロセッサの別の方法(簡単には実装されていない、OSによって実行されなければならない)は、スタックを別のセグメントに置くことです。 OSは、セグメント記述子を割り当てられた長さに設定し、オーバーフローによってGPFが発生し、その時点でスタックの内容が上に移動して拡張されます。誰もが実際にこれを実装するかどうかは分かりません! –
- 1. WPFルーティングイベントを監視する方法はありますか?
- 2. 防止スタックオーバーフロー
- 3. 新しいRelicでApacheを監視する方法はありますか?
- 4. ログファイルを監視する良い方法はありますか?(linux/python)
- 5. エルキャピタンでMacの通知を監視する方法はありますか?
- 6. API Manager 1.10 - バックエンドの状態を監視する方法はありますか?
- 7. ファイルのハッシュ中に状態を監視する方法はありますか?
- 8. java:プロセスを管理/監視するライブラリはありますか?
- 9. JMXを使用してtomcat上のWebアプリケーションを監視する方法はありますか?
- 10. パフォーマンスカウンタを使用してWCFサービスの稼働時間を監視する方法はありますか?
- 11. gruntjsを使用して、.coffeeファイルの変更を監視する方法はありますか?
- 12. アプリケーションのアンインストールを自動的に防止する方法はありますか?
- 13. 監視しているファイルの名前を取得する方法はありますか?
- 14. C++デーモンプロセスを監視する方法は?
- 15. ルビープロセスを監視する方法は?
- 16. Javaを使用してウィンドウプロセスを監視する方法は?
- 17. Sensuを使用してPythonスクリプトを監視する方法は?
- 18. perlを使ってmysqlデータベースの変更を監視する方法はありますか?
- 19. ブルートゥースシリアルポートのアクティビティを監視するフックがありますか?
- 20. テール再帰でスタックオーバーフローを防止しようとしています
- 21. SVNチェックインを監視し注釈を付けるツールはありますか?
- 22. ASP.NETでDropDownListの選択した値を追跡(監視)する方法はありますか?
- 23. プロセスを起動してイベントを監視して監視します
- 24. リモートJavaプロセスを監視する方法
- 25. vbsでフォルダファイルを監視する方法
- 26. C++でストリームを監視する方法
- 27. linuxで他のプログラムが停止したプロセスを監視して終了するための良い方法はありますか?
- 28. カーネルモジュールは、システムコールを監視しますか?
- 29. コードを介してFacebookの壁を監視する方法
- 30. ナギオスを使用してキープアライブデーモンを監視する方法
グローバルなアクセス可能な変数に最下位のスタックフレーム(main())からのローカル変数のアドレスを格納する場合は、 "g_my_stack_base"と呼ぶと、approx_stack_size = my_local_function_variable - g_my_stack_baseを持つ関数のスタックサイズの概算を確認できます。醜いが動作する。ポインタ演算がバイトを返すようにchar *ポインタを使用するようにしてください。 – tucuxi