qemu環境でGDBを使用して段階的にカーネルブートシーケンスを理解しようとしています。以下はqemuでGDBを使用してLinuxカーネルをデバッグすると、機能や特定のアドレスにヒットできない
私の設定です: -
他の端末
arm-none-linux-gnueabi-gdb vmlinux
Reading symbols from vmlinux...done.
(gdb) target remote :1234
Remote debugging using :1234
0x60000000 in ??()
で
~/Qemu_arm/bin/qemu-system-arm -M vexpress-a9 -dtb ./arch/arm/boot/dts/vexpress-v2p-ca9.dtb -kernel ./arch/arm/boot/zImage -append "root=/dev/mmcblk0 console=ttyAMA0" -sd ../Images/RootFS.ext3 -serial stdio -s -S
を実行している端末のIMで私の質問は、/アーチ/腕にコードの設定方法ブレークポイントであります/ boot/compressed/*ファイル。
たとえば、misc.cで定義されたdecompress_kernelのブレークポイントを設定しようとしました。
ケース1:
(gdb) b decompress_kernel
Function "decompress_kernel" not defined.
Make breakpoint pending on future shared library load? (y or [n]) y
Breakpoint 2 (decompress_kernel) pending.
(gdb) c
Continuing.
上記1のQEMUが起動される機能をヒットすることができません。
ケース2:この場合
(gdb) b *0x80008000
Breakpoint 1 at 0x80008000: file arch/arm/kernel/head.S, line 89.
(gdb) c
Continuing.
もその代わりにヒットすることはできませんQEMUは起動中です。
ケース3:
(gdb) b start_kernel
Breakpoint 1 at 0x8064d8d8: file init/main.c, line 498.
(gdb) c
Continuing.
Breakpoint 1, start_kernel() at init/main.c:498
498 {
(gdb)
この場合、機能が当たっていると私はステップによって可能なデバッグ段階です。
注:私は、デバッグ、早期のprintkを有効にし、だから私のクエリはあなたがシンボルをロードしていないので、あなたがstart_kernelの前の任意の関数にブレークポイントを置くことができません
1)why some funtions are not able to hit break points?
2)Is this qemu limitation or do i need enable something more ?
3)do i need to append any extra parameters ?
4)how to Debug early kernel booting
ちょうど関数が呼ばれているかどうかは不思議です。 printkを追加して、その関数が呼び出されていることを確認できますか? – Jeyaram
@Jeyaram明らかに、関数は、一度カーネルが起動すると、汎用関数として "Uncompressing Linux ....... done、kernel"を呼び出す必要があります。これはdecompress_kernel()関数 –
が同意したものです。それも私が混乱しているものです。しかし、カーネルイメージが圧縮されていないとどうなりますか?あなたは "Linuxの圧縮解除.......完了、カーネルの起動"というメッセージが表示されていますか? – Jeyaram