回溯中的Android NDK调试和问号

时间:2012-02-25 21:01:44

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

在我再说一遍之前,让我先说明该软件是完全理智的,它取自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 让它运行几个小时没有任何崩溃,但是停止它并打印回溯 - 无论何时 - 总是返回相同的两行。

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

1 个答案:

答案 0 :(得分:0)

经过一些调查,我们发现了一些问题。 在某些情况下,我们的回溯有20或更多级别,有些几乎完全消失了。原因是用于本机编程的android库通常会从调试符号中删除并进行优化,因此系统无法提供比我们/您的代码中任何点更多的详细信息。

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