Отладка ядра Android - PullRequest
60 голосов
/ 14 июля 2011

Я экспериментировал с получением kgdb для работы с Nexus One.

Я вытащил ядро ​​из https://android.googlesource.com и включил все, что связано с kgdb, включая kgdbts тестированиеиспользуя menuconfig.Успешно собрал ядро ​​и прошил его на устройство (которое разблокировано с рутом и запущено CyanogenMod 7)

Я также следовал инструкциям на http://bootloader.wikidot.com/android:kgdb, чтобы позволить USB-соединению действовать как последовательный портсоединение в соответствии с требованиями kgdb (и успешно протестированы соединения от ttyACM0 до ttyGS0).

Существуют следующие папки, указывающие, что kgdboc и kgdbts встроены в ядро:

/sys/modules/kgdboc/parameters
/sys/modules/kgdbts/parameters

Ниже приведен вывод dmesg, показывающий, что kgdbts тестирование завершено и показывает, что (я думаю) является успешным завершением тестов:

# dmesg | grep kgdb
<6>[   12.974060] kgdb: Registered I/O driver kgdbts.
<6>[   12.981781] kgdbts:RUN plant and detach test
<6>[   12.995178] kgdbts:RUN sw breakpoint test
<6>[   13.002441] kgdbts:RUN bad memory access test
<6>[   13.010864] kgdbts:RUN singlestep test 1000 iterations
<6>[   13.019042] kgdbts:RUN singlestep [0/1000]
<6>[   13.077850] kgdbts:RUN singlestep [100/1000]
<6>[   13.132720] kgdbts:RUN singlestep [200/1000]
<6>[   13.187500] kgdbts:RUN singlestep [300/1000]
<6>[   13.242370] kgdbts:RUN singlestep [400/1000]
<6>[   13.297149] kgdbts:RUN singlestep [500/1000]
<6>[   13.351928] kgdbts:RUN singlestep [600/1000]
<6>[   13.406829] kgdbts:RUN singlestep [700/1000]
<6>[   13.461578] kgdbts:RUN singlestep [800/1000]
<6>[   13.516540] kgdbts:RUN singlestep [900/1000]
<6>[   13.570922] kgdbts:RUN do_fork for 100 breakpoints
<6>[   21.117645] kgdb: Unregistered I/O driver kgdbts, debugger disabled.

Я считаю, что проблемаЯ сталкиваюсь с тем, чтобы заставить ядро ​​запускать kgdb.

# echo -n g > /proc/sysrq-trigger

. Это приводит к тому, что я возвращаюсь в командную строку, и (я думаю) это предполагает заморозку всего и отправку приглашения через usb.который используется в качестве последовательного порта psuedo, так как телефон не имеет реального.

Из того, что я понял из моего исследования, подсказка является suppПредполагается, что это триггер, который позволит мне выдавать

(gdb) target remote /dev/ttyACM0

и подключаться к сеансу отладки с ядром.

Я также протестировал /proc/sysrq-trigger с b и c просто подтвердите, что я могу передать некоторые команды sysrq.

Итак, мой вопрос после моей многословной попытки предоставить как можно больше информации: почему g не запускает отладчик?

Это моя первая попытка отладки ядра в любой системе, и у меня не осталось способов сформулировать свой поиск в Google, поэтому я обращаюсь к вам.Спасибо!

(я также безуспешно пытался поместить kdgbwait в командную строку ядра, так как считаю, что это еще не поддерживается ядром Android)

Ответы [ 3 ]

6 голосов
/ 31 августа 2011

Вопросы по Android Kernel редки на [SO], так как никто не ответил, я предоставил свои выводы по этой проблеме.К сожалению, у меня нет нексуса, чтобы проверить это, так что этот ответ не предназначен для поэтапного решения вашей проблемы, но должен указывать вам правильное направление, где искать.

Единственныйполезный ресурс, который я нашел по этой проблеме, находится в патче LKML от Dongdong Deng , так что это вряд ли проблема с конфигурацией, так как они обычно многочисленны и широко известны.

Это указывает на то, чтопроблема с вашей сборкой ядра.Я хотел бы начать снова с последних версий CM и посмотреть, исчезнет ли проблема.

Если это не удалось, попробуйте сообщить об этом в команду cyanogen и посмотреть, является ли это известной проблемой или имеет простой обходной путь.

В качестве последнего средства вы можете попробовать патч, если версии совместимы,Единственная альтернатива - закатать рукава и начать взламывать ядро ​​CM, чтобы включить патч.

Удачи.

2 голосов
/ 17 августа 2015

Нашел этот пост из связанного поста и хотел сказать, что я только что опубликовал некоторую работу, которую я сделал, чтобы заставить это работать на Nexus 6, если кому-то интересно:

