Я развиваюсь на Android 2.3.x, используя NDK r5b. Иногда мой код падает, и я хотел бы знать, где. Я уже знаю, как получить соответствующую строку в моем приложении, когда у меня есть указатель (т.е. Из трассировки стека Android.)
Однако часто я вижу бесполезные трассировки стека (полный тракт стека):
#00 pc 0006561a /system/lib/egl/libGLESv2_adreno200.so
#01 pc 0006b900 /system/lib/egl/libGLESv2_adreno200.so
#02 pc 0005aac8 /system/lib/egl/libGLESv2_adreno200.so
#03 pc 0001687a /system/lib/egl/libGLESv1_CM_adreno200.so
#04 pc 000096ce /system/lib/egl/libGLESv1_CM_adreno200.so
или это:
(gdb) bt
#0 0xafd0c51c in epoll_wait () from /Volumes/SecureCode/webos/rta/android/obj/local/armeabi/libc.so
#1 0xa81216a6 in ?? ()
которые даже не упоминают мой код вообще.
Есть ли вообще способ улучшить трассировку стека? Почему некоторые функции библиотеки "непрозрачны" в том смысле, что они не позволяют обратному каналу "видеть" вызывающую функцию, вызывая остановку в трассировке стека?
Насколько я могу судить, единственным способом отладки такой проблемы является использование журнала в каждой точке программы и/или переход по каждой строке с помощью gdb.
Доступны ли ПЗУ с отладочными версиями этих Android-библиотек вместо исполняемых файлов, и это поможет? (Я использую один телефон исключительно для разработки, поэтому я не заинтересован в сохранении полной функциональности.) ( Фактически, я заметил, что путь к libc.so
в вышеуказанной трассе стека gdb
находится внутри мой каталог приложений. Могу ли я просто скомпоновать его с другим (отладочным) libc.so
, и это поможет?)
Последнее, что может помочь: в предыдущей трассировке стека из logcat (первая) моя библиотека упоминается в дампе необработанного стека:
stack:
...
...
4471cb88 00000028
4471cb8c afd4649c
4471cb90 80b4eb71 /data/data/com.audia.dev.rta/lib/librta.so
4471cb94 00299180
...
...
но это не указатель функции. Что это может быть, и может ли это быть полезной после того, как приложение разбилось? Я думаю, вероятно, нет, если это указатель кучи или что-то в этом роде.