You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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. 断点调试:在崩溃代码行(如1/0)打断点,用Debug模式运行,触发崩溃时可直接查看调用栈
  2. 过滤Logcat日志:选择“Error”级别,过滤应用包名,向上翻找SIG:9日志前的错误信息
  3. 调整日志级别:在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 22:03:15