Как исправить ошибку GDB: невозможно получить доступ к памяти по адресу - PullRequest
0 голосов
/ 18 октября 2019

Когда я отлаживаю свой модуль ядра Linux, используя gdb и qemu, я получаю результаты несогласованности. Когда я ставлю точку останова или разбираю свою собственную функцию, иногда я получаю «Невозможно получить доступ к памяти по адресу: {function_address}» и иногда я получаю дизассемблированный код

Я создал скрипт автоматизациикоторый поднимает linux vm используя qemu. Скрипт передает файлы моего модуля ядра в vm, собирает модуль ядра и загружает его. Сценарий получает адреса загруженных разделов из "/ sys / module / {имя ko} / section /" ".text" ".bss" ".data" и затем загружает файл ko с полученными адресами разделов в gdb.

Я должен упомянуть, что я отключаю kaslr и компилирую LKM с символами отладки.

Затем я пытаюсь «отключить» свою собственную функцию, и иногда происходит сбой.

Qemu cmdline: sudo qemu-system-x86_64 -enable-kvm -hda ~ / ubuntu.qcow -m 4096 -kernel /boot/vmlinuz-5.0.0-23-generic -append "root = / dev /sda1 nokaslr "-net пользователь, hostfwd = tcp :: 10022-: 22 -net nic -snapshot -s

Загрузка символов LKM cmdline: add-symbol-file $ {module_path} $ {text} -s. data $ {data} -s .bss $ {bss}

Я ожидаю, что вывод команды disas будет дизассемблированным кодом, но, например, фактический результат иногда таков: Дамп кода ассемблерадля функции: 0xffffffffc0344000 <+0>: невозможно получить доступ к памяти по адресу 0xffffffffc0344000

...