Android Compose运行时崩溃(SIG 9):如何获取堆栈跟踪与调试数据?
在Android Compose中捕获Composable崩溃并获取堆栈跟踪
一、配置全局未捕获异常处理器
在自定义Application类中设置全局异常捕获,可覆盖所有未处理的崩溃场景,包括Composable内部的异常:
class MyApp : Application() { override fun onCreate() { super.onCreate() Thread.setDefaultUncaughtExceptionHandler { thread, throwable -> // 打印完整堆栈跟踪 throwable.printStackTrace() // 写入日志便于后续排查 Log.e("ComposeCrash", "Uncaught exception in thread ${thread.name}", throwable) // 可选:调用默认处理器让应用正常崩溃 Thread.getDefaultUncaughtExceptionHandler()?.uncaughtException(thread, throwable) } } }
记得在AndroidManifest.xml中指定该Application:
<application android:name=".MyApp" ...>
二、使用Compose的LocalErrorHandler
Compose提供LocalErrorHandler,可在Composable层级捕获重组、协程中的异常:
@Composable fun CrashTestScreen() { val errorHandler = remember { CoroutineExceptionHandler { _, throwable -> Log.e("ComposeCrash", "Composable exception caught", throwable) Toast.makeText(LocalContext.current, "崩溃信息: ${throwable.message}", Toast.LENGTH_LONG).show() } } CompositionLocalProvider(LocalErrorHandler provides errorHandler) { Button(onClick = { // 同步抛出的异常需单独加try/catch,因为点击事件不属于重组流程 try { val num = 1 / 0 } catch (e: ArithmeticException) { Log.e("ComposeCrash", "Click event exception caught", e) } }) { Text("触发崩溃") } } }
三、检查小米设备的开发者选项
小米Android 10设备可能默认限制日志输出,需调整开发者选项:
- 开启“调试”分类下的启用原生调试
- 关闭不保留活动,避免进程被直接杀死导致日志丢失
四、Android Studio调试技巧
- 断点调试:在崩溃代码行(如
1/0)打断点,用Debug模式运行,触发崩溃时可直接查看调用栈 - 过滤Logcat日志:选择“Error”级别,过滤应用包名,向上翻找SIG:9日志前的错误信息
- 调整日志级别:在Logcat过滤器配置中,将日志级别设为Verbose,确保捕获完整日志
五、验证try/catch的正确用法
确保try/catch包裹住崩溃代码的执行逻辑,比如:
Button(onClick = { try { val num = 1 / 0 } catch (e: Exception) { Log.e("ComposeCrash", "Caught exception", e) } }) { Text("触发崩溃") }
内容的提问来源于stack exchange,提问作者Alex Aleluia
相关产品推荐
相关产品推荐

