我正在使用 lldb 连接 QEMU 来调试 Linux 内核。 Linux内核已加载到0x40200000,所以我必须使用目标模块加载来定义部分的加载地址。但设置此项后,无法提示硬件断点。是bug吗?
为 ARM64 构建最新的 Linux 内核。
启动 QEMU 来调试内核
qemu-system-aarch64 -machine virt,accel=hvf -cpu host \
-kernel arch/arm64/boot/Image \
-append "nokaslr"\
-nographic \
-m 2G \
-s \
-S
lldb vmlinux
(lldb) gdb-remote 1234
(lldb) breakpoint set -H -a 0x41e300e8
(lldb) c
target modules load
指定节的调试符号地址时。(lldb) target modules load --file vmlinux .head.text 0x40200000 .text 0x40210000 .rodata.text 0x41e2b800 .init.text 0x41e40000
linux版本不同时,节加载地址 .text 0x40210000 .rodata.text 0x41e2b800 .init.text 0x41e40000 可能会有所不同。您需要使用 readelf 来获取 vmlinux 中的虚拟地址。并计算:
Section load address = Sections start address - (Linux Entry address - Qemu load address)
e.g. .rodata.text
readelf -S out/arm64/vmlinux
There are 51 section headers, starting at offset 0x17316b88:
Section Headers:
[Nr] Name Type Address Off Size ES Flg Lk Inf Al
[ 1] .head.text PROGBITS ffff800080000000 010000 010000 00 AX 0 0 65536
[19] .rodata.text PROGBITS ffff800081c2b800 1c3b800 005800 00 AX 0 0 2048
0xffff800081c2b800 - ( 0xffff800080000000 - 0x40200000) = 0x41e2b800
(lldb) breakpoint set -H -a 0x41e300f4
通过虚拟地址设置断点:
(lldb) breakpoint set -H -a 0xffff800081c300f4
(lldb) c
现在不会命断点!!!
操作系统:Mac OS 14.5 电脑:Macbook Pro M2 Max QEMU:9.0.1 LLDB:18.1.7 Linux 内核版本:6.10-rc4
我通过google和lldb的github项目进行了搜索。但没有解决办法。使用
target modules load
指定节的调试符号地址后如何设置断点。或者这是lldb的一个bug?
好吧,这应该是lldb的bug。当我用 gdb 替换调试器的客户端后,所有断点都可以命中,包括软断点。当 linux MMU 未启用时,LLDB 设置断点不起作用。