在AOSP - RK3288盒子上,在主线程中停止断点后几秒钟发生ANR崩溃

9
我有一个RK3288盒子,正在开发一款应用程序。
我遇到的问题一直困扰着我。我无法调试任何内容。
每次我连接调试器并在主线程上设置断点后,我的应用程序在几秒钟后崩溃。 下面是当这种情况发生时的日志记录:
05-02 20:52:39.734 459-534/system_process I/InputDispatcher: Application is not responding: Window{3026b626 u0 com.kushtrim.playground/com.kushtrim.playground.MainActivity}.  It has been 5001.8ms since event, 5001.6ms since wait started.  Reason: Waiting to send non-key event because the touched window has not finished processing certain input events that were delivered to it over 500.0ms ago.  Wait queue length: 17.  Wait queue head age: 5505.1ms.
05-02 20:52:39.794 459-534/system_process I/WindowManagerService: Input event dispatching timed out sending to com.kushtrim.playground/com.kushtrim.playground.MainActivity.  Reason: Waiting to send non-key event because the touched window has not finished processing certain input events that were delivered to it over 500.0ms ago.  Wait queue length: 17.  Wait queue head age: 5505.1ms.
05-02 20:52:39.811 459-482/system_process I/Process: Sending signal. PID: 8790 SIG: 3
05-02 20:52:39.812 8790-8799/com.kushtrim.playground I/art: Thread[5,tid=8799,WaitingInMainSignalCatcherLoop,Thread*=0xb7294b58,peer=0x12c000a0,"Signal Catcher"]: reacting to signal 3
05-02 20:52:39.970 459-482/system_process I/Process: Sending signal. PID: 459 SIG: 3
05-02 20:52:39.970 459-468/system_process I/art: Thread[5,tid=468,WaitingInMainSignalCatcherLoop,Thread*=0xb7113410,peer=0x12c020a0,"Signal Catcher"]: reacting to signal 3
05-02 20:52:39.970 8790-8799/com.kushtrim.playground I/art: Wrote stack traces to '/data/anr/traces.txt'
05-02 20:52:40.123 459-478/system_process E/SensorsHal: poll() failed (Interrupted system call)
05-02 20:52:40.824 459-981/system_process E/WifiHAL: Error polling socket
05-02 20:52:40.900 6611-6661/com.solaborate.hello D/Webrtc_calls: SocketIoStatus conected: true , socketId: 9U55YZnsB0EeSDcHACui
05-02 20:52:41.018 459-482/system_process I/Process: Sending signal. PID: 852 SIG: 3
05-02 20:52:41.019 852-864/com.android.phone I/art: Thread[5,tid=864,WaitingInMainSignalCatcherLoop,Thread*=0xb7113410,peer=0x12c000a0,"Signal Catcher"]: reacting to signal 3
05-02 20:52:41.023 459-1442/system_process W/ActivityManagerService: Missing app error report, app = com.kushtrim.playground crashing = false notResponding = true
05-02 20:52:41.028 459-468/system_process I/art: Wrote stack traces to '/data/anr/traces.txt'
05-02 20:52:41.028 459-482/system_process I/Process: Sending signal. PID: 811 SIG: 3
05-02 20:52:41.029 811-820/com.android.inputmethod.latin I/art: Thread[5,tid=820,WaitingInMainSignalCatcherLoop,Thread*=0xb7112928,peer=0x12c000a0,"Signal Catcher"]: reacting to signal 3
05-02 20:52:41.152 811-820/com.android.inputmethod.latin I/art: Wrote stack traces to '/data/anr/traces.txt'
05-02 20:52:41.152 459-482/system_process I/Process: Sending signal. PID: 628 SIG: 3
05-02 20:52:41.152 628-636/com.android.systemui I/art: Thread[5,tid=636,WaitingInMainSignalCatcherLoop,Thread*=0xb7112928,peer=0x12c000a0,"Signal Catcher"]: reacting to signal 3
05-02 20:52:41.209 852-864/com.android.phone I/art: Wrote stack traces to '/data/anr/traces.txt'
05-02 20:52:41.209 459-482/system_process I/Process: Sending signal. PID: 712 SIG: 3
05-02 20:52:41.209 712-719/com.cghs.stresstest I/art: Thread[5,tid=719,WaitingInMainSignalCatcherLoop,Thread*=0xb7112a18,peer=0x12c000a0,"Signal Catcher"]: reacting to signal 3
05-02 20:52:41.286 712-719/com.cghs.stresstest I/art: Wrote stack traces to '/data/anr/traces.txt'
05-02 20:52:41.286 459-482/system_process I/Process: Sending signal. PID: 591 SIG: 3
05-02 20:52:41.286 591-600/android.process.media I/art: Thread[5,tid=600,WaitingInMainSignalCatcherLoop,Thread*=0xb7112928,peer=0x12c000a0,"Signal Catcher"]: reacting to signal 3
05-02 20:52:41.313 628-636/com.android.systemui I/art: Wrote stack traces to '/data/anr/traces.txt'
05-02 20:52:41.396 591-600/android.process.media I/art: Wrote stack traces to '/data/anr/traces.txt'
05-02 20:52:41.554 459-913/system_process W/ActivityManagerService: Missing app error report, app = com.kushtrim.playground crashing = false notResponding = true
05-02 20:52:42.094 459-944/system_process W/ActivityManagerService: Missing app error report, app = com.kushtrim.playground crashing = false notResponding = true
05-02 20:52:43.304 459-1982/system_process W/ActivityManagerService: Missing app error report, app = com.kushtrim.playground crashing = false notResponding = true
05-02 20:52:43.869 459-482/system_process I/art: Explicit concurrent mark sweep GC freed 58037(3MB) AllocSpace objects, 10(257KB) LOS objects, 33% free, 19MB/28MB, paused 811us total 53.345ms
05-02 20:52:43.883 459-482/system_process W/ProcessCpuTracker: Skipping unknown process pid 9185
05-02 20:52:44.189 459-4388/system_process W/ActivityManagerService: Missing app error report, app = com.kushtrim.playground crashing = false notResponding = true
05-02 20:52:44.418 459-482/system_process I/Process: Sending signal. PID: 1155 SIG: 3
05-02 20:52:44.418 1155-1164/com.waxrain.airplaydmr I/art: Thread[5,tid=1164,WaitingInMainSignalCatcherLoop,Thread*=0xb7112928,peer=0x32c070a0,"Signal Catcher"]: reacting to signal 3
05-02 20:52:44.540 1155-1164/com.waxrain.airplaydmr I/art: Wrote stack traces to '/data/anr/traces.txt'
05-02 20:52:44.549 459-482/system_process E/ActivityManagerService: ANR in com.kushtrim.playground (com.kushtrim.playground/.MainActivity)
                                                                    PID: 8790
                                                                    Reason: Input dispatching timed out (Waiting to send non-key event because the touched window has not finished processing certain input events that were delivered to it over 500.0ms ago.  Wait queue length: 17.  Wait queue head age: 5505.1ms.)
                                                                    Load: 1.48 / 1.36 / 1.86
                                                                    CPU usage from 567ms to -4733ms ago:
                                                                      31% 459/system_server: 14% user + 17% kernel / faults: 6486 minor 5 major
                                                                      0% 164/debuggerd: 0% user + 0% kernel / faults: 3474 minor 5 major
                                                                      8.6% 161/surfaceflinger: 5.6% user + 3% kernel / faults: 629 minor
                                                                      0% 852/com.android.phone: 0% user + 0% kernel / faults: 2463 minor
                                                                      2.8% 8790/com.kushtrim.playground: 1.1% user + 1.7% kernel / faults: 1497 minor
                                                                      0.6% 628/com.android.systemui: 0.3% user + 0.2% kernel / faults: 1800 minor 2 major
                                                                      0% 811/com.android.inputmethod.latin: 0% user + 0% kernel / faults: 2089 minor
                                                                      2.2% 1155/com.waxrain.airplaydmr: 1.5% user + 0.7% kernel / faults: 1754 minor
                                                                      2% 174/adbd: 0.1% user + 1.8% kernel / faults: 564 minor
                                                                      0% 591/android.process.media: 0% user + 0% kernel / faults: 2149 minor 1 major
                                                                      0% 712/com.cghs.stresstest: 0% user + 0% kernel / faults: 1984 minor
                                                                      0.9% 69/cfinteractive: 0% user + 0.9% kernel
                                                                      0.5% 153/dhd_dpc: 0% user + 0.5% kernel
                                                                      0.5% 155/logd: 0.3% user + 0.1% kernel
                                                                      0.3% 68/rk-fb: 0% user + 0.3% kernel
                                                                      0.3% 152/dhd_watchdog_th: 0% user + 0.3% kernel
                                                                      0.1% 8/rcu_preempt: 0% user + 0.1% kernel
                                                                      0.1% 14/ksoftirqd/1: 0% user + 0.1% kernel
                                                                      0.1% 19/ksoftirqd/2: 0% user + 0.1% kernel
                                                                      0.1% 24/ksoftirqd/3: 0% user + 0.1% kernel
                                                                      0.1% 67/fb-vsync: 0% user + 0.1% kernel
                                                                      0.1% 110/mmcqd/0: 0% user + 0.1% kernel
                                                                      0.1% 122/irq/198-mma8452: 0% user + 0.1% kernel
                                                                      0.1% 507/mediaserver: 0% user + 0.1% kernel / faults: 12 minor
                                                                      0% 1174/com.android.settings: 0% user + 0% kernel / faults: 22 minor
                                                                      0.1% 1252/wdog2: 0% user + 0.1% kernel
                                                                      0.1% 1486/com.skype.raider: 0.1% user + 0% kernel / faults: 6 minor
                                                                      0.1% 2355/com.tencent.mm:push: 0% user + 0.1% kernel / faults: 331 minor
                                                                      0.1% 4835/wpa_supplicant: 0% user + 0.1% kernel
                                                                      0.1% 6611/com.solaborate.hello: 0.1% user + 0% kernel / faults: 12 minor
                                                                      0% 7891/kworker/2:2: 0% user + 0% kernel
                                                                      0.1% 7974/kworker/0:1: 0% user + 0.1% kernel
                                                                      0.1% 8875/logcat: 0.1% user + 0% kernel
                                                                     +0% 9168/kworker/u8:4: 0% user + 0% kernel
                                                                    19% TOTAL: 8.1% user + 11% kernel + 0.3% iowait + 0% softirq
                                                                    CPU usage from 4062ms to 4577ms later:
                                                                      7.6% 459/system_server: 3.8% user + 3.8% kernel / faults: 27 minor
                                                                        3.8% 482/ActivityManager: 1.9% user + 1.9% kernel
                                                                        1.9% 487/android.display: 1.9% user + 0% kernel
                                                                      5.7% 161/surfaceflinger: 1.9% user + 3.8% kernel / faults: 14 minor
                                                                        1.9% 161/surfaceflinger: 1.9% user + 0% kernel
                                                                        1.9% 314/DispSync: 0% user + 1.9% kernel
                                                                        1.9% 433/surfaceflinger: 0% user + 1.9% kernel
                                                                        1.9% 552/Binder_4: 1.9% user + 0% kernel
                                                                      1.3% 14/ksoftirqd/1: 0% user + 1.3% kernel
                                                                      1.3% 19/ksoftirqd/2: 0% user + 1.3% kernel
                                                                      1.4% 153/dhd_dpc: 0% user + 1.4% kernel
                                                                      1.4% 174/adbd: 0% user + 1.4% kernel / faults: 60 minor
                                                                        1.4% 174/adbd: 1.4% user + 0% kernel
                                                                      1.5% 1155/com.waxrain.airplaydmr: 1.5% user + 0% kernel
                                                                    6.4% TOTAL: 2.4% user + 3.9% kernel

