カーネルは理解する必要があります(6):kgdbを使用してカーネルをデバッグする
4445 ワード
カーネルは(一):システム呼び出しでHello,worldを印刷することを理解しなければなりません!
カーネルは理解しなければならない(二):ファイルシステムの初期プローブ
カーネルは理解する必要があります(3):Ubuntu 18.04 LTSカーネル4.15.0の再編成
カーネルは理解する必要があります(4):カーネルドライバの作成
カーネルは理解しなければならない(5):per-CPU変数
カーネルは理解する必要があります(6):kgdbを使用してカーネルをデバッグする
目次前言 仮想マシンシリアルポート設定 試験シリアルポート ターゲットマシン を構成する.デバッグ を開始デバッグ駆動モジュール 最後の 前言
カーネルをデバッグするのは決して楽なことではありません.ここではkgdbを使用してデバッグしています.あなたの理解は間違いありません.kernel版のgdbです.
VMシリアルポートの設定
まずカーネルを再コンパイルした仮想マシンをクローンしてから、両者のシリアルポートを設定します.ここではwinを使っていますが、mac側のシリアルポートはしばらくよくありませんので、不本意にwinを使いました.開発機 ターゲットマシン テストシリアルポート
ターゲット実行:
開発機はrootユーザーに切り替え、実行:
ターゲットマシンの構成
grubファイルを開くには:
次のように追加します.
更新grub:
Nokaslr、カーネルアドレスのランダム化は禁止されています.具体的な内容は自分でgoogleしてください.
そして再起動すると、nokaslrに関するヒントが表示されます.
デバッグの開始
次にkgdbのデバッグをテストし始め、ターゲットマシンはrootユーザーに切り替え、制御権限はkgdbに渡され、ターゲットマシンは偽死状態に入った.
開発機がセルフコンパイルカーネルディレクトリにアクセス
ここでブレークポイントをsys_にcloneは、皆さんがよく知っているforkが呼び出すので、基本的にしばらく待って、システムは自分で呼び出して、それからデバッグに入りました.それからgdbを使うのと同じです.
ドライバモジュールのデバッグ
自分の書き込みドライバモジュールをデバッグするには、まず通常の挿入モジュールが必要です.多くは言いません.次に、シンボルパラメータを挿入するために使用されるshellスクリプトがあります.
まず、ターゲットマシンmakeで.koファイルを生成し、この.koファイルを開発機の同名ディレクトリにコピーする必要があります.次に、ターゲットマシンに.koファイルを挿入してshellスクリプトで.text,.data,.bssセグメントのアドレスを取得します.これらのことがよく分からない場合は、自分でgoogleしてください.展開すると、ページがコントロールできませんから.
ターゲットマシンはrootユーザーに切り替え、制御権限はkgdbに渡し、ターゲットマシンは偽死状態に入る:
開発機がセルフコンパイルカーネルディレクトリにアクセス
通常の操作は前にも言いましたが、新しい操作でadd-symbol-fileで記号情報を挿入し、y確認を入力します.
次に、モジュール関数DriverWriteにブレークポイントを入力し、実行を開始します.
ターゲットマシンを切断します.もう偽ではありません.ユーザーステータスプログラムを実行します.
開発機はブレークポイントをトリガーします.
次に、gdbデバッグを通常使用するのと同じです.
最後に
ドライバモジュールを書く場合は、カーネルをデバッグする必要がありますが、上記の方法は唯一の方法ではありません.次の記事では、似たようなデバッグを行うためのより実用的なツールを紹介します.
転載先:https://juejin.im/post/5cb715bf6fb9a0686b472e1b
カーネルは理解しなければならない(二):ファイルシステムの初期プローブ
カーネルは理解する必要があります(3):Ubuntu 18.04 LTSカーネル4.15.0の再編成
カーネルは理解する必要があります(4):カーネルドライバの作成
カーネルは理解しなければならない(5):per-CPU変数
カーネルは理解する必要があります(6):kgdbを使用してカーネルをデバッグする
目次
カーネルをデバッグするのは決して楽なことではありません.ここではkgdbを使用してデバッグしています.あなたの理解は間違いありません.kernel版のgdbです.
VMシリアルポートの設定
まずカーネルを再コンパイルした仮想マシンをクローンしてから、両者のシリアルポートを設定します.ここではwinを使っていますが、mac側のシリアルポートはしばらくよくありませんので、不本意にwinを使いました.
ターゲット実行:
sudo cat /dev/ttyS1
開発機はrootユーザーに切り替え、実行:
echo “Hello, world!”>/dev/ttyS1
ターゲットマシンの構成
grubファイルを開くには:
sudo vim /etc/default/grub
次のように追加します.
GRUB_CMDLINE_LINUX="nokaslr rootdelay=90quiet splash text kgdboc=ttyS1,115200“
更新grub:
sudo update-grub
Nokaslr、カーネルアドレスのランダム化は禁止されています.具体的な内容は自分でgoogleしてください.
reboot
そして再起動すると、nokaslrに関するヒントが表示されます.
デバッグの開始
次にkgdbのデバッグをテストし始め、ターゲットマシンはrootユーザーに切り替え、制御権限はkgdbに渡され、ターゲットマシンは偽死状態に入った.
echo g > /proc/sysrq-trigger
開発機がセルフコンパイルカーネルディレクトリにアクセス
gdb ./vmlinux
target remote /dev/ttyS1
handle SIGSEGV noprint nostop pass
break sys_clone
c
s
ここでブレークポイントをsys_にcloneは、皆さんがよく知っているforkが呼び出すので、基本的にしばらく待って、システムは自分で呼び出して、それからデバッグに入りました.それからgdbを使うのと同じです.
ドライバモジュールのデバッグ
自分の書き込みドライバモジュールをデバッグするには、まず通常の挿入モジュールが必要です.多くは言いません.次に、シンボルパラメータを挿入するために使用されるshellスクリプトがあります.
#!/bin/bash
#
# usage: gdbline.sh module_name module_path
#
# This script will outputs an add-symbol-file line suitable for pasting into gdb to examine
# a loaded module.
#
cd /sys/module/$1/sections
echo -n add-symbol-file $2 `/bin/cat .text`
for section in .[a-z]* *; do
if [ $section != ".text" ]; then
echo " \\"
echo -n " -s" $section `/bin/cat $section`
fi
done
echo
まず、ターゲットマシンmakeで.koファイルを生成し、この.koファイルを開発機の同名ディレクトリにコピーする必要があります.次に、ターゲットマシンに.koファイルを挿入してshellスクリプトで.text,.data,.bssセグメントのアドレスを取得します.これらのことがよく分からない場合は、自分でgoogleしてください.展開すると、ページがコントロールできませんから.
ターゲットマシンはrootユーザーに切り替え、制御権限はkgdbに渡し、ターゲットマシンは偽死状態に入る:
echo g > /proc/sysrq-trigger
開発機がセルフコンパイルカーネルディレクトリにアクセス
gdb ./vmlinux
target remote /dev/ttyS1
handle SIGSEGV noprint nostop pass
通常の操作は前にも言いましたが、新しい操作でadd-symbol-fileで記号情報を挿入し、y確認を入力します.
次に、モジュール関数DriverWriteにブレークポイントを入力し、実行を開始します.
ターゲットマシンを切断します.もう偽ではありません.ユーザーステータスプログラムを実行します.
開発機はブレークポイントをトリガーします.
次に、gdbデバッグを通常使用するのと同じです.
最後に
ドライバモジュールを書く場合は、カーネルをデバッグする必要がありますが、上記の方法は唯一の方法ではありません.次の記事では、似たようなデバッグを行うためのより実用的なツールを紹介します.
転載先:https://juejin.im/post/5cb715bf6fb9a0686b472e1b