2011-01-04 12 views
0

Linuxカーネルのkmalloc関数にデバッグメッセージを追加します。ですから、私の目標はkmallocと呼ばれるすべての関数を出力することです。 インライン関数でMACRO __FUNCTION__を使用してください

Iは

のprintk( "%sのサイズ:呼び出し元%D"、FUNCTION、サイズ)を追加しようとしました。 slab.h

でkmallocの関数で

しかし、FUNCTIONの結果はkmallocのそれ自体です。私はインライン関数(fyi、kmallocはインライン関数)の前にMACROが最初に処理されることに気付きました。

今、私の質問は、kmallocにデバッグメッセージを追加する最も簡単な方法は何ですか?

ありがとうございました。

答えて

2
printk("%pS\n", __builtin_return_address(1)); /* or was it (0)? don't remember */ 

コンパイル時にを使用しないことを条件とします。それが機能しないことが判明した場合は、dump_stack()を引き続き使用できます。

+0

(0)は現在の機能で、(1)は発信者のアドレスを指定します。返されたアドレスを 'sprint_symbol()'と組み合わせると、あなたが望む効果が得られます。 – ctuffli

+0

さて、 '%pS'はシンボルの解像度をすでに処理していなければなりません。 – user502515

+0

完全にクールです。あなたは毎日何かを学びます。ありがとう@ user502515! – ctuffli

0

私はLinuxカーネルで作業していましたが、別の機能でも同様のことをしたいと思っていました。私がやってしまったことは__FUNCTIONFUNCTIONの名前を変更し、それに余分な文字*パラメータを追加して、以下の例のように名前の関数でマクロを追加しました:

#define FUNCTION(i) __FUNCTION(i,__FUNCTION__) 

void __FUNCTION(int arg, char *func) 
{ 
    printk("%s\n", func); 
    //do what ever FUNCTION does 
} 

マクロニーズ適切なヘッダーファイルで定義され、FUNCTION()を使用してすべてのソースファイルに含まれます。 FUNCTIONの呼び出しはすべて__FUNCTIONに置き換えられ、呼び出し元が表示されます。しかし、あなたのケースではkmallocはヘッダファイルに定義されているインライン関数ですので、そのマクロを関数の上に追加するだけです。

関連する問題