http://www.contextis.com/resources/blog/kgdb-android-debugging-kernel-boss/

Интересно, что проблема ОП с sysrq была той, с которой я тоже сталкивался. Причиной такого поведения является то, что KGDB неправильно инициализировался, поэтому он не может установить обработчик для триггера 'g' (kgdb). Вот почему все остальные команды sysrq по-прежнему работают.

Более длинное объяснение (спасибо @Robert):

Чтобы это работало, мне пришлось создать кабель отладки UART на основе этого блога Accuvant . Это довольно простая схема, которая состоит из базового напряжения FTDI 3.3 В (доступного от SparkFun на момент написания), а также 4 резисторов (2 x 1 кОм, 1 x 1,2 кОм и 1 x 100 Ом) и 4-элементный разъем для наушников Tip-Ring-Ring-Ring (TRRS). Резисторы по существу обеспечивают делитель напряжения, чтобы уменьшить напряжение 3,3 В до чего-то более безопасного для вашего телефона. Вставив аудиоразъем с другим концом, подключенным к вашей плате, аудиоподсистема распознает, что напряжение (~ 2,8 В) на одном из выводов, и знает, что через этот кабель можно получить интерфейс UART. Выключатель FTDI подключается к вашему ПК через USB, и отсюда вы можете получать доступ к консольным сообщениям через эмулятор терминала, такой как minicom. Однако теперь у вас есть последовательный интерфейс через тот же механизм, и это то, что мы можем использовать для соединения KGDB.

Таким образом, на данный момент некоторые относительно незначительные изменения требуются для последовательного драйвера Nexus 6 (msm_serial_hs_lite.c) для поддержки KGDB (в частности, способности выполнять операции ввода-вывода атомарных символов). Я просто перенес эти изменения из основного кода Linux Kernel в качестве главы под названием Стивен Бойд, который проделал тяжелую работу с полным MSM (Qualcomm) последовательным драйвером msm_serial.c. Его изменения могут быть найдены здесь или просто искать "msm_serial: добавить поддержку poll_" в Google. Порт не был сложным, и мой код может быть найден на github .

Кроме того, вам нужно иметь возможность собрать собственное ядро ​​для вашего N6, которое Google предоставляет много информации о . Затем вам нужно создать загрузочный образ, который содержит модификации KGDB в репозитории github. Я взял стандартное ядро ​​из https://developers.google.com/android/nexus/images,, извлек его (используя abootimg -x) и затем использовал следующую команду, чтобы перепаковать его с моим собственным ядром (zImage-dtb) и дополнительными параметрами командной строки, чтобы гарантировать загрузку KGDB и укажите на мой последовательный порт так:

abootimg -u boot.img -k zImage-dtb -c 'cmdline=console=ttyHSL0,115200,n8 kgdboc=ttyHSL0,115200 kgdbretry=4'

Создав мой boot.img, я мог загрузить его с помощью команды fastboot boot boot.img, открыть оболочку adb, а затем запустить точку останова в ядре Android с помощью команды:

echo -n g > /proc/sysrq-trigger

Для полноты картины стоит упомянуть, что вам нужны привилегии суперпользователя для доступа к / proc / sysrq-trigger, поэтому вам нужен root.

Когда телефон остановлен и ваш отладочный кабель подключен, запустите версию GDB для ARM на вашем хост-компьютере с вашим несжатым ядром в качестве аргумента (например, arm-eabi-gdb ./vmlinux). Примечание: я использую Ubuntu 14.04 и использую arm-eabi-gdb из каталога 'prebuilts' в моем исходном хранилище AOSP. Наконец, введите следующие команды:

set remoteflow off
set remotebaud 115200
target remote /dev/ttyUSB0

Если все хорошо, это должно немедленно привести к точке останова kgdb (которую произвела ваша запись в / proc / sysrq-trigger), и вы можете начать отладку.

2 голосов
/ 08 ноября 2011

У меня нет опыта работы с аппаратным обеспечением Android, но я сделал ядро, скомпилированное в kgdb, работающее как клиент VirtualBox, и с хоста подключаюсь к гостю через виртуальный последовательный порт и использую gdb (со стандартной командой target remote)Я могу пройти всю загрузку виртуального гостевого ядра - с помощью kgdbwait.Без этого я могу написать модуль ядра, который ничего не делает, кроме как для реализации встроенной сборки, которая называется "int 13", которая равна 0xcc.После загрузки на стороне хоста последовательного соединения появится точка останова, и тогда я смогу установить точку останова и продолжить работу ядра.Это работает, потому что kgdb обрабатывает исключение "int 13".Если вы явно создадите исключение другого типа, например "* p = 0", и p указывает на NULL, вы все равно получите точку останова, но я сомневаюсь, что вы можете продолжить выполнение.

...