タグ

2011年10月29日のブックマーク (2件)

  • backtrace - 兼雑記

    で、そういう理由でこう、何度目かの backtrace 実装とかしてたんですが、 glibc の backtrace って DWARF2 使う実装とかあるんだなーと気付いた。 GCC ならこれ使うのが一番楽だし、 -fomit-frame-pointer ついてても大丈夫とか偉い。 // They are in libgcc (see glibc-2.7/sysdeps/ia64/backtrace.c) extern(C) int _Unwind_Backtrace(void* fn, void* a); extern(C) void* _Unwind_GetIP(void* ctx); struct Arg { void** buffer; int size; int cnt; } int backtrace_helper(void* ctx, void* data) { Arg* a

    backtrace - 兼雑記
    ono_matope
    ono_matope 2011/10/29
  • GCCの__builtin_return_addressを使ってカジュアルにバックトレース - 空想犬猫記

    仕事Windows上のバックトレースを取得するStackWalk関数周りを調べていて、ふとMacOSXではどうやるのか気になったのでやってみました。 Leopard以降では、そのものズバリ backtrace()、backtrace_symbols()という関数があり、またC++限定であれば、例外処理のための実装である_Unwind_Backtrace()という関数が使えるようです(参照)。 ここで紹介するのは、あまりバイナリハック的なことをせずに、C/C++でカジュアルにスタックのバックトレースを取得する方法です。カジュアルなぶん、環境にかなり依存すると思われます。テストした環境はMacOSX 10.4.11 (PPC) です。 原理はとても単純で、以下の3ステップです。 __builtin_return_address() 関数を使って、関数の戻るポインタを取得する。 引数を1,2,

    GCCの__builtin_return_addressを使ってカジュアルにバックトレース - 空想犬猫記
    ono_matope
    ono_matope 2011/10/29
    backtrace()以外のバックトレース手法