如何在没有可怕的READ_LOGS权限的前提下收集本机堆栈跟踪?

时间:2011-09-17 16:45:02

标签: android permissions android-ndk stack-trace crash-dumps

我有一个应用程序,主要是用C编写的本机代码:Simon Tatham's Puzzles。当我遇到崩溃(使用信号处理程序)时,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的崩溃报告不包含原生痕迹......是吗?

因此,我目前拥有自己的崩溃捕手和记者,在this previous question中描述,它将提供一个电子邮件撰写窗口,其中包含您的登录信息。这很有效,但有一个问题:用户不会阅读(或不相信)包描述中的解释,并且会被权限请求吓跑。

Permission request to read logs; comments about it from users

这些评论并不是让我感到烦恼,而是那些在没有安装的情况下逃跑的未知人数。 : - (

所以如何在不让游戏需要可怕的日志权限的情况下获得本机回溯?可能的解决方案包括:

  • 我错了,这些天Android Market实际上会给我原生痕迹?
  • 当我发现崩溃时,人们会立即安装并运行Log Collector?这就是我目前所倾向的。任何人都有这样做的好例子,并附有写得好的解释性文字?
  • 用信号处理程序(我可以做)抓住了崩溃,有什么方法可以读取我自己的本机堆栈跟踪吗?在Android / Bionic上比在glibc平台上更难,没有backtrace()可用。 编辑:此处的大部分内容似乎都是必需的:http://github.com/android/platform_system_core/tree/master/debuggerd - 在项目中包含足够的内容会对ABI更改/添加造成过度,臃肿,困难,不受支持和脆弱。似乎没有好好利用时间。

2 个答案:

答案 0 :(得分:6)

编辑:从Jelly Bean开始,您和Log Collector都无法读取debuggerd的输出,因为READ_LOGS went away。 : - (

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

<强>此前:

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

https://github.com/chrisboyle/sgtpuzzles/commit/e9917f1ffe93f9d9963463db849e3768beafccee

这是对Log Collector的委托,正如我在上面所暗示的那样。我像以前一样抓住崩溃(参见my previous discussion of how to do that),像以前一样显示“oops,I crashed”屏幕,如果用户点击Report,那么我提示他们安装Log Collector(如果还没有)。

如果我已经关闭了用户安装它,一旦安装完成,我就会抓住PACKAGE_ADDED Intent并使用适当的选项启动Log Collector(我警告说我会这样做) 。这样就不会让用户猜测他们应该点击Open,这会在没有我的目标,主题和过滤器的情况下启动它。

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

答案 1 :(得分:0)

还有另一种方法可以在没有任何特殊权限的情况下访问所有日志,但需要在手机上启用远程调试。看一下开源rootless Logcat app