tma*_*dry 11 c++ android gdb android-ndk
我正在使用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)
但那不是函数指针.可能是什么,在应用程序崩溃后会有任何帮助吗?我猜它可能不是,如果它是一个堆指针或类似的东西.
有没有办法获得比这更好的堆栈跟踪?
据我所知,您必须自己构建和编写Android映像.它使您可以拥有除完整专有共享库之外的Android(可执行文件和共享库)的完整符号.
它还提供了使用gdb使用符号.
$ adb shell setprop debug.db.uid 32767
$ adb forward tcp:5039 tcp:5039
/*
program terminated and debuggerd caught exception like the following.
Use the PID number for gdbclient 3rd parameter.
I/DEBUG ( 2154): ********************************************************
I/DEBUG ( 2154): * Process 2508 has been suspended while crashing. To
I/DEBUG ( 2154): * attach gdbserver for a gdb connection on port 5039:
I/DEBUG ( 2154): *
I/DEBUG ( 2154): * adb shell gdbserver :5039 --attach 2508 &
I/DEBUG ( 2154): *
I/DEBUG ( 2154): * Press HOME key to let the process continue crashing.
I/DEBUG ( 2154): ********************************************************)
*/
$ gdbclient "" "" 2508
Run Code Online (Sandbox Code Playgroud)
编辑:
您仍然可以使用ndk-gdb而不是gdbclient命令.请指定共享库的符号文件.
(gdb) set solib-search-path (ANDROID_SOURCE_PATH)/out/target/product/(PRODUCT_NAME)/symbols/system/lib
Run Code Online (Sandbox Code Playgroud)
编辑2:
如果您不需要Android系统共享库的符号,只需adb pull共享库并将sollib-search-path设置为它.
$ adb pull /system/lib lib
$ ndk-gdb
...
(gdb) set solib-search-path lib
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3370 次 |
| 最近记录: |