gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 15:13:00 24 4
gpt4 key购买 nike

我正在使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com