我正在使用GCC编译器在Linux上工作.当我的C++程序崩溃时,我希望它能自动生成一个堆栈跟踪.
我的程序由许多不同的用户运行,它也可以在Linux,Windows和Macintosh上运行(所有版本都使用编译gcc).
我希望我的程序能够在崩溃时生成堆栈跟踪,并且在用户下次运行它时,它会询问他们是否可以将堆栈跟踪发送给我,以便我可以追踪问题.我可以处理向我发送信息,但我不知道如何生成跟踪字符串.有任何想法吗?
我正在进行的项目要求我编写跨平台程序实现的android部分.
构建了一组核心功能,并将其包含在我的应用程序中android-ndk.我发现在本机代码中发生的任何异常/崩溃只会在现在和最后再次报告.发生错误时,我会收到以下行为之一:
NullPointerException(通常在每个本机代码异常的相同位置,这是一个巨大的痛苦).通常会让我花费一段时间来尝试调试为什么Java代码抛出错误只是为了发现Java代码很好并且本机代码错误已被完全掩盖.我似乎无法找到任何方法来"隔离"我的代码以防止在本机代码中发生的错误.Try/catch语句被彻底忽略了.除了我的代码被指责为罪魁祸首之外,我甚至没有机会警告用户而不是发生错误.
有人可以帮我解决如何应对崩溃本机代码的情况吗?
java-native-interface android exception-handling nullpointerexception android-ndk
由于某种原因,我不能在我这里的ICS设备上发生本地(C/C++)地址/堆栈跟踪.
在我的Nexus 7上,当本机库崩溃时,不会输出任何内容.log.redirect-stdio设置为通过时设置为1,/system/default.prop并且/data/local.prop都不起作用.
我试着设置log.redirect-stdio来true使用stop,setprop,start的命令,但仍然没有原生的堆栈跟踪是输出到logcat的.
谷歌我的意思是来吧......我每天都因为与我的错误,不可预测的关系而对Google产生越来越多的信心.
android stack-trace android-ndk nexus-s android-4.0-ice-cream-sandwich
我正在使用NDK r5b在Android 2.3.x上进行开发.偶尔我的代码会崩溃,我想知道在哪里.当我有一个指针(即来自Android的堆栈跟踪)时,我已经知道如何在我的应用程序中获取相应的行.
但是,我经常看到像这样无用的堆栈跟踪(完整堆栈跟踪):
#00 pc 0006561a /system/lib/egl/libGLESv2_adreno200.so
#01 pc 0006b900 /system/lib/egl/libGLESv2_adreno200.so
#02 pc 0005aac8 /system/lib/egl/libGLESv2_adreno200.so
#03 pc 0001687a /system/lib/egl/libGLESv1_CM_adreno200.so
#04 pc 000096ce /system/lib/egl/libGLESv1_CM_adreno200.so
Run Code Online (Sandbox Code Playgroud)
或这个:
(gdb) bt
#0 0xafd0c51c in epoll_wait () from /Volumes/SecureCode/webos/rta/android/obj/local/armeabi/libc.so
#1 0xa81216a6 in ?? ()
Run Code Online (Sandbox Code Playgroud)
根本没有提到我的代码.
有没有办法获得比这更好的堆栈跟踪?为什么某些库函数"不透明",因为它们不允许回溯"透视"到调用函数,导致堆栈跟踪中的停止?
据我所知,调试这样的问题的唯一方法是在程序中的每个点使用日志记录和/或使用gdb逐步执行每一行.
是否有ROM可用于这些Android库的调试版本而不是运行时库,这会有帮助吗?(我只使用一部手机进行开发,所以我不担心保持全部功能.)(实际上,我注意到libc.so上面gdb堆栈跟踪的路径在我的应用程序目录中.我可能只是用不同的方式打包它(调试)libc.so,那会有帮助吗?)
最后一件事可能有所帮助:在logcat(第一个)的上述堆栈跟踪中,我的库在原始堆栈转储中被提及:
stack:
...
...
4471cb88 00000028
4471cb8c afd4649c
4471cb90 80b4eb71 /data/data/com.audia.dev.rta/lib/librta.so
4471cb94 00299180
...
...
Run Code Online (Sandbox Code Playgroud)
但那不是函数指针.可能是什么,在应用程序崩溃后会有任何帮助吗?我猜它可能不是,如果它是一个堆指针或类似的东西.
我正试图在这样的Valgring下启动一个Java程序(在adb shell中):
valgrind am start -a android.intent.action.MAIN -n com.me.myapp/.MainActivity
Run Code Online (Sandbox Code Playgroud)
我越来越:
==2362== Memcheck, a memory error detector
==2362== Copyright (C) 2002-2012, and GNU GPL'd, by Julian Seward et al.
==2362== Using Valgrind-3.8.1 and LibVEX; rerun with -h for copyright info
==2362== Command: am
==2362==
/system/bin/sh: am: No such file or directory
Run Code Online (Sandbox Code Playgroud) 我有一个应用程序,主要是用C编写的本机代码:Simon Tatham的谜题.当我遇到崩溃(使用信号处理程序)时,Java回溯只会告诉我问题的模糊区域:
W System.err: at name.boyle.chris.sgtpuzzles.SGTPuzzles.resizeEvent(Native Method)
W System.err: at name.boyle.chris.sgtpuzzles.SGTPuzzles$1.handleMessage(SGTPuzzles.java:126)
W System.err: at android.os.Handler.dispatchMessage(Handler.java:99)
Run Code Online (Sandbox Code Playgroud)
为了有任何诊断希望,我需要的是Android框架写入日志的本机回溯:
I DEBUG : #02 pc 0003e8ae /data/data/name.boyle.chris.sgtpuzzles/lib/libpuzzles.so
I DEBUG : #03 pc 0003ed62 /data/data/name.boyle.chris.sgtpuzzles/lib/libpuzzles.so
I DEBUG : #04 pc 00059060 /data/data/name.boyle.chris.sgtpuzzles/lib/libpuzzles.so
Run Code Online (Sandbox Code Playgroud)
据我所知,Android Market的崩溃报告不包括原生痕迹......是吗?
因此,我目前有我自己的崩溃捕手和记者,在上一个问题中描述,它将提供你带入登录的电子邮件撰写窗口.这很有效,有一个问题:用户不会阅读(或不相信)包描述中的解释,并且会被权限请求吓跑.

