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

标签 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

或者这个:

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

根本不提我的代码。

有没有比这更好的堆栈跟踪方法?为什么某些库函数“不透明”,因为它们不允许回溯“看透”调用函数,从而导致堆栈跟踪停止?

据我所知,调试此类问题的唯一方法是在程序的每一点使用日志记录和/或使用 gdb 单步执行每一行。

是否有适用于这些 Android 库的调试版本而不是运行时版本的 ROM,这会有帮助吗? (我只使用一部手机进行开发,所以我不关心保持全部功能。)(实际上,我注意到 libc.so 的路径 在上面的 gdb 堆栈跟踪中是在我的应用程序目录中。我可以用不同的(调试)libc.so 打包它吗,这会有帮助吗?)

最后一件事可能会有所帮助:在上面来自 logcat(第一个)的堆栈跟踪中,原始堆栈转储中提到了我的库:

stack:
  ...
  ...
  4471cb88  00000028  
  4471cb8c  afd4649c  
  4471cb90  80b4eb71  /data/data/com.audia.dev.rta/lib/librta.so
  4471cb94  00299180  
  ...
  ...

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

最佳答案

Is there any way at all to get better stack traces than this?

据我所知,你必须自己构建和编写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

已编辑:

您仍然可以使用 ndk-gdb 而不是 gdbclient 命令。请指定共享库的符号文件。

(gdb) set solib-search-path (ANDROID_SOURCE_PATH)/out/target/product/(PRODUCT_NAME)/symbols/system/lib

编辑 2:

如果不需要Android系统共享库的symbols,adb pull shared libraries并设置sollib-search-path即可。

$ adb pull /system/lib lib

$ ndk-gdb
...
(gdb) set solib-search-path lib

关于c++ - 堆栈跟踪在到达我的代码之前停止(在使用 NDK 的 Android 上),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6353825/

相关文章:

macos - gdb 布局 asm 在 mac 上不起作用?

c++ - 是否可以为 std::string 和 std::wstring 编写一个函数?

c++ - x++ 用于 C++ 中的对象

c++ - 将输入读入动态大小的数组

java - Android:蓝牙 - 如何读取传入数据

android - 如何监控 Android 上 CPU 的使用情况?

gdb - 如何在 gdb 事后访问 STL 类(例如 std::string)?

c++ - 从 DLL 导出前向声明的类

android - Android 中的支付网关集成

c - gdb结构值在 "next"后全部变为0