Аппаратная точка останова не подсказывает, когда она установлена, указывает адреса загрузки для разделовLinux

Ответить Пред. темаСлед. тема
Anonymous
 Аппаратная точка останова не подсказывает, когда она установлена, указывает адреса загрузки для разделов

Сообщение Anonymous »

Я использую lldb Connect QEMU для отладки ядра Linux. Ядро Linux было загружено по адресу 0x40200000, поэтому мне нужно использовать загрузку целевых модулей для определения адресов загрузки для разделов. Но если этот параметр установлен, аппаратная точка останова не может быть указана. Это ошибка?
  • Соберите последнюю версию ядра Linux для ARM64.
  • Запустите QEMU для отладки ядра

Код: Выделить всё

qemu-system-aarch64 -machine virt,accel=hvf -cpu host  \
-kernel arch/arm64/boot/Image \
-append "nokaslr"\
-nographic \
-m 2G \
-s \
-S
  • Запустите lldb и подключитесь к QEMU

Код: Выделить всё

lldb vmlinux
(lldb) gdb-remote 1234
(lldb) breakpoint set -H -a 0x41e300e8
(lldb) c
  • Это успешно намекнет на эту точку останова. Но при использовании целевых модулей загрузите, чтобы указать адреса символов отладки для разделов.

Код: Выделить всё

(lldb) target modules load --file vmlinux .head.text 0x40200000 .text 0x40210000 .rodata.text 0x41e2b800 .init.text 0x41e40000
Адрес загрузки раздела .text 0x40210000 .rodata.text 0x41e2b800 .init.text 0x41e40000 может отличаться, если версия Linux отличается. Вам нужно использовать 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 и проекту GitHub lldb. Но решения не было. Как установить точку останова после загрузки целевых модулей, чтобы указать адреса символов отладки для разделов. Или это ошибка lldb?

Подробнее здесь: https://stackoverflow.com/questions/786 ... r-sections
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Linux»