Android System Crash Analysis

本文详细介绍Android系统崩溃的分析方法,包括内核态和用户态崩溃的处理流程,使用dmesg、logcat和tombstones文件进行故障定位,以及如何利用addr2line和objdump工具解析地址和代码。同时,文章探讨了多线程同步问题、内存损坏检测方法,并提供了信号号的意义解释和关闭watchdog的方法。

Android System Crash Analysis.
需要文件:
1:串口现象dmesg
2:logcat 信息
3:./data/tombstones.//有debuggerd守护进程,输出到此文件stombstones_0x,最多有十个文件.

需要工具
1 addr2line    //android/jb-4.x/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.6/bin/arm-linux-androideabi-addr2line
    参数:
a)    -e:指定要解析的目标文件,比如.so文件或者可执行文件
b)    -f:显示函数名字
eg:/android/jb-4.x/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.6/bin/arm-linux-androideabi-addr2line -e dtv_svc -f 0xXXXXX;

2  objdump    //android/jb-4.x/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.6/bin/arm-linux-androideabi-objdump
    eg: android/jb-4.x/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.6/bin/arm-linux-androideabi-objdump -S dtv_svc > dump.txt

问题分类
(1) Data Abort /null point (sigal 11)
    特点:fault addr 0000000X. addr值比较少.
    1):内核态(Kernel Space) Crash..
        A.对于串口打印的死机,选择ultraedit打开,Ctrl+F,输入查找关键字,这个通常是因人喜好而异的,我个人比较喜欢输入pc is ,此时定位到的就是死机的瞬间的PC指针的位置,
        如下图所示
         
        B:接下面就是call stack.
        C:通过objdump dump vmlinx 为汇编代码结合,r0-r3找到对应的函数点.
    2) Android 用户态(User Space) Crash
        A:对于logcat的信息,我通常习惯输入fatal关键字来查找.找出callstack pc指针.
        B:用objdump,程序为汇编代码,根据 code around PC 在代码走查找.对应的地址指针/指令指针.
参考:<<Segment default debug>> 
(2) 多线程同步
    1)一个线程释放资源,另外一个线程引用.一般通过logcat - v threatime& 来分析.
    
(3) Memeroy corruption.
    1)通过Valgrind memory check tool查
    2)改code 支持coredump 来查.    
    3)参考<<Android中native进程内存泄露的调试技巧.>>

Q&A
Q(1) 怎么在release 的code中编译带symbol的 code.
//加build command SYM_SUPPORT=true
Q(2) tombstone 具体分析
//参考:http://wonview.blog.163.com/blog/static/5850132720121128056704/
Q(3) signal NO 的含义.
    SIGHUP        1       Term    Hangup detected on controlling terminal
                                     or death of controlling process
       SIGINT        2       Term    Interrupt from keyboard
       SIGQUIT       3       Core    Quit from keyboard
       SIGILL        4       Core    Illegal Instruction
       SIGABRT       6       Core    Abort signal from abort(3)
       SIGFPE        8       Core    Floating point exception
       SIGKILL       9       Term    Kill signal
       SIGSEGV      11       Core    Invalid memory reference
       SIGPIPE      13       Term    Broken pipe: write to pipe with no readers
       SIGALRM      14       Term    Timer signal from alarm(2)
       SIGTERM      15       Term    Termination signal
       SIGUSR1   30,10,16    Term    User-defined signal 1
       SIGUSR2   31,12,17    Term    User-defined signal 2
       SIGCHLD   20,17,18    Ign     Child stopped or terminated
       SIGCONT   19,18,25            Continue if stopped
       SIGSTOP   17,19,23    Stop    Stop process
       SIGTSTP   18,20,24    Stop    Stop typed at tty
       SIGTTIN   21,21,26    Stop    tty input for background process
       SIGTTOU   22,22,27    Stop    tty output for background process 
Q(4)怎么关掉watchdog
//进入到cli,输入:b.so -w 0 0; b.so -p 0
 

