手机重启后,我能获取logcat日志吗?

25

我正在测试一款长时间运行的安卓应用程序。我使用Eclipse,并且通过USB线将手机连接到电脑,手机就在我旁边。由于这是一个长时间运行的服务,我在其运行过程中会做一些其他工作,并不时地检查logcat日志以确保一切按预期进行。

几分钟前,我注意到手机重新启动了。我认为它之前也这样做过,因为那可能解释了一些奇怪的应用程序行为。我迅速切换到Eclipse来查看发生了什么,并发现在重启期间logcat日志被(似乎)清除了。因此,无法得知我的应用程序是否崩溃了(并拖垮了手机?!)或者是否还有其他问题导致手机和我的应用程序均崩溃。

有没有办法找出发生了什么?这是一部开发手机,所以我不知道它是否经常自行重新启动/崩溃,还是只在运行我的应用程序时出现这种情况。它是一款运行Firmware版本2.1-update1的Motorola Droid。

谢谢你的帮助。


1
如果您知道如何打开手机的控制台(抱歉,我不知道),那么这可能会对您有所帮助。您可以添加-f参数并指定一个文件,以便将所有日志导出到该文件中,以便在重启后获取它。 - Mike
1
可能不适用于您的情况,但如果有帮助的话...我发现使用过多的系统资源可能会导致难以通过日志跟踪的虚假重新启动。例如,如果您有某些生成意图的东西,但您没有监听它们(例如,如果您的监听线程被阻塞),那么就会出现这种情况。 - Michael
1
可能是Android:如何在内核崩溃后获取内核日志?的重复问题。 - childno͡.de
4个回答

17

我不知道如何做到这一点。但是,你可以使用adb启动logcat,使用命令adb logcat -v time > logcat.txt,然后再次运行你的应用程序。如果它再次崩溃,那么你可以去查看在你的机器上logcat.txt中的输出。


3
请注意,文件写入是带缓存的,因此在重启之前的最后几个单词可能不会被刷新到文件中。 - adamk
2
@eldarerathis:你猜对了 :) - 我用过几次,证明它很有用。顺便说一句 - 运行 adb shell logcat -f file.txt 可能比仅使用 shell 管道更好(在缓冲意义上),但这只是一个猜测。 - adamk
2
我成功捕获了一个崩溃,并从日志中得到了这行信息:08-12 11:22:50.568 E/mdm_panicd( 1002): Modem has reset, reboot system! 谢谢!这对我很有帮助。 - Scott Saunders
1
@OneWorld:尝试将“shell”从命令中去掉。adb shell logcat 将尝试在手机上运行logcat并将输出文件保存到手机的文件系统中。不使用shell执行应该会导致logcat在您的计算机上运行。如果您想将日志保存到手机上,可以尝试使用可写目录的绝对路径 - 例如 adb shell logcat -f /sdcard/file.txt 或其他类似的命令。 - eldarerathis
1
谢谢这个。我刚刚使用它非常成功地解决了一个问题,即当模拟器运行4.4.2时,每次尝试运行我的应用程序时都会重新启动。它捕获了与“SensorService”有关的SIGABRT事件。在我禁用应用程序中的内部传感器后,它现在在模拟器上运行得很好。 - Trevor
显示剩余3条评论

16
你可以使用adb bugreport,其中应包含有关偶发性重新启动的一些信息,例如内核崩溃、最后的logcat条目等。
但请注意:此工具输出大量信息,因此您需要深入挖掘以找到所需信息。

3
哇,这给了我20,000多行。虽然我不知道该如何处理它,但我确定这是很好的信息! - Scott Saunders
2
@Scott:我建议你先在应用程序的包ID、日志标签等内部搜索,看看是否有与你的应用相关的内容。 - adamk
我正在查看它。不过我没有看到重新启动之前的任何内容。也许我等待的时间太长了?距离上次重启大约已经两个小时了。 - Scott Saunders

0
我也遇到了这个问题。应该可以编写一个应用程序,将logcat输出连续保存到SD卡上的文件中。市场上有一些应用程序显示logcat输出,因此我知道它可以从应用程序内部访问。
@djv,在我的手机上,我无法在根目录或/data中找到/log目录。

Android中日志不会刷新到磁盘,而是存储在循环内存缓冲区中。因此,在手机重新启动后它们不会保留。 - Alex Lockwood
1
@AlexLockwood,那不太正确了(不再是)。请看 https://dev59.com/dGkw5IYBdhLWcg3wu9Fg#10525021 /data/dontpanic - childno͡.de
我的评论是基于我在这本书中读到的信息:http://shop.oreilly.com/product/0636920021094.do 如果日志不断写入磁盘设备,性能会非常差。所以我坚持我的评论。此外,由于应用程序无法访问logcat自API 16以来,这个答案现在绝对不再正确。 - Alex Lockwood

0

我认为在一次重大的Android更新中,崩溃日志已经从/proc/last_kmsg移动到了/sys/fs/pstore/console-ramoops-0


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接