Android主线程疑似阻塞时,如何暂停线程并查看调用栈?
定位Android主线程阻塞的实用方法
手动暂停主线程查看调用栈
当复现界面卡住(主线程阻塞)的瞬间,立刻切回Android Studio的Debug视图:
- 找到左侧的Threads面板,在列表里选中
main线程(即主线程) - 右键点击选择Suspend,主线程会立即暂停
- 切换到Frames面板,就能看到完整的调用栈,从上到下排查即可找到卡住的方法
配置主线程超时自动暂停
适合无需手动盯守的场景,设置后主线程阻塞超时会自动触发暂停:
- 打开
Run->Edit Configurations,选中你的应用配置 - 切换到Debugger标签页,找到Thread Monitoring区域
- 勾选
Automatically suspend threads on timeout,设置超时时间(比如2000ms,比ANR的5000ms阈值早触发),并指定只监控main线程 - 之后只要主线程阻塞超过设定时间,IDE会自动暂停,直接查看调用栈即可
利用ANR日志或adb命令获取调用栈
- 如果阻塞触发了ANR,直接在Logcat里过滤
ANR关键字,日志中会包含主线程的完整调用栈,可直接定位故障代码 - 还未触发ANR时,打开终端执行
adb shell dumpsys activity anr,可强制获取当前主线程的调用栈状态,无需等待系统触发ANR
内容的提问来源于stack exchange,提问作者Philipp
相关产品推荐
相关产品推荐

