EN JA
BACKTRACE(3)
BACKTRACE(3) FreeBSD Library Functions Manual BACKTRACE(3)

名称

backtrace現在実行しているスレッドのバックトレースに書き入れる

ライブラリ

Backtrace Information Library (libexecinfo, -lexecinfo)

書式

#include < execinfo.h>

size_t
backtrace( void **addrlist, size_t len);

char **
backtrace_symbols( void * const *addrlist, size_t len);

int
backtrace_symbols_fd( void * const *addrlist, size_t len, int fd);

char **
backtrace_symbols_fmt( void * const *addrlist, size_t len, const char *fmt);

int
backtrace_symbols_fmt_fd( void * const *addrlist, size_t len, const char *fmt, int fd);

解説

backtrace() 関数は、 len フレームまで呼び出された各フレームに対するプログラムカウンタの値の配列 addrlist によって指された配列に置かれます。見つかった (それは、 len より少なくなるかもしれない) フレームの数が返されます。

backtrace_symbols_fmt() 関数は、 len 要素の addrlistbacktrace() から以前に書き入れられたアドレスの配列を取り、それらを書式化するするために fmt を使用します。利用可能な書式化文字は、次の通りです:

a
%p を使用して印刷 (表示) されるような各要素の数値アドレス。
n
シンボルが動的であるなら、 dladdr(3) によって決定される (アドレス要素より小さな) 最も近い関数シンボルの名前、静的であるなら、実行形式で検索し、/proc ファイルシステムは、実行形式のパスを決定するために利用可能です。
d
シンボルアドレスと 0x%tx を使用して印刷されたアドレス要素の違い。
D
0 でないなら、+0x%tx を使用して印刷された、シンボルアドレスとアドレス要素の違いで、または 0 であるなら、何もない。
f
dladdr(3) によって決定されるシンボルのファイル名。

書式化された文字列の配列は、単一の free(3) によって解放することができる、連続したメモリアドレスとして返されます。

backtrace_symbols() 関数は、 %a <%n%D> at %f の書式化引数を付けた backtrace_symbols_fmt() の呼び出しと同様です。

backtrace_symbols_fd() と backtrace_symbols_fmt_fd() は、配列または文字列を返す代わりに、_fd 以外の名前が付けられた関数と似ています、それらは、fd の文字列の配列を分離した改行を印刷し、成功すれば、 0 を返し、失敗すれば、 -1 を返します。

戻り値

backtrace() 関数は、バックトレースに書き入れられた要素の数を返します。 backtrace_symbols() と backtrace_symbols_fmt() は、成功すれば、文字列配列を返し、失敗すれば、 NULL を返し、 errno を設定します。また、診断出力は、ELF シンボル検索関数によって生成されます。

関連項目

dladdr(3), elf(3)

歴史

関数群の backtrace() タイブラリは、 NetBSD 7.0FreeBSD 10.0 ではじめて登場しました。

バグ

  1. エラーは、印刷 (表示) されるべきではありませんが、呼び出し側に異なって通信しました。
  2. これらの関数は、 elf(3) を使用するので、これは、ライブラリ依存性が導入されないように、 libc/libutil の一部である代わりの個別のライブラリです。
  3. 関数 (_fmt の変異型がない) の Linux バージョンは、 size_t 引数の代わりに int を使用します。
August 23, 2013 FreeBSD