现在,我做了一些研究,发现在正常情况下ANR是指当超过5秒没有响应触摸事件时触发,这似乎就是这里发生的事情。
虽然这对于应用程序的正常操作来说没问题,但如果我在一个按钮的OnClickListener上放置一个断点,这种情况就不应该发生,但在我的情况下确实发生了。
这在任何其他手机上都没有发生过,只在这个板子上发生。
我该怎么修复这个问题并最终进行调试呢?
需要提到的是,我还有操作系统代码(AOSP + kernel),我已经自己编译/安装了它,所以如果需要的话,我可以修改操作系统。
如果有用的话,以下是ANR跟踪信息: https://pastebin.com/C3dh9rzK 编辑:
似乎这不是应用的问题,而是操作系统的问题。 我能够在一个全新的项目中重现崩溃,在这个项目中,我只添加了一个按钮和一个OnClickListener。然后我在监听器内部放置了一个断点,连接了调试器并点击了按钮。KA-BOOOM。

将您需要调试的部分移动到AsyncTask中,仅出于调试目的,这样做是否有意义? 或者,分离代码部分并按顺序使用Handler.post(Runnable)执行它们,以便主线程可以在其中间休息一下?(在此场景中,您将不得不设置多个断点) - SirKnigget
@SirKnigget 是的,那是我想到并有时使用的解决方法。我正在寻找更长久的解决方案。 - Rick Sanchez
你尝试过使用 android.os.Debug.waitForDebugger() 并在此之后插入断点吗? - Haris Qurashi
@HarisQureshi 没有改变。仍然导致应用程序崩溃。 - Rick Sanchez
你能在这里描述MainActivity.java (com.kushtrim.playground/.MainActivity)吗? - Radhey
1
我在Windows 11上的Android子系统中遇到了同样的问题。顶部答案中描述的使用adb shell am set-debug-app --persistent方法解决了这个问题。 - Attila Tanyi
4个回答

