2009-03-26 8 views
0

C++デバッグアプリケーションでは、コールスタックフレームの数を簡単に数えたいと思っています。これを行うOS機能はありますか?コールスタックフレームの数をカウントするにはどうすればよいですか?

WindowsとPosix、つまりクロスプラットフォームではこれが必要です。いずれかまたは両方のプラットフォームへのソリューションが優れています。

すべてのフレームを見つけるためにスタックを歩くことができますが、これを行うための簡単な呼び出しがあるかどうかは疑問でした。

答えて

2

いいえ、これはコンパイラのためです。

コンパイラは、独自のABIを自由に定義できます。これは、コールスタックが(もしあれば)どのように定義されるかを定義します。純粋な "C"を使用していない限り、これは簡単ではなく、すべてのコンパイラごとに異なります。

また、リターンジャンプに影響するバッファオーバーフロー攻撃を防ぐために、スタックフレームがランダムにメモリに配置されているため、MSが新しいスキームを使用していると聞いたことがあります。正確ではないが、楽しい事実。

+0

最後に、返信アドレスを上書きする前に上書きしなければならないスタックフレームにランダムな「クッキー」を配置していると聞きました。関数の戻り値でクッキーがチェックされ、クッキーが変更されていれば、アプリケーションは終了します。 – Eclipse

+0

興味深いが既に敗北しているので、Microsoftのスタッククッキーを指摘するだけで安全に頼るべきではない。 スタックフレームは実際にはランダムに配置されません。これは、スタック全体を壊すためです。 –

+0

私はクッキーに言及していませんでした。私はフレームの実際の配置を参照していました。潜在的にメモリ内のどこにでもある可能性があります(コンパイラから余分な配線があります)。スタックは、技術的にスタックである必要のない情報を記録する単なる最も簡単な方法です。 –

0

あなたはglibcの(Linux)を使用する場合は、スタックトレースを取得するには、以下の機能を使用することができます。詳細については

#include <execinfo.h> 
int backtrace(void **buffer, int size); 
char **backtrace_symbols(void *const *buffer, int size); 
void backtrace_symbols_fd(void *const *buffer, int size, int fd); 

はバックトレースのmanページを参照してください。

関連する問題