メモ:execinfo.h

書いとかないから忘れるのだ。

なんていうかね、baseとlinkを与えてabsolute-linkにするとか、同じ引き数与えて最も短かいrelative-linkの文字列を作るとか、そういうのも車輪の再発明と言えるけど(結局適当な関数が見つからなくて…書いてしまった)。

最近ではgccとIA32のスタックフレームの構造を調べて自力でスタックを追うなんてことをしようと一瞬思った。…この先死ぬまで何度同じことをしようと思うだろうか。

というわけでプログラム中からのバックトレースの取り方。glibcなら大丈夫。デバッガ使えという説もあるんだけれども。

#include <execinfo.h></p> <p>void show_trace(void **ptr)<br /> {<br /> void **array;<br /> int r,i;<br /> array = calloc(1, 1024);<br /> r=backtrace(array, 1024);<br /> for(i=0; i<r; i++){ printf("backtrace[%d]=%p\n", i, array[i]); } free(array); }

出てきたアドレスをaddr2lineとかで調べればいい。backtrace_symbolsやbacktrace_symbols_fdよりはaddr2lineのほうが良い結果をくれる。gcc -gでコンパイルしてあればかなり精度は高い。

「addr2line」の名前もメモしとかないとobjdump -dSとかの逆アセンブルの結果からソースの位置を調べるという不毛なことをする羽目になる。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です