以下は主に Windows のバックグラウンドからのものですが、Linux でも問題ないと思います。コンセプトはそれほど変わらない。
最初にいくつかのインライン回答
私が理解していることから、大まかに言えば、ユーザーモードのデバッグにより、プロセスのプライベート仮想アドレスへのアクセスが提供されます。
正しい。
デバッグ セッションはそのプロセスに限定されます
.tlist
いいえ。WinDbg の/.attach
コマンドなどを使用して、同時に複数のプロセスにアタッチできます。
また、他のプロセスの仮想アドレス空間/データを上書きまたは改ざんすることはできません。
いいえ。WinDbg のed
コマンドなどを使用してメモリを変更できます。
カーネル モード デバッグは、複数のリソースへのフル アクセスを必要とする他のドライバーやカーネル プロセスへのアクセスを提供します。
正しい。
元のプロセス アドレス空間に加えて。
私の知る限り、物理 RAM にしかアクセスできません。仮想アドレス空間の一部がスワップされる可能性があるため、完全なアドレス空間は利用できません。
このことから、カーネル モードのデバッグはユーザー モードのデバッグよりも堅牢に見えると考えるようになります。
私は逆だと思います。カーネル モードのどこかに間違った値を書き込むと、PC がブルー スクリーンでクラッシュします。ユーザーモードでそれを行うと、クラッシュするのはアプリケーションだけです。
これは私に疑問を投げかけます.デバッグモードの両方のオプションが利用可能である場合、より堅牢なカーネルモードよりもユーザーモードを選択することが理にかなっていますか?
アプリケーションのみをデバッグし、ドライバーが関与しない場合は、ユーザー モード デバッグをお勧めします。
私見、カーネルモードのデバッグはより堅牢ではなく、より壊れやすいです-あなたは本当に最低レベルですべてを壊すことができます. ユーザー モード デバッグは、OS のクラッシュに対する一般的な保護を提供します。
多くの人がカーネルのデバッグを避けようとしていることに気付いたようです
私は同じことを観察します。そして、一度試してみると、通常はそれほど難しくありません。私のデバッグ ワークショップでは、プロセスとスレッドをカーネルの観点から説明し、カーネルで実際に実行しています。そして、ひとたびカーネルのデバッグを試みると、もはやそれほど謎ではなくなります。
より堅牢に見えるので、その理由は完全にはわかりません。
ええと、カーネル モードでは本当にすべてを爆破できます。
ユーザーモードのデバッグ
ユーザー モード デバッグは、すべての IDE で実行される既定の設定です。統合は通常良好で、一部の IDE では非常にネイティブに感じられます。
ユーザー モードのデバッグ中は、簡単です。ディスクにページアウトされたメモリにアクセスしても、OS は実行されたままでページインするだけなので、読み書きが可能です。
アプリケーション開発から知っているすべてにアクセスできます。スレッドがあり、それらを一時停止または再開できます。アプリケーション開発の知識は、デバッガーを操作するのに十分です。
ブレークポイントを設定し、変数を調べることができます (正しいシンボルがある限り)。
一部の種類のデバッグは、ユーザー モードでのみ使用できます。たとえば、.NET アプリケーションをデバッグするための WinDbg の SOS 拡張機能は、ユーザー モードでのみ機能します。
カーネルのデバッグ
カーネルのデバッグは非常に複雑です。通常、単純にローカル カーネル デバッグを行うことはできません。カーネルのどこかで停止した場合、デバッガをどのように制御しますか? システムがフリーズするだけです。したがって、カーネルのデバッグには 2 台の PC (または仮想 PC) が必要です。
カーネル モードのデバッグ中は、複雑です。アプリケーションの内部にいると、1 ミリ秒後に何らかの割り込みが発生し、まったく異なる処理が行われます。スレッドがあるだけでなく、アプリケーションの外部にあるコール スタックも処理する必要があります。CPU レジスタの内容、命令ポインターなどを確認できます。これらはすべて、「通常の」アプリ開発者が気にしたくないものです。
実装したすべてのものにアクセスできるだけではありません。また、Microsoft、Intel、NVidia、および他の多くの企業が開発したすべてのものにアクセスできます.
すべてのメモリに単純にアクセスすることはできません。これは、スワップ ファイルにページ アウトされた一部のメモリが最初にページ フォールトを生成し、次にディスク ドライバを使用してデータをフェッチし、他のデータをページ アウトする可能性があるためです。
カーネル モードでは非常に多くのことが行われているため、それを壊さないようにするには、これらすべてのトピックを専門的に理解する必要があります。
結論
ほとんどの開発者は、自分のソース コードを気にしたいだけです。したがって、プログラム (別名、アプリケーション、スクリプト、ツール、ゲーム) を作成している場合は、ユーザー モードのデバッグだけが必要です。「彼らのコード」がドライバーのコードである場合、もちろん、彼らはカーネルのデバッグを望んでいます。
そしてもちろん、セキュリティ スペシャリストとクラッカーは特権が必要なため、カーネル モードのデバッグを望んでいます。