GDBSERVER завершает работу при запуске

Я пытаюсь отлаживать смешанный код на Android (Java/C/C++). Мое целевое устройство — Vizio 1008. Код работает на эмуляторе, и я могу отлаживать его из Eclipse с помощью GDB. Однако я не могу сделать это на реальном устройстве.

После нескольких дней борьбы с этим я локализовал проблему:

Когда GDBSERVER запускается на устройстве (успешно), он немедленно завершает работу с сообщением: «Запрошен неизвестный регистр d0». Поэтому сеанс отладки невозможен. Я также попробовал отладчик DS-5 от ARM. GDBSERVER остается подключенным, но завершается при попытке подключения из удаленного отладчика. Я попробовал отладочный вывод GDBSERVER, но он не дает никакой полезной информации.

Что еще более странно, я пробовал любую версию GDBSERVER, которую только мог получить, и все они вели себя так. Однако я нашел GDBSERVER в одной из старых версий Google NDK (3 или 4 версии назад). И эта версия РАБОТАЕТ!!! Но отладчик (на хосте) очень скоро умирает (ошибка сегментации), даже я знаю, что программа в порядке.

Я посмотрел исходный код GDBSERVER, и, похоже, эта ошибка связана с последовательностью запуска, когда GDBSERVER проверяет оборудование. Вероятно, это связано с сопроцессором с плавающей запятой, но я не уверен, так как это сообщение об ошибке довольно общее.

Если это имеет значение, я разрабатываю Windows с помощью Google NDK. Код на 99% состоит из C/C++ с оболочкой Java и несколькими функциями, реализованными на Java (потоковые вызовы HTTP). Опять же, приложение работает на устройстве и может быть отлажено (как Java, так и C/C++) на эмуляторе. Я также могу отлаживать часть Java на устройстве.

Кто-нибудь знает, что это может быть? И как это исправить? Это Визио?

Заранее спасибо.


person user1653514    schedule 07.09.2012    source источник


Ответы (1)


Похоже на проблему, с которой я столкнулся, пытаясь выполнить встроенную отладку. Проблема заключалась в том, что процессор arm, используемый в устройстве, поддерживал как набор инструкций vfp/neon, так и набор инструкций iwmmx, и, по-видимому, gdbserver предполагает, что они являются взаимоисключающими. Чтобы исправить, к сожалению, вам придется возиться с исходным кодом gdbserver. Ниже приведено исправление из ссылка. Вам нужно будет отредактировать файл linux-arm-low.c в исходном дереве gdbserver:

static void
arm_arch_setup (void)
{
  arm_hwcap = 0;
  if (arm_get_hwcap (&arm_hwcap) == 0)
  {
    init_registers_arm ();
    return;
  }

/* gdbserver assumes that only one of VFP or IWMMXT is available, which may
 not be true.  In that case, gdbserver fails at run-time with "Unknown
 register d0 requested".  For now, pretend IWMMXT is missing when both are
 available. */
if ((arm_hwcap & HWCAP_VFP) && (arm_hwcap & HWCAP_IWMMXT))
  arm_hwcap &= ~HWCAP_IWMMXT;

Однако точное место, где вы должны изменить код, зависит от версии gdb (сервера). Я точно знаю, что в случае с gdb 7.7 это немного отличается. После того, как вы изменили его таким образом, вы должны собрать его с помощью gcc из ndk, чтобы он был связан с бионикой и прочим. У меня нет точной инструкции для этого, потому что я не делал это сам. Я должен подчеркнуть, что в конечном итоге это скорее обходной путь, чем правильное исправление. Я не знаю, как gdbserver, исправленный таким образом, ведет себя при запуске кода, который на самом деле содержит инструкции iwmmx. По крайней мере, вы, вероятно, не сможете получить дампы регистров iwmmx.

person orbdan    schedule 17.04.2014