GDB с поддержкой потоков для ядра Linux - PullRequest
2 голосов
/ 05 марта 2012

Я использую GDB, подключенный к последовательному порту виртуальной машины, для отладки ядра Linux.

Мне интересно, есть ли какие-нибудь патчи / плагины, которые могут заставить GDB понять некоторую структуру данных ядра Linux и сделать его "осведомленным о потоке"?

Под этим я подразумеваю под GDB Iможет видеть, сколько потоков ядра существует, их статус, а для каждого потока - информацию их стека.

Ответы [ 3 ]

2 голосов

libvmi

https://github.com/libvmi/libvmi

Этот проект выполняет "LibVMI: Упрощенный самоанализ виртуальной машины", который звучит очень близко.

Этот проект вВ частности https://github.com/Wenzel/pyvmidbg использует libvmi и демонстрирует демонстрационное видео об отладке формы пользовательского приложения Windows внутри нее, без конфликтов памяти.

По состоянию на май 2019 года, однако, по состоянию на май 2019 года, обаиз которых можно преодолеть с помощью некоторой работы: https://github.com/Wenzel/pyvmidbg/issues/24

  • Разбор памяти Linux еще не завершен
  • требуется Xen

Разработчик этого проектатакже ответил на: https://stackoverflow.com/a/56369454/895245

Реализация его с этими библиотеками была бы, по моему мнению, лучшим способом достижения этой цели сегодня.

Linaro lkd-python

Во-первых, эта страница Linaro утверждает, что имеет рабочую настройку: https://wiki.linaro.org/LandingTeams/ST/GDB, которая позволяет вам выполнять обычные операции с потоками, такие как thread, bt и т. Д., Но она полагается на GDBвилка.Я проверю это позже.В 2016 году https://youtu.be/pqn5hIrz3A8 говорит, что реализация была на C, а не на Python-скриптах, к сожалению, что было бы лучше и избежать разветвления.Эскиз для lkd-python можно найти по адресу: https://git.linaro.org/people/lee.jones/kieran.bingham/binutils-gdb.git/log/?h=lkd-python

Встроенные GDB-скрипты ядра Linux + мой мозг

Затем я попытался увидеть, что я могсделать со встроенными в ядро ​​скриптами Python v4.17 + некоторое ручное вмешательство в качестве прототипа, но пока не совсем.

Я тестировал с помощью этой высокоавтоматизированной установки QEMU + Buildroot.

Сначала выполните процедуру, описанную мной: Как отладить ядро ​​Linux с помощью GDB и QEMU? , чтобы заставить работать GDB.

Затем, как описаноat: Как отлаживать модули ядра Linux с помощью QEMU? запустить GDB с:

gdb -ex add-auto-load-safe-path /full/path/to/linux/kernel

Это загружает скрипты GDB Python внутри дерева из scripts/gdb.

Один из этих сценариев предоставляет:

lx-ps

, в котором перечислены все потоки в формате:

0xffff88000ed08000 1 init
0xffff88000ed08ac0 2 kthreadd

Первое поле - это адрес структуры task_struct, поэтому мы можем видеть всеструктура с:

p ((struct task_struct)*0xffff88000ed08000 

, что теоретически должно позволить нам получить любую информацию о процессе, которую мы хотимess.

Теперь я хотел найти ПК.Для ARM я видел: Найти программный счетчик процесса в ядре , и я попытался:

task_pt_regs((struct thread_info *)((struct task_struct)*0xffffffc00e8f8000))->uregs[ARM_pc]

, но task_pt_regs - это #define, а GDB не может видеть определения без -ggdb3: Как вывести постоянную # в GDB? , которая явно не установлена?

1 голос
/ 30 мая 2019

pyvmidbg разработчик здесь.

Я добавлю некоторые уточнения: да, цель проекта - создать кроссплатформенную заглушку GDB с поддержкой гостей.

Большая часть реализации уже сделана для Windows, где мы знаем о процессах и контексте их потоков. Можно перехватить определенный процесс (cmd.exe в демоверсии) и выполнить его пошаговое выполнение (пока это ограничено 1 процессом с 1 потоком), а также присоединиться к точке входа нового процесса.

Что касается Linux, я посмотрел на внутренние компоненты и ресурсы, которые мог найти, но мне не хватает всей картины, чтобы понять, как я могу: - перехватить задачу, когда она запланирована (core/sched.c:switch_to()?) - прочитать состояние задачи (KTRAP_FRAME эквивалент Windows для Linux?)

Я задал вопрос о SO, но никто не ответил: / Внутренние компоненты переключателя контекста Linux: как процесс возвращается в пользовательское пространство после переключения?

Если вы можете помочь с этим, я могу помочь вам в реализации:)

Что касается поддержки гипервизора, в настоящее время в интерфейсе Libvmi полностью поддерживается только Xen. Я добавил раздел в README, чтобы описать, где мы находимся с точки зрения API VMI с другими гипервизорами.

Спасибо!

1 голос
/ 05 марта 2012

Я не думаю, что GDB понимает структуры данных ядра, что делает их зависимыми от версии. GDB использует ptrace для сбора информации о любом запущенном процессе.

Это все, что я знаю: (

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...