Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/178.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何在事先没有可怕的读取日志权限的情况下收集本机stacktrace?_Android_Permissions_Android Ndk_Stack Trace_Crash Dumps - Fatal编程技术网

Android 如何在事先没有可怕的读取日志权限的情况下收集本机stacktrace?

Android 如何在事先没有可怕的读取日志权限的情况下收集本机stacktrace?,android,permissions,android-ndk,stack-trace,crash-dumps,Android,Permissions,Android Ndk,Stack Trace,Crash Dumps,我有一个应用程序,大部分是用C编写的本机代码:。当我发现一个崩溃(使用信号处理程序)时,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.e

我有一个应用程序,大部分是用C编写的本机代码:。当我发现一个崩溃(使用信号处理程序)时,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)
我需要的是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
据我所知,Android Market的崩溃报告不包括本地痕迹。。。是吗?

因此,我目前有我自己的崩溃捕捉器和报告器,如中所述,它将提供将您放入电子邮件撰写窗口并登录。这已经足够好了,但有一个问题:用户没有阅读(或不相信)包描述中的解释,并且被权限请求吓跑了

困扰我的不是这几条评论,而是不知有多少人甚至没有安装它就跑掉了-(

那么如何在崩溃时获得本机回溯而不使游戏需要可怕的日志许可?可能的解决方案包括:

  • 我错了,Android Market这些天真的会给我原生的痕迹吗
  • 当我遇到崩溃时,建议人们立即安装并运行?这是我目前倾向于的。有人得到过这样做的好例子,并有写得很好的解释文本吗
  • 在用信号处理器(我能做到)捕捉到崩溃后,有没有办法读取我自己的本地stacktrace?在Android/Bionic平台上比在glibc平台上更难,没有
    backtrace()
    可用。编辑:此处的大多数内容似乎都是必需的:-在项目中包含足够的内容将是过度的、臃肿的、困难的、不受支持的、在ABI更改/添加上脆弱的。这似乎不是一个很好的时间利用

编辑:从Jelly Bean开始,您和日志收集器都无法读取调试程序的输出,因为:-(

但是,Play Console的崩溃报告现在包括本机堆栈跟踪(至少截至2014年底),这使得这一切变得不那么必要

之前:

我将以git commit的形式给出我的答案:

正如我上面所暗示的,这是对Log Collector的委托。我像以前一样捕捉到崩溃(请参阅)像以前一样显示一个“oops,I crash”屏幕,如果用户单击报告,那么如果他们还没有安装Log Collector,我会提示他们安装Log Collector

如果我已经让用户安装了它,在它完成安装后,我会捕获添加的
包(Intent
并启动带有适当选项的日志收集器(我警告我将这样做)。这样用户就不会猜测他们应该单击“打开”,这将在没有我的目的地、主题和筛选器的情况下启动它


过滤器是值得拥有的,因为它们将电子邮件中发送的内容限制在可能相关的行中。这节省了用户的带宽和我的收件箱容量,并意味着用户可以更轻松地检查日志中是否没有敏感内容,因此更可能同意发送它。

有另一种方法可以访问所有日志,而无需有任何特殊权限,但需要在手机上启用远程调试。请查看开源。

在Java中,我们有Thread.setDefaultUncaughtExceptionHandler(),这就是ACRA获取堆栈跟踪的方式。在C/C++环境中是否没有对等的工具,因此您可以在这些异常离开代码之前捕获它们?您的目标应该是在堆栈跟踪信息进入日志之前收集它。一旦它进入日志,您将需要权限,因为日志不仅仅是您的输出put.@Commonware是的,我已经在C中设置了一个信号处理程序。正如我在最后一个要点中所说的,我的困难在于一旦我发现崩溃,如何获取stacktrace。平台可以这样做,以便将其放入日志中,但没有支持的API。如果您找到用于收集回溯的代码,请将代码复制到您的项目中,and使用您自己的实现。@Commonware下面的大多数内容似乎都是必需的:-在项目中包含足够的内容将是过度的、臃肿的、困难的、不受支持的、在ABI更改/添加上脆弱的…似乎并没有很好地利用时间。Phooey。对不起,我没有更好的建议--也许可以尝试一下
android ndk
Go观察组。