現在、カーネルモジュールをデバッグしています。この目的のために、デバッグ情報を使用してカーネル全体を構築しました(kallsymsなどを生成します...)。
を試すとnm my_module.ko
、モジュールに含まれるシンボルのリストが表示されます。記号リストに表示されないために一部の記号が欠落していることを除いて、すべて問題ありません。これについての私の感覚は、関連する関数が自動的にインライン化されているということです。
とにかく、qemu-kgdb/gdb でカーネルを実行すると、「不足している」関数が呼び出されていることがわかります。これは、どのコードパスでも使用されていないため、コンパイラがそれを消去しなかったことを意味します (したがって、私の「感覚」)。
シンボルが表示されないため、ブレークポイントを設定できず、実行中のコード パスを確認できるようにgdb が展開しません。gdb に展開を指示する方法がわからないことを理解してください。
残念ながら、コード パスのこの部分を確認したいのですが、どうすればよいですか?
編集: トムの答えで示唆されているように、私はfile:line
以下の構文を使用してみました:
私のコードファイルは次のようになります:
int foo(int arg) // The function that I suspect to be inlined - here is line 1
{
/* Blabla */
return 42;
}
void foo2(void)
{
foo(0); // Line 9
}
を試しb file.c:1
ましたが、ブレークポイントにヒットしましたが、foo()
関数は展開されません。もちろん、foo2
何が起こったのかを確認するためにブレークポイントも設定したので (これはうまくいきました)、デバッグ シンボルを作成しています。