【问题标题】:Android NDK debugging and question marks in backtraceAndroid NDK 调试和回溯中的问号
【发布时间】:2012-02-25 21:01:44
【问题描述】:

在我再说什么之前,让我先声明一下该软件非常健全,它取自 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+-g -ggdb,但它仍然给我们相同的回溯:

(gdb) bt
#1  0x4005b384 in epoll_wait () from libc.so
#2  0x40120eaa in ?? ()

第二个调用是 - 毫无疑问 - 本机代码,很可能是 ALooper_pollAll,它调用 libc 的 epoll_wait。但没有参考到达android_main

代码非常好。我可以点击 c 让它运行几个小时而不会发生任何崩溃,但停止它并打印回溯 - 无论何时 - 总是返回相同的两行。

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

【问题讨论】:

    标签: android android-ndk java-native-interface backtrace


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-12-28
      • 2020-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多