4

関数呼び出しのようなバックトレースを自分で実装しようとしています。スタックの展開に成功し、すべてのリターン アドレスがスタックに存在します。この情報から、関数名、関数への変数名入力を取得したいと思います。また、これをプログラムで実行したい、つまり、実行時に、プログラムでこれまでに呼び出されたすべての関数に関する情報を取得できる必要があります。コンパイル中に -g フラグを付けてコンパイルしても問題ないと仮定しましょう。

関数名を取得するために dladdr() 関数を使用しようとしていますが、これは機能しませんでした。「エラー:不明なタイプ名 'Dl_info'」というエラーが表示されます。ここに私のコードスニペットがあります:

const char * get_func_name(void *ip){
        Dl_info info;
        int ret;
        ret = dladdr(ip,&info);
        if(ret < 0)
                return NULL;
        return info.dli_fname;
}

私は bfd ライブラリを調査しようとしましたが、良い例/チュートリアルがありませんでした。ubuntu 14.04を使用しています

4

1 に答える 1

2

manページによると、#define _GNU_SOURCEあなたの前に必ず#include <dlfcn.h>. この構造体 とdladdr()は GNU 拡張です。

于 2016-09-07T06:57:13.300 に答える