13
最奇怪的事情是,我不敢相信之前没有发现这个。如果我使用Android Studio中的“Debug app”按钮运行应用程序并附加调试器,则不会出现ANR崩溃。如果我以正常方式运行应用程序,然后再附加调试器,则会出现上述问题。 我想我总是做第二种方法。
知道它在第一种情况下工作,我开始尝试解决第二种情况下的问题。
调用此代码(或在开发者选项中将应用设置为调试模式)可以解决问题:
adb shell am set-debug-app --persistent com.kushtrim.playground  

我不确定为什么在这个板子上,如果你想附加调试器,则设置调试应用程序是必须的,但在我的Pixel XL上则不需要。无论如何,问题已解决。


当我运行这个应用程序时崩溃了。 - Mukesh Y.

5
ANR可以通过在主线程上收到新事件时将主线程保持而触发。这个事件可能是一个输入事件,或者只是一个BroadcastReceiver接收到一个Intent。
需要注意的是,您的应用程序可能正在主线程上执行另一个任务,同时您正在尝试进行调试。
直接从ANRs文档中得出:
这意味着您的应用程序在UI线程中执行的任何长时间完成的操作都可能触发ANR对话框,因为您的应用程序没有给自己处理输入事件或意图广播的机会。
您可以跟踪在主线程上运行的其他代码,或者尝试下面更大胆的解决方案。
由于您提到可以修改AOSP,并且这仅用于调试,因此您可以尝试一种史诗般的黑客方法来进行调试。
ANR超时时间在路径/frameworks/base/libs/ui中的文件InputDispatcher.cpp中定义。
const nsecs_t DEFAULT_INPUT_DISPATCHING_TIMEOUT = 5000 * 1000000LL; 

