20

Linuxカーネルで関数呼び出し元を取得する方法はありますか?__func__が実行中の関数名を返すことは知っています。「 __func__」という関数を探しています

4

4 に答える 4

46

で呼び出し元を取得できます__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()などを使用できます。

于 2010-11-10T14:47:15.510 に答える
5

また、dump_stack() を呼び出して、コール スタックの内容全体を出力することもできます。

于 2012-09-18T22:48:45.597 に答える
4

フレーム ポインタが必要かどうかは、arch、IIRC によって異なります。x86 の場合、これらの機能を十分に活用することが確実に望まれます。また、まさにこの理由から、インライン化によって builtin_return_address の精度が歪む可能性があることにも注意してください。

ある場所に到達した方法を確認するためにスタック ダンプが必要な場合は、dump_stack()builtin_return_address をいじるよりも関数を使用することをお勧めします。

于 2010-11-22T03:28:26.003 に答える
0

呼び出し元の関数名を取得するには、以下の printk コマンドを使用できます。

printk("呼び出し元は %pF\n", __builtin_return_address(0));

于 2015-09-30T10:27:25.627 に答える