在我再说一遍之前,让我先说明该软件是完全理智的,它取自Android样品并且不会崩溃:)。
我的团队最近一直在努力从android获得一些理智的回溯。我们确实从LibC得到了输出......似乎这是我们从中获得有效回溯的唯一组件。其他任何东西只会生成问号和浅回溯(所以它通常会先断开 ?? ,除此之外不再显示任何内容,所以我们通常会看到 - 例如 - 只有 vsnprintf 和......那就是它。
我们一直在试验,最终创建了一个全新的项目,几乎完全是从样本中复制出来的:本机活动,几乎没有修改:
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+
和-g -ggdb
进行了实验,但它仍然为我们提供了相同的回溯:
(gdb) bt
#1 0x4005b384 in epoll_wait () from libc.so
#2 0x40120eaa in ?? ()
第二个调用 - 毫无疑问 - 本机代码,很可能是ALooper_pollAll
,它调用了libc的epoll_wait
。但没有参考android_main
。
代码非常好。我可以点击 c 让它运行几个小时没有任何崩溃,但是停止它并打印回溯 - 无论何时 - 总是返回相同的两行。
我们非常感谢所有的帮助和建议;我们的产品遇到了一些麻烦......我们现在能想到的唯一方法就是真正的中世纪。
答案 0 :(得分:0)
说,在实际设备上调试本机代码通常几乎是不可能的......