设置指定节的加载地址时硬件断点不提示

问题描述 投票:0回答:1

我正在使用 lldb 连接 QEMU 来调试 Linux 内核。 Linux内核已加载到0x40200000,所以我必须使用目标模块加载来定义部分的加载地址。但设置此项后,无法提示硬件断点。是bug吗?

  1. 为 ARM64 构建最新的 Linux 内核。

  2. 启动 QEMU 来调试内核

qemu-system-aarch64 -machine virt,accel=hvf -cpu host  \
  -kernel arch/arm64/boot/Image \
  -append "nokaslr"\
  -nographic \
  -m 2G \
  -s \
  -S
  1. 启动 lldb 并连接到 QEMU
lldb vmlinux
(lldb) gdb-remote 1234
(lldb) breakpoint set -H -a 0x41e300e8
(lldb) c
  1. 这将成功提示该断点。但是当使用
    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
  1. 设置好后。无论使用虚拟地址还是物理地址设置断点,都不会命中断点。 通过物理地址设置断点:
(lldb) breakpoint set -H -a 0x41e300f4

通过虚拟地址设置断点:

(lldb) breakpoint set -H -a 0xffff800081c300f4
(lldb) c

现在不会命断点!!!

  1. 我的环境是:

操作系统: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?

linux breakpoints qemu arm64 lldb
1个回答
0
投票

好吧,这应该是lldb的bug。当我用 gdb 替换调试器的客户端后,所有断点都可以命中,包括软断点。当 linux MMU 未启用时,LLDB 设置断点不起作用。

© www.soinside.com 2019 - 2024. All rights reserved.