カーネルモードでクラッシュすると、デバッガ自体でさえメモリ内のデータ構造どこでもが破損する可能性があります。その弾丸を作ることは難しいです。
通常のデバッグでは、デバッガとデバッグしているものの2つのプロセスが完全に分離されています。彼らは平等に作られた "仲間"です。デバッグ中のプロセスは、デバッガが何をしていてもデバッガには触れません(おそらくそれが存在するかどうかはわかりません)。一方、デバッガはデバッグ中のプロセスと対話することができ、固定された予測可能な方法ですべての通常のユーザープロセスに常に適用されます。
例:ローカルデバッグの場合はどのようにキーボードインターフェイスをデバッグし、シリアルポートを経由する場合はRS232コードをデバッグしますか? NICドライバまたはネットワークスタック(ネットワーク経由の場合)それらのいずれかにブレークポイントを設定すると、デバッガを制御するデバイスにアクセスできなくなるため、回復不能になります。最悪のシナリオでは、どのようにカーネルデバッガをデバッグしますか? GDBでは、少なくとも理論的にはGDBインスタンスをGDBの別のインスタンスにアタッチすることができます。カーネル空間では、物を仲介する上にレイヤーがないので、それは不可能です。
私はそれを理解していると思います。私が間違っていると私を修正してください:それは、カーネルモードで実行されているすべてのプロセスが同じアドレス空間を共有していることを意味しますか?それが本当なら、それには理由がありますか? – qdii
はいカーネルアドレス空間はすべてのプロセスで共有されています。 Linuxカーネル用の汎用カーネルコード(特定のデバイスのドライバではない)がある場合は、QEMUを使用できます。 QEMU上で動作するソフトウェアにgdbを添付することができます。したがって、gdbを使用しているユーザコードのようなカーネルコードを実行することができます。しかし、あなたのコードがエミュレーションが利用できないデバイスドライバなどのデバイス固有のものであれば、あなたのソフトウェアは実行されません。 – Saurabh
@ user420536質問は実際にLinuxやアーキテクチャを指定していません。非常に異なる場合があります。 – Flexo