2013-09-26 3 views
2

Я разрабатываю приложение, которое сбой в коде NDK с SIG_SEGV. Это заставляет приложение висеть в течение примерно 15 секунд, а затем Android предложит мне закрыть его. Это выводит трассировку стека java на logcat, но я не вижу трассировки стека для NDK. Я перенаправил stdio с ADB, но я до сих пор не вижу трассировку стека. Как распечатать трассировку стека С ++ для logcat или там, где печатается?
Использование Android 2.3.4
NDK R8bНе удалось найти android NDK stack-trace

ответ

1

Диалог «принудительное закрытие» публикуется сбойным приложением. Это звучит как крах Dalvik, а не родной сбой. Если процесс получает SIGSEGV, он должен уведомлять об отладке и выходе из него, оставляя след в журнале. Возможно, было бы полезно включить вывод logcat из аварии в ваш вопрос.

Во всяком случае, последние версии Android включают в себя родные следы, смешанные с дампом стека Dalvik, когда потоки находятся в собственном коде. Если у вас есть внедренное устройство, работающее с последней версией Android, вы можете попросить debuggerd сбросить трассировку всех потоков с помощью adb shell debuggerd -b <pid>.

Вы находитесь на Android 2.3.x, но ничто из этого не поможет. Ваш лучший вариант - отправить процесс фатальным сигналом, чтобы получить сбой аварийной ситуации debuggerd. Сигнал должен быть отправлен в два раза, например .:

adb shell kill -6 <pid> ; sleep 1 ; adb shell kill -6 <pid> 

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

+0

Я получаю «не удалось убить pid 26646: операция не разрешена» – agoaj

+0

Я забыл отметить, что вам нужно (ответ обновлен). – fadden

0

Вы можете использовать следующий код, чтобы получить Log

__android_log_print(ANDROID_LOG_ERROR, "TRACKERS", "%s", Str); 

и добавьте следующую библиотеку

#include <android/log.h> 
+2

Это не будет печатать трассировку стека. – agoaj

+0

вы не можете распечатать трассировку стека в NDK, скорее, вы можете печатать журналы в своем не предоставленном в NDK, но только предоставленные данные регистрируются в нем –

+0

Если вы не можете распечатать трассировку стека, тогда такие инструменты, как ndk-stack, будут довольно бессмысленны для включить в sdk. – agoaj

0

Существует инструмент под названием CheckJNI и учебник по настройке - there.

Смежные вопросы