Linuxカーネルで関数呼び出し元を取得する方法はありますか?__func__が実行中の関数名を返すことは知っています。「 __func__」という関数を探しています
4 に答える
で呼び出し元を取得できます__builtin_return_address(0)
。
発信者の発信者は__builtin_return_address(1)
、などです。
これは、gcc マニュアルに記載されている GCC 拡張機能です: http://gcc.gnu.org/onlinedocs/gcc/Return-Address.html
編集:おそらく指摘する必要があります。これにより、発信者のアドレスが取得されます。関数名が必要な場合は、次のように出力できます%pS
。
printk("Caller is %pS\n", __builtin_return_address(0));
印刷したくない場合は、kallsyms_lookup()
などを使用できます。
また、dump_stack() を呼び出して、コール スタックの内容全体を出力することもできます。
フレーム ポインタが必要かどうかは、arch、IIRC によって異なります。x86 の場合、これらの機能を十分に活用することが確実に望まれます。また、まさにこの理由から、インライン化によって builtin_return_address の精度が歪む可能性があることにも注意してください。
ある場所に到達した方法を確認するためにスタック ダンプが必要な場合は、dump_stack()
builtin_return_address をいじるよりも関数を使用することをお勧めします。
呼び出し元の関数名を取得するには、以下の printk コマンドを使用できます。
printk("呼び出し元は %pF\n", __builtin_return_address(0));