【问题标题】:How to check if the app has crashed/stop working using adb shell?如何使用 adb shell 检查应用程序是否崩溃/停止工作?
【发布时间】:2021-09-10 20:43:15
【问题描述】:

我目前正在这样做:

-d:只调用一次logcat并返回

adb shell logcat -d

然后我在日志中进行正则表达式搜索 Caused by.*"apk name"

问题是,有时它确实会在日志中生成此消息,但应用程序仍然响应/工作。 想问问有没有更好的方法来检查应用程序是否停止工作,使用 adb shell 命令。

我的意思是停止工作,它仍然打开但不响应任何内容。

注意:我不是在寻找导致应用崩溃的原因,只要它停止工作即可。

【问题讨论】:

    标签: android adb


    【解决方案1】:

    你知道吗:

    Android 在遇到应用无响应 (ANR) 时会存储跟踪信息。

    您可以在这里获取更多信息:https://developer.android.com/topic/performance/vitals/anr#diagnosing_anrs

    有了这些信息,我可以通过以下命令确定应用是否处于 ANR 状态:

    首先,获取应用的 PID:

    adb shell ps | grep <app.package.name>
    

    第二列的值是PID。然后,启用 root 访问权限:

    adb root
    

    最后,检查 /data/anr/:

    adb shell grep <PID> /data/anr/*<app.package.name>*
    

    请注意,最后一个命令中的星号 (*) 很重要。如果您看到类似下面的内容,则您的应用处于 ANR 状态。

    /data/anr/traces_app.package.name.txt:----- pid 11828 at 2021-09-06 03:00:05 -----
    /data/anr/traces_app.package.name.txt:  | sysTid=11828 nice=0 cgrp=default sched=0/0 handle=0xb6f5cbec
    /data/anr/traces_app.package.name.txt:----- end 11828 -----
    

    【讨论】:

    • 能否分享一下windows中的命令?我几乎没有使用 Linux 命令的经验。
    • 哪个命令/s?如果您指的是 grep 命令,您可以这样做:adb shell,然后是 ps | grep &lt;app.package.name&gt;
    • 当我调用adb shell ps | grep app.name 时,它返回 3 行值,我应该使用哪一个? i.imgur.com/ZAus9XU.png 我还检查了文件夹 /data/anr/ 并且只有一个名为 traces.txt 的文件。
    • 试试 pid 3483。
    • 只有一个 traces.txt?我想你有一个旧的安卓设备。尝试发出命令 `adb shell grep 3483 /data/anr/traces.txt 看看你得到了什么。
    【解决方案2】:

    你可以试试:

    adb shell pid of the app 
    

    如果找到此类进程,则返回 PID,否则返回空字符串。

    对于pid你可以使用adn shell ps

    【讨论】:

    • 我正在等待应用再次崩溃,然后我可以测试你的答案,但是如果应用仍然打开但不负责任,PID 会返回空吗?还是只知道应用程序是否不再运行会有所帮助?
    • 如果应用程序没有完全终止,它可能会显示在 pid 虽然应用程序处于挂起状态
    【解决方案3】:

    like user1506104 建议:在我的 oculus quest 2 中寻找 deovr 播放器:

    ... MINGW64 /e/pt
    $ ./adb shell ps | grep com.deovr.gearvr
    u0_a90 3936 695 3212880 614872 0 0 S com.deovr.gearvr
    
    $ ./adb shell ps -p 3936
    USER      PID  PPID     VSZ RSS WCHAN      ADDR S NAME        
    u0_a90    3936  695 3212880 616096 0       0 S com.deovr.gearvr
    

    【讨论】:

      【解决方案4】:

      无需使用 grep。 Android 中的 ps 可以通过 COMM 值过滤(java 应用程序包名的后 15 个字符)

      假设我们要检查 com.android.phone 是否正在运行:

      adb shell ps m.android.phone
      USER     PID   PPID  VSIZE  RSS     WCHAN    PC         NAME
      radio     1389  277   515960 33964 ffffffff 4024c270 S com.android.phone
      

      按 COMM 值过滤选项已从 Android 7.0 中的 ps 中删除。要在 Android 7.0 中按名称检查正在运行的进程,您可以使用 pidof 命令:

      adb shell pidof com.android.phone
      

      如果找到此类进程,则返回 PID,否则返回空字符串。

      【讨论】:

      • 如果没有 grep 这个命令会怎样? $ grep apkname /data/anr/traces.txt
      • 这是另一个问题,首先请接受我的回答作为正确答案。 tnx
      【解决方案5】:

      您还可以使用命令直接了解错误堆栈发生的情况,您还可以访问任何崩溃:

      adb logcat *:E
      

      在这里您还可以获得更多选择: https://developer.android.com/studio/command-line/logcat#options

      获取实际的 ANR 堆栈 - 检查此线程如何从 shell 获取它: Android: How to obtain data/anr/traces.txt from Samsung Galaxy Tab?

      【讨论】:

        猜你喜欢
        • 2012-06-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-06
        相关资源
        最近更新 更多