1

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

4 に答える 4

1

一般に、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

于 2013-03-14T15:39:04.203 に答える
1

必要なのは、GNU デバッガーですgdb-gコードを機能させるには、フラグを付けてコンパイルする必要があることに注意してください。

例えば: $ gcc -g -o out -c file.c

次に、デバッガーを使用してプログラムを実行します。 $ gdb ./out <params>

gdb使い方がわからない場合は 、 のマニュアル ページを読む価値があります。$ man gdb

于 2013-03-14T15:24:31.077 に答える
1

はい、技術的には、kgdb を介してオンザフライでカーネルをデバッグすることができます (通常はシリアル ポートを介して接続されるため、別のマシンも使用できます)。

ただし、より実用的な方法は、カーネル ダンプを生成し、それをデバッグすることです (Google で検索してください。かなり簡単です)。

カーネルの実行部分を本当にデバッグする必要がある場合は、自分でワーカー スレッドを作成し、それをデバッグします (システムがロックアップすることはありません)。

関数 set_current_state(TASK_STOPPED) を使用してワーカー スレッドを一時停止できます。「凍結解除」するには、set_task_state(task_mm_struct_pointer, TASK_INTERRUPTIBLE) を使用する必要があります。

于 2015-04-22T17:52:33.107 に答える
0

カーネル自体には、その目的のために設計されたツールが少なくとも 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を実行することです。これにより、デバッガーがモードに切り替わります。本格的なデバッガー ( ) を接続し、カーネル イメージを提供して、カーネル内のすべてのシンボルにアクセスできるようにします。と同じ方法でアクティブ化でき、カーネル パラメータを使用してその出力を構成できます。ただし、この場合、 を実行する他のコンピュータへのシリアル接続が必要です。したがって、次のようなものを使用します。kgdbkdbkgdbgdbkgdbkdbkdbockdb

    echo ttyS0 > /sys/module/kgdboc/parameters/kgdboc
    

    kdbとの両方kgdbが有効になっている場合、最初のものがデフォルトで実行されます。コマンドを使用して、シェルkgdbからモードに入ることができます。と入力して戻ることもできます。モードになっている場合は、シリアルを使用して接続されている 2 番目のコンピューターを開き、引数としてyour を指定して、デバッグするコンピューターに接続するなどの方法を使用します。kdbkgdbkdb$3#33kgdbgdbvmlinuxtarget remote /dev/ttyS0

以上が基本です。詳細についてはDocumentation/DocBook/kgdb.tmpl、カーネル ソースを参照してください。

于 2015-04-23T15:58:07.753 に答える