在我多说之前,让我先说明该软件非常健全,它取自 Android 示例并且不会崩溃 :)。
我的团队最近一直在努力从 android 获得一些理智的回溯。我们确实从 LibC 中获得了输出,并且……这似乎是我们从中获得有效回溯的唯一组件。其他任何东西都只会产生问号和浅回溯(所以它通常一开始就中断??,除此之外什么都没有显示,所以我们通常看到 - 例如 - 只有vsnprintf和......就是这样。
我们一直在试验,最终创建了一个几乎完全从样本中复制的全新项目:native-activity,几乎没有修改:
AndroidManifest.xml 设置了正确的标志:
<application android:label="@string/app_name" android:hasCode="false" android:debuggable="true" >
build.xml 有一个预构建规则:
<target name="-pre-build"> <exec executable="${env.ANDROID_NDK}/ndk-build" failonerror="true"> <arg value="NDK_DEBUG=1" /> </exec> </target>
Application.mk有一个定义:
APP_OPTIM := debug
甚至Android.mk文件也进行了一些调整:
LOCAL_MODULE := test LOCAL_SRC_FILES := main.c LOCAL_LDLIBS := -llog -landroid -lEGL -lGLESv1_CM LOCAL_STATIC_LIBRARIES := android_native_app_glue LOCAL_CFLAGS := -g3 -ggdb -O0 LOCAL_CPPFLAGS := -g3 -ggdb -O0 include $(BUILD_SHARED_LIBRARY)
我们尝试了-gstabs+
and -g -ggdb
,但它仍然给了我们相同的回溯:
(gdb) bt
#1 0x4005b384 in epoll_wait () from libc.so
#2 0x40120eaa in ?? ()
毫无疑问,第二个调用是本地代码,很可能ALooper_pollAll
是调用 libc 的epoll_wait
. 但没有参考达到android_main
.
代码非常好。我可以点击c并让它运行几个小时而不会发生任何崩溃,但停止它并打印回溯 - 无论何时 - 总是返回相同的两行。
我们将非常感谢所有的帮助和建议;我们的产品遇到了一些麻烦,而且……我们现在能想到的唯一方法是真正的中世纪。