1

在我多说之前,让我先说明该软件非常健全,它取自 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并让它运行几个小时而不会发生任何崩溃,但停止它并打印回溯 - 无论何时 - 总是返回相同的两行。

我们将非常感谢所有的帮助和建议;我们的产品遇到了一些麻烦,而且……我们现在能想到的唯一方法是真正的中世纪。

4

1 回答 1

0

经过更多的调查,我们弄清楚了。在某些情况下,我们的回溯有 20 个或更多级别,在某些情况下几乎完全消失了。原因是用于本机编程的 android 库通常从调试符号中剥离并进行了优化,因此系统无法提供比我们/您的代码更多的细节。

也就是说,在实际设备上调试本机代码通常几乎是不可能的......

于 2012-04-01T16:17:26.597 回答