相关疑难解决方法(0)

堆栈跟踪在到达我的代码之前停止(在使用NDK的Android上)

我正在使用NDK r5b在Android 2.3.x上进行开发.偶尔我的代码会崩溃,我想知道在哪里.当我有一个指针(即来自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
Run Code Online (Sandbox Code Playgroud)

或这个:

(gdb) bt
#0  0xafd0c51c in epoll_wait () from /Volumes/SecureCode/webos/rta/android/obj/local/armeabi/libc.so
#1  0xa81216a6 in ?? ()
Run Code Online (Sandbox Code Playgroud)

根本没有提到我的代码.

有没有办法获得比这更好的堆栈跟踪?为什么某些库函数"不透明",因为它们不允许回溯"透视"到调用函数,导致堆栈跟踪中的停止?

据我所知,调试这样的问题的唯一方法是在程序中的每个点使用日志记录和/或使用gdb逐步执行每一行.

是否有ROM可用于这些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  
  ...
  ...
Run Code Online (Sandbox Code Playgroud)

但那不是函数指针.可能是什么,在应用程序崩溃后会有任何帮助吗?我猜它可能不是,如果它是一个堆指针或类似的东西.

c++ android gdb android-ndk

11
推荐指数
1
解决办法
3370
查看次数

标签 统计

android ×1

android-ndk ×1

c++ ×1

gdb ×1