<think>好的,用户的问题是如何在Android中查看和分析蓝牙的trace日志。首先,我需要回忆一下Android系统中蓝牙日志的相关知识。根据之前提供的引用内容,特别是引用[1]和引用[2],用户可能需要了解如何获取btsnoop_hci.log这个文件,因为这是蓝牙协议栈的日志文件。 首先,用户可能需要开启蓝牙HCI日志收集功能。根据引用[1],可以通过修改bt_stack.conf配置文件中的BtSnoopLogSetting,将其设为true,并确认日志文件的路径,比如/sdcard/Android/data/btsnoop_hci.log。这需要adb权限,用户可能需要使用adb shell命令进入设备,修改配置或直接提取日志文件。 然后,用户获取到日志文件后,如何分析呢?引用[2]提到btsnoop_hci.log是二进制文件,需要使用专门的工具如Frontline ComProbe Protocol Analysis System或者Wireshark进行分析。这里需要建议用户下载这些工具,并指导他们如何打开文件。 另外,引用[3]提到了adb logcat命令,用户可能还需要结合系统日志来分析蓝牙相关问题。比如,当出现ANR或者崩溃时,可以通过logcat过滤Bluetooth相关的标签,如BluetoothAdapter、BluetoothService等,查看详细日志。 还有,引用[4]和引用[5]涉及到Android源码中蓝牙服务的处理,比如AdapterService.java中的日志输出,以及HAL层的配置。这可能对开发者更深入分析问题有帮助,但普通用户可能不需要涉及源码层面,不过需要判断用户身份是否是开发者,如果是,可能需要提供更详细的路径或方法。 用户的问题可能包括两个部分:如何获取日志,以及如何分析。需要分步骤说明,首先开启日志记录,然后通过adb pull获取文件,接着用工具分析。同时,提醒用户需要开启开发者选项和USB调试,这些是前提条件。 可能还需要注意不同Android版本之间的差异,比如日志文件的位置可能有所不同,有的可能在/sdcard/,有的可能在/data/log/等目录。需要建议用户先通过adb shell查找具体路径。 另外,用户可能遇到权限问题,访问某些目录需要root权限,这时候可能需要告知用户如果没有root权限,可以使用adb命令在具有权限的环境下操作,或者使用调试版本的系统。 最后,生成相关问题需要考虑用户可能的后续问题,比如如何解析HCI日志中的特定事件,或者如何解决蓝牙连接失败的问题,以及更高级的日志分析方法。</think>### 如何在Android中查看和分析蓝牙Trace日志? #### **步骤1:启用蓝牙HCI日志收集** Android系统通过`btsnoop_hci.log`记录蓝牙协议栈交互的原始数据,需手动开启: 1. **修改蓝牙配置文件** 使用`adb`连接设备后执行: ```bash adb shell "echo 'BtSnoopLogSetting=true' >> /etc/bluetooth/bt_stack.conf" ``` 确认配置中的日志路径(如`BtSnoopFileName=/sdcard/Android/data/btsnoop_hci.log`)[^1]。 2. **重启蓝牙服务** ```bash adb shell "killall com.android.bluetooth" ``` #### **步骤2:获取蓝牙Trace日志** 1. **导出日志文件** 执行以下命令将日志文件拉取到本地: ```bash adb pull /sdcard/Android/data/btsnoop_hci.log ``` *注意:部分设备路径可能为`/data/log/bt/btsnoop_hci.log`,需root权限访问[^1][^2]。* 2. **实时监控日志** 通过`adb logcat`过滤蓝牙相关日志: ```bash adb logcat | grep -E 'BluetoothAdapter|BluetoothService|BluetoothHci' ``` 关键日志标签包括`BluetoothHci`(协议层)、`BtGatt`(GATT操作)、`BtSdp`(服务发现)[^3]。 #### **步骤3:分析HCI日志** `btsnoop_hci.log`为二进制文件,需使用专用工具解析: 1. **Wireshark** - 安装后直接打开文件,支持过滤HCI命令、ACL数据包等。 - 可分析连接事件(如`HCI_Connection_Complete`)、配对流程、协议错误码。 2. **Frontline ComProbe** - 提供更专业的蓝牙协议解析(如L2CAP、RFCOMM、ATT层)。 - 支持可视化时序图,用于定位数据包丢失或时序问题[^2]。 #### **步骤4:结合系统日志定位问题** 1. **ANR/Crash分析** 若蓝牙服务崩溃或无响应,检查`/data/anr/traces.txt`: ```bash adb pull /data/anr/traces.txt ``` 查找`BluetoothProcess`线程状态及堆栈信息[^3]。 2. **源码级调试(针对开发者)** 在蓝牙服务代码(如`AdapterService.java`)中添加自定义日志: ```java Log.d(TAG, "onProfileServiceStateChanged: " + profile.getName() + " state=" + state); ``` 重新编译系统后可通过`logcat`跟踪流程[^4]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值