Подтвердить что ты не робот

Отладка Android NDK в Eclipse - как остановить segfaults/SIGILL, которые возникают только при входе в собственный код

Я настроил отладку в Eclipse для собственного кода, используя Android NDK (в Windows XP, с Cygwin) до стадии, где я могу установить точки останова как в Java, так и в собственном коде, и отладчик будет правильно их разорвать. Моя проблема заключается в том, что, когда вы переходите через собственный код, я часто получаю ошибки сегментации /SIGILL, которые не возникают при продолжении прохождения точки останова.

  • Мое приложение отлаживается, как определено в AndroidManifest.xml
  • Я изменил (NDK)/build/core/build-binary.mk, чтобы он не удалял отладочные символы, когда APP_OPTIM определяется как debug, который находится в файле Application.mk в моей jni-каталоге
  • Я определил LOCAL_CFLAGS := -g -O0 в файле Android.mk, и я также пробовал каждый из этих флагов отдельно

Я читал, что эта проблема связана с созданным оптимизированным кодом, но отключить оптимизацию с помощью -O0 не влияет на мою проблему. Я также сталкивался с использованием флага NDK_BUILD=1 при создании, но определение debuggable=true в AndroidManifest.xml, по-видимому, имеет тот же эффект.

Я пробовал это как на эмуляторе (работает 2.3.3), так и на устройстве (работает 2.2 - на удивление не было проблем с потоками, которые я ожидал), с аналогичными результатами (хотя, если я правильно помню, сбои произошло в разных точках кода).

Есть ли у кого-нибудь представление о возможных исправлениях/шагах, которые я мог попробовать, и/или смог успешно выполнить собственный код без проблем?

Большое спасибо


Изменить: Это никогда не было действительно решено, но для тех, кто хочет взглянуть на мой гид для отладки NDK, вы можете найти его .

Изменить 2: Ответы, которые я получил на этот вопрос, появились, когда появились новые версии NDK, и этот вопрос теперь может быть лишним. Мой гид все еще может работать, но я не использовал NDK какое-то время, поэтому я не могу ручаться за его правильную правильность. Я принял ответ, который у меня есть, поскольку все три в основном говорят одно и то же, и это был первый, который должен быть представлен.

4b9b3361

Ответ 1

Если это работает для armeabi, а не для armeabi-v7a, это должно быть проблемой сборки. Разархивируйте файл apk в каталог bin и проверьте, что файлы библиотеки как в armeabi, так и в armeabi-v7a одинаковы.

Ответ 2

Одна вещь, которую я заметил, это то, что armeabi-v7a не работает хорошо для отладки собственного кода на определенных устройствах. Попробуйте построить только армейцы и посмотрите, поможет ли это.

Ответ 3

скомпилируйте исходные файлы С++ с помощью -march = armv4

В build/core/combo/arm/yourarch.mk поместите -march = armv4, а затем сделайте mm -B showcommands, чтобы проверить, было ли оно использовано.

Тогда gdbserver сможет обработать его.