tombstone最大允许有多少个

对于eng/userdebug版本,是50个;
对于user版本,是10个
$ adb shell getprop tombstoned.max_tombstone_count
50

//build/target/product/media_system.mk
# On userdebug builds, collect more tombstones by default.
ifneq (,$(filter userdebug eng,$(TARGET_BUILD_VARIANT)))
PRODUCT_SYSTEM_DEFAULT_PROPERTIES += \
    tombstoned.max_tombstone_count=50
endif
//system/core/debuggerd/tombstoned/tombstoned.cpp
static CrashQueue* for_tombstones() {
  static CrashQueue queue("/data/tombstones", "tombstone_" /* file_name_prefix */,
                          GetIntProperty("tombstoned.max_tombstone_count", 10),
                          1 /* max_concurrent_dumps */);
  return &queue;
}
<think>好的,我现在需要帮助用户了解Android系统中的tombstone日志文件的含义和作用。用户之前询问过其他日志文件如kmsg、anr等,现在转向tombstone,可能需要对比之前的回答来保持一致性。 首先,根据用户提供的引用内容,我需要整合相关信息。引用1提到tombstone文件由debuggerd生成,存放在/data/tombstones目录下,记录进程崩溃时的基本信息、地址和堆栈调用信息。引用2说明tombstone类似于Linux的Core Dump,用于分析崩溃原因。引用3则提到DropBoxManagerService处理日志,其中data_app_nativecrash可能与tombstone相关。 接下来,我需要组织信息,确保结构清晰。按照用户之前的回答格式,分点解释作用、生成机制、文件结构、存放路径、分析方法以及与其他日志的对比。同时,需要引用用户提供的引用标记[^1]、[^2]、[^3]来支持内容。 要注意用户提到的“尽可能多的参考用户上一次的问题和回答”,所以可能需要将tombstone与之前提到的anr、exp_main等日志进行对比,帮助用户理解不同日志的应用场景。例如,anr是应用无响应,而tombstone是native层的崩溃。 还需要考虑用户可能的后续问题,如如何获取tombstone文件、分析工具的使用等,因此在相关问题部分需要提前准备这些问题。同时,确保使用正确的中文术语,避免技术术语翻译错误,比如“信号处理器”对应“signal handlers”。 最后,检查是否符合系统级指令,如行内公式是否正确(虽然这里可能用不到)、独立公式是否单独成段,以及引用标记是否正确添加。确保回答真实可靠,结构清晰,帮助用户逐步理解tombstone日志的各个方面。</think>### Android Tombstone日志文件详解 #### 1. **核心作用** Tombstone日志是Android系统用于记录**Native层(C/C++代码)崩溃**的关键文件,类似于Linux系统的Core Dump文件。当进程因段错误(SIGSEGV)、非法指令(SIGILL)等信号触发崩溃时,系统通过注册的`debuggerd`服务捕获异常,生成包含崩溃现场详细信息的Tombstone文件[^1]。 --- #### 2. **生成机制** - **触发条件**:Native代码崩溃(如JNI调用错误、内存越界访问、空指针解引用)。 - **信号处理器**:系统在进程启动时注册`debuggerd`的signal handlers,实时监控崩溃信号(如SIGSEGV、SIGABRT)[^1]。 - **日志传递**:崩溃信息同时会出现在`logcat`中,但Tombstone文件提供了更完整的堆栈和内存状态[^2]。 --- #### 3. **文件结构与内容** Tombstone文件通常包含以下关键信息: ```plaintext Build fingerprint: 'Xiaomi/...' // 设备固件标识 ABI: 'arm64' // CPU架构 pid: 1234, tid: 1235, name: jni_thread // 进程/线程信息 signal 11 (SIGSEGV), code 1 (SEGV_MAPERR) // 崩溃信号类型 fault addr: 0x0 // 触发崩溃的内存地址 backtrace: // 崩溃时的调用堆栈 #00 pc 0000000000123456 /data/app/libnative.so (functionA+0x123) #01 pc 0000000000543210 /data/app/libnative.so (functionB+0x456) ... memory map: // 进程内存布局 address: 00000000-12345678 r-xp /data/app/libnative.so ... ``` - **崩溃信号**:如`SIGSEGV`(内存访问错误)、`SIGABRT`(主动终止)等。 - **内存映射**:显示崩溃时进程加载的动态库地址范围,帮助定位代码位置[^1]。 --- #### 4. **存放路径与获取方式** - **默认路径**:`/data/tombstones/`(需Root权限访问)。 - **导出方法**: ```bash adb root adb pull /data/tombstones/tombstone_01 ``` - **自动化收集**:部分系统通过`DropBoxManagerService`将Tombstone上传至`/data/system/dropbox/`目录,标记为`data_app_nativecrash`[^3]。 --- #### 5. **分析方法** 1. **使用工具**: - **addr2line**:将堆栈地址转换为代码行号: ```bash addr2line -e libnative.so 00012345 -f -C ``` - **ndk-stack**:直接解析堆栈: ```bash ndk-stack -sym project/obj/local/arm64-v8a/ -dump tombstone_01 ``` 2. **关键步骤**: - 确认崩溃的**动态库版本**需与符号文件匹配。 - 分析`fault addr`和`backtrace`,检查空指针或越界访问。 - 结合`memory map`验证内存权限(如不可执行区域触发崩溃)。 --- #### 6. **与其他日志的对比** | 日志类型 | 触发场景 | 内容特点 | 分析工具 | |---------------|-------------------------|------------------------------|-----------------------| | **Tombstone** | Native层崩溃(C/C++) | 完整内存映射、寄存器状态 | addr2line, ndk-stack | | **ANR** | 主线程阻塞超5秒 | 主线程堆栈、CPU使用率 | Traceview, Systrace | | **Logcat** | 应用层日志(Java/Kotlin)| 动态输出,过滤关键字 | Android Studio | | **kmsg** | 内核级错误 | 硬件驱动日志、内核异常 | dmesg, crash实用工具 | --- ### 相关问题 1. 如何在没有Root权限的情况下获取Tombstone文件? 2. Tombstone日志中的`Build fingerprint`字段有什么具体用途? 3. 如何通过符号表(Symbols)提升Tombstone分析效率? 4. Tombstone与`logcat`中的`FATAL EXCEPTION`有何关联?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值