Is there a way to temporarily pause code execution (for debugging purposes) while working in the Linux kernel, like a getchar() or a system("PAUSE") type operation?
4 に答える
一般に、gdbリモートデバッグ手順があります。
http://davis.lbl.gov/Manuals/GDB/gdb_17.html
Linuxカーネルをそのようにデバッグできるかどうかはわかりません。
FreeBSDカーネルはおそらくこれを可能にします:
http://www.freebsd.org/doc/en_US.ISO8859-1/books/developers-handbook/kerneldebug-online-gdb.html
必要なのは、GNU デバッガーですgdb
。-g
コードを機能させるには、フラグを付けてコンパイルする必要があることに注意してください。
例えば:
$ gcc -g -o out -c file.c
次に、デバッガーを使用してプログラムを実行します。
$ gdb ./out <params>
gdb
使い方がわからない場合は
、 のマニュアル ページを読む価値があります。$ man gdb
はい、技術的には、kgdb を介してオンザフライでカーネルをデバッグすることができます (通常はシリアル ポートを介して接続されるため、別のマシンも使用できます)。
ただし、より実用的な方法は、カーネル ダンプを生成し、それをデバッグすることです (Google で検索してください。かなり簡単です)。
カーネルの実行部分を本当にデバッグする必要がある場合は、自分でワーカー スレッドを作成し、それをデバッグします (システムがロックアップすることはありません)。
関数 set_current_state(TASK_STOPPED) を使用してワーカー スレッドを一時停止できます。「凍結解除」するには、set_task_state(task_mm_struct_pointer, TASK_INTERRUPTIBLE) を使用する必要があります。
カーネル自体には、その目的のために設計されたツールが少なくとも 2 つあります (ユーザー空間コードではなく、カーネル コードをデバッグすると仮定します)。どちらも同じフレームワークを共有しているため、セットアップ方法は非常に似ています。
KDB
- これにより、追加のソフトウェア ツールを使用せずに限定的なデバッグを行うことができます。場合によっては (KMS グラフィックス ドライバーと PS/2 キーボードを使用している場合など)、同じマシンでこれを実行することもできます。私の fedora カーネルにはKDB
サポートがコンパイルされており、私のラップトップには Intel グラフィックス カードがあるので、次のことができます。echo kms,kdb > /sys/module/kgdboc/parameters/kgdboc
コンピューターで KDB を有効にするには。デバッグセッションを開始したい場合は、次のように呼び出すだけです。
echo g > /proc/sysrq-trigger
これで (ほぼ) カーネル全体が停止し、
kdb
プロンプトが表示されます。kdb
通常のカーネル操作を終了して再開するには、次のように入力しgo
ます。kdb
コンソールでできることはたくさんあります。入力help
するだけで、それらについて学ぶことができますもう 1 つのメカニズムは
KGDB
、アクティブ化するために、プロンプトからコマンドkgdb
を実行することです。これにより、デバッガーがモードに切り替わります。本格的なデバッガー ( ) を接続し、カーネル イメージを提供して、カーネル内のすべてのシンボルにアクセスできるようにします。と同じ方法でアクティブ化でき、カーネル パラメータを使用してその出力を構成できます。ただし、この場合、 を実行する他のコンピュータへのシリアル接続が必要です。したがって、次のようなものを使用します。kgdb
kdb
kgdb
gdb
kgdb
kdb
kdboc
kdb
echo ttyS0 > /sys/module/kgdboc/parameters/kgdboc
kdb
との両方kgdb
が有効になっている場合、最初のものがデフォルトで実行されます。コマンドを使用して、シェルkgdb
からモードに入ることができます。と入力して戻ることもできます。モードになっている場合は、シリアルを使用して接続されている 2 番目のコンピューターを開き、引数としてyour を指定して、デバッグするコンピューターに接続するなどの方法を使用します。kdb
kgdb
kdb
$3#33
kgdb
gdb
vmlinux
target remote /dev/ttyS0
以上が基本です。詳細についてはDocumentation/DocBook/kgdb.tmpl
、カーネル ソースを参照してください。