コールスタックをプログラムで操作します.
2703 ワード
翻訳してからhttp://www.gnu.org/software/libc/manual/html_node/Backtraces.co.races.
呼び出しスタック(Backtraces)
コールスタックはスレッド内で現在アクティブな関数コールリストです.通常は外部のデバッグツールを使ってgdbのように呼び出しスタックを確認します.しかし、コールスタックは、例えばログを記録するために、プログラム内で符号化された方法で取得されることがある.
ヘッダファイルexecinfo.hは、現在のスレッドからの3つの関数の取得と操作のためのスタックを宣言しています.
関数:int backtrace(void****buffer、int size)
Prliminary:|MT-SCafe|AS-ユニセフinit heap dleopen plugn lock can AC-Unisafe init mem lock fd|See POSIX Safety Concept.
backtrace関数は、現在のスレッドの呼び出しスタックをリストとして取得し、bufferに情報をロードする.パラメータsizeは、ブザーにロードするvoid*タイプの要素の個数であるべきです.戻り値は、実際にロードされたブザーの全要素の個数であり、最大値はsizeである.
buffer内のポインタは、スタックを確認して得られた実際のアドレスを返し、各ポインタは、スタックフレームのアドレスを返します.
いくつかのコンパイラの最適化は、取得された有効なコールスタックを混乱させることに注意する必要があります.関数のインラインは、インライン関数がコールフレームスタックを持たないことをもたらします.最後の呼び出しの最適化は、別の起動フレームスタックに置き換えられます.フレームポインタが欠けていると、スタックの内容が正しく説明されるのを阻止します.
関数:char**backtrace_smbors(void*const*buffer int size)
Prliminary:|MT-SCafe|AS-ユニセフheap|AC-ユニセフmem lock|See POSIX Safety Concept.
backtracesmbors関数は、backtrace関数から取得した情報を文字列配列に変換します.パラメータbufferはbacktrace関数で取得したアドレス配列のポインタを指しますが、sizeはその配列の要素個数です.
戻り値は、文字列配列を指すポインタであり、配列を変更すると、ブザーと同じように、size要素があります.各文字の転送には、ブザーの要素に対応する読み取り可能な説明が含まれています.関数名(できれば)、入力関数のオフセット量、および実際の戻りアドレス(16進数)が含まれます.
現在、関数名とオフセットは、ELFをプログラムとライブラリとして使用するバイナリフォーマットのシステムでのみ取得できます.他のシステムでは、16進戻りアドレスのみが表示されます.もちろん、追加のマーカーをコネクタに渡すことで、関数名を取得することもできます.(例えば、GNU ldを使用するシステムでは、転送が必要です.rdynamic)
backtracesmborsの戻り値は、malloc関数で取得されたポインタであり、このポインタをリリースする義務があります.注意戻り値だけが解放される必要があります.単独の文字列ではありません.
十分なメモリ記憶文字列がない場合、戻り値はNULLとなります.
関数:void backtracesmbos_fd(void*const*buffer、int size、int fd)
Prliminary:|MT-SCafe|AS-SCafe|AC-Unisafe lock𞓜See POSIX Safety Concepts.
backtracesmbos_fd関数実行とbacktrace_smbors関数は同じ変換です.この関数は、文字列をディスクリプタに返さず、各行の記述子がfdであるファイルに文字列を書き込みます.malloc関数を使用しないので、この関数が失敗する可能性がある場合に使用できます.
これらの関数の使い方を以下の手順で説明します.注意backtraceから返されたアドレスを含む配列がスタックに割り当てられています.したがって、このようなコードは、Mallocを通じてメモリを取得できない場合に使用することができます(同様にbacktraccemborsがBacktraccemborsに置き換えられている場合).普通は帰りの住所の個数は多くないです.複雑なプログラムでも50の入れ子を超えるレベルは少ないです.200の記録は全てのプログラムをカバーするのに十分です.
呼び出しスタック(Backtraces)
コールスタックはスレッド内で現在アクティブな関数コールリストです.通常は外部のデバッグツールを使ってgdbのように呼び出しスタックを確認します.しかし、コールスタックは、例えばログを記録するために、プログラム内で符号化された方法で取得されることがある.
ヘッダファイルexecinfo.hは、現在のスレッドからの3つの関数の取得と操作のためのスタックを宣言しています.
関数:int backtrace(void****buffer、int size)
Prliminary:|MT-SCafe|AS-ユニセフinit heap dleopen plugn lock can AC-Unisafe init mem lock fd|See POSIX Safety Concept.
backtrace関数は、現在のスレッドの呼び出しスタックをリストとして取得し、bufferに情報をロードする.パラメータsizeは、ブザーにロードするvoid*タイプの要素の個数であるべきです.戻り値は、実際にロードされたブザーの全要素の個数であり、最大値はsizeである.
buffer内のポインタは、スタックを確認して得られた実際のアドレスを返し、各ポインタは、スタックフレームのアドレスを返します.
いくつかのコンパイラの最適化は、取得された有効なコールスタックを混乱させることに注意する必要があります.関数のインラインは、インライン関数がコールフレームスタックを持たないことをもたらします.最後の呼び出しの最適化は、別の起動フレームスタックに置き換えられます.フレームポインタが欠けていると、スタックの内容が正しく説明されるのを阻止します.
関数:char**backtrace_smbors(void*const*buffer int size)
Prliminary:|MT-SCafe|AS-ユニセフheap|AC-ユニセフmem lock|See POSIX Safety Concept.
backtracesmbors関数は、backtrace関数から取得した情報を文字列配列に変換します.パラメータbufferはbacktrace関数で取得したアドレス配列のポインタを指しますが、sizeはその配列の要素個数です.
戻り値は、文字列配列を指すポインタであり、配列を変更すると、ブザーと同じように、size要素があります.各文字の転送には、ブザーの要素に対応する読み取り可能な説明が含まれています.関数名(できれば)、入力関数のオフセット量、および実際の戻りアドレス(16進数)が含まれます.
現在、関数名とオフセットは、ELFをプログラムとライブラリとして使用するバイナリフォーマットのシステムでのみ取得できます.他のシステムでは、16進戻りアドレスのみが表示されます.もちろん、追加のマーカーをコネクタに渡すことで、関数名を取得することもできます.(例えば、GNU ldを使用するシステムでは、転送が必要です.rdynamic)
backtracesmborsの戻り値は、malloc関数で取得されたポインタであり、このポインタをリリースする義務があります.注意戻り値だけが解放される必要があります.単独の文字列ではありません.
十分なメモリ記憶文字列がない場合、戻り値はNULLとなります.
関数:void backtracesmbos_fd(void*const*buffer、int size、int fd)
Prliminary:|MT-SCafe|AS-SCafe|AC-Unisafe lock𞓜See POSIX Safety Concepts.
backtracesmbos_fd関数実行とbacktrace_smbors関数は同じ変換です.この関数は、文字列をディスクリプタに返さず、各行の記述子がfdであるファイルに文字列を書き込みます.malloc関数を使用しないので、この関数が失敗する可能性がある場合に使用できます.
これらの関数の使い方を以下の手順で説明します.注意backtraceから返されたアドレスを含む配列がスタックに割り当てられています.したがって、このようなコードは、Mallocを通じてメモリを取得できない場合に使用することができます(同様にbacktraccemborsがBacktraccemborsに置き換えられている場合).普通は帰りの住所の個数は多くないです.複雑なプログラムでも50の入れ子を超えるレベルは少ないです.200の記録は全てのプログラムをカバーするのに十分です.
#include
#include
#include
/* Obtain a backtrace and print it to stdout. */
void
print_trace (void)
{
void *array[10];
size_t size;
char **strings;
size_t i;
size = backtrace (array, 10);
strings = backtrace_symbols (array, size);
printf ("Obtained %zd stack frames.
", size);
for (i = 0; i < size; i++)
printf ("%s
", strings[i]);
free (strings);
}
/* A dummy function to make the backtrace more interesting. */
void
dummy_function (void)
{
print_trace ();
}