这些评论并不是让我感到烦恼,而是那些在没有安装的情况下逃跑的未知人数.:-(
那么如何在不使游戏需要一个可怕的日志权限的情况下获得崩溃的原生回溯呢?可能的方案包括:
backtrace().编辑:这里的大多数东西似乎都是必需的:http://github.com/android/platform_system_core/tree/master/debuggerd - 在项目中包含足够的东西会对ABI造成过度,臃肿,困难,不支持和脆弱修改/添加.似乎没有好好利用时间.我正在编写一个使用命名管道与C ++应用程序通信的Java应用程序。当C ++应用程序死亡时,Java获得SIGPIPE,而Java应用程序死亡。
在C / C ++上,我知道如何捕获该信号并忽略它。是否可以在Android / Java上执行类似的操作?
我的应用程序在Android 2.3.3到4.1.2下运行良好,但自Android 4.2.2和Android 4.3以来,我有一个
fatal signal 11 (SIGSEGV) at 0x00....
Run Code Online (Sandbox Code Playgroud)
当我关闭蓝牙插座时.
我通过很多论坛搜索,主要的反应是
BluetoothSocket.close();
Run Code Online (Sandbox Code Playgroud)
是从两个不同的线程同时调用,但在我的代码中并非如此.
我在A4.1.2下使用三星Galaxy Note 2(工作正常),在A4.2.2和4.3上使用Nexus 4.
提前感谢您的建议!
编辑1:这是操纵蓝牙插槽的2个线程.
首先 :
/**
* This thread runs while attempting to make an outgoing connection with a
* device. It runs straight through; the connection either succeeds or
* fails.
*/
private class ConnectThread extends Thread {
private final BluetoothSocket mmSocket;
private final BluetoothDevice mmDevice;
//private final UUID MY_UUID = java.util.UUID.randomUUID();
public ConnectThread(BluetoothDevice device) {
if(D) Log.d(TAG, "/S4B/ start connectThread "); …Run Code Online (Sandbox Code Playgroud) 我的项目使用捕获崩溃的模块并在android系统中发送.处理本机崩溃时,本机代码将执行某些操作,然后从JNI执行Java调用.它适用于Dalvik.但它在使用ART的5.0以上的Android版本中失败了.因为ART在本机信号处理期间阻止来自JNI的任何Java调用.它说ART信号处理使用备用信号堆栈,所以在信号处理过程中,不能调用java方法吗?还有其他方法吗?
流:
1.Java调用本机方法,但本机方法崩溃.
2.本机崩溃处理程序捕获信号以处理崩溃.
3.在崩溃处理过程中,调用JNI方法但失败了
12-31 20:36:02.516 7845-7957 A/art: art/runtime/check_jni.cc:65] JNI DETECTED ERROR IN APPLICATION: JNI IsSameObject called with pending exception 'java.lang.StackOverflowError' thrown in...
in call to IsSameObject
stack=0x9fff8000-0x9fffa000 stackSize=1036KB
Run Code Online (Sandbox Code Playgroud)
参考:https://code.google.com/p/android/issues/detail?
id = 162663如果有人使用ART和/或Bionic可以调查一下,那就太好了.
java-native-interface android exception-handling native-code
android ×8
android-ndk ×5
stack-trace ×3
c++ ×2
android-4.0-ice-cream-sandwich ×1
assert ×1
bluetooth ×1
crash ×1
crash-dumps ×1
eclipse ×1
gcc ×1
gdb ×1
native-code ×1
nexus-4 ×1
nexus-s ×1
permissions ×1
pipe ×1
signals ×1
sockets ×1
unix ×1
valgrind ×1