没有任何阻止你改变那个值,这样你就可以安心调试了!


谢谢。我之前也有同样的想法,但找不到要修改的常量。我喜欢这个方法,但现在它仍然是一种“核选项”。让我们看看是否有办法将其保持在正常值,并仅为调试器修复它,因为那样我就不会看到可能发生的正常ANR了。 - Rick Sanchez
另外,我想补充一些内容。我发现这不是应用程序的问题,而是操作系统的问题。我能够通过创建一个全新的项目,添加一个按钮和一个OnClickListener,并在其中设置断点来重现崩溃。 - Rick Sanchez
@RickSanchez 非常有趣。我同意最坏的情况是你选择“核”选项并继续你的原始工作。 - Newtron Labs
我用另一种方式解决了问题,但我不想让悬赏白白浪费,所以我把它授予你(你是第一个回答的人,而且我喜欢有创意的解决方案)。 - Rick Sanchez
@RickSanchez 谢谢Rick,非常感谢。很高兴你能解决你的问题! - Newtron Labs
大家好,谢谢你们的答案。请问你们知道 InputDispatcher.cpp 存储在哪里吗?我在哪里可以找到 /frameworks/base/libs/ui 呢?谢谢! - clst

2

谢谢,我会尝试这个。据我所见,这是 ANR 显示流程的最后一部分,实际上显示了 ANR。在此之前添加检查是否有意义呢?受此启发,我在 InputMonitor.java 中找到了一个名为 notifyANR 的方法。 - Rick Sanchez
无论怎样,只要能完成任务就行...我想中断调试流程的只是对话框,对吧?如果系统在logcat中大声喊叫但仍然可以进行调试,那有关紧要吗? - SirKnigget
不,停止调试的是系统杀死应用程序。这就是为什么我问我们是否应该在早些时候检查某个地方?我担心可能系统会在你提到的地方之前做一些停止操作。 - Rick Sanchez
好的,出于某种原因我认为对话框是让你烦恼的。那么这段代码怎么样:killAppAtUsersRequest(proc, null);(在函数末尾),这不是杀死进程的部分吗?无论如何,即使显示对话框,也没有“等待”选项吗? - SirKnigget
对话框根本没有显示出来。操作系统只是关闭了我的应用程序。 - Rick Sanchez
这很奇怪。你正在构建一个正常的AOSP标签吗?ActivityManagerService.java的内容是否与我查看的内容类似?无论如何,请尝试删除killAppAtUsersRequest(proc,null)... - SirKnigget

1

好的,我进行了一些检查。我注意到使用连接了调试器的Nexus 5x并在onClick方法中设置断点不会启动ANR。

如果我分离调试器,预计会启动ANR。

所以,我猜测操作系统考虑到了调试器的附加,并忽略(或避免启动)ANR对话框。

我猜您使用的SO与智能手机上使用的SO略有不同(可能是旧版本?),但这里有一些考虑因素。

  1. 当主线程被长时间运行的任务或其他原因阻塞时,会显示ANR。调试器停止线程会导致调试器产生ANR,这是有道理的。

  2. 检查主线程是否被阻塞的线程不能是主线程。

  3. 为了避免ANR,需要通知检查主线程是否被阻塞的组件我们处于调试模式。可能使用另一个版本的SO可以解决这个问题。

  4. 或者可能阻止系统中运行的所有线程。

@CJBS的回答可能对您有用:

Android Studio线程调试

在Android Studio中设置断点可以暂停所有正在运行的线程。这应该足以避免ANR。


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