Android系统coredump

本文介绍如何在Android系统中开启内核coredump功能,包括配置coredump支持及设置core文件存储位置的方法。

1.打开内核coredump功能

Android系统的linux内核有可能没有打开coredump功能,可以通过查看android系统是否存在/proc/sys/kernel/core_patten配置项来确定,如果没有该配置项,那么需要重新配置内核,并且重新编译,并将其替换掉目标android系统内核(具体更新方试需要根据不同的硬件而定)。下面为coredump内核配置项的具体位置:

make menuconfig 
 Userspace binary formats-->
   [*] Enable core dump support

开启该选项,系统就支持程序的coredump功能,保存退出,重新编译内核,并下载到目标系统中就可了。重启后,在文件系统中应该就可看到/proc/sys/kernel/core_pattern配置项了。

2.配置coredump的存储位置

将core文件存储位置写入到/proc/sys/kernel/core_pattern即可,但/proc为内存文件系统,系统重启后,该配置会失效,所以对于android系统可以将配置该文件的命令写入到init.rc中,例如:


setrlimit 4  -1 -1      
                     
mkdir /data/coredump 0777 system system
             
write /proc/sys/kernel/core_pattern  /data/coredump/core.%e.%p

下面是关于core_pattern的介绍:

core_pattern:
core_pattern is used to specify a core dumpfile pattern name.
. max length 128 characters; default value is "core"
. core_pattern is used as a pattern template for the output filename;
  certain string patterns (beginning with '%') are substituted with
  their actual values.
. backward compatibility with core_uses_pid:
    If core_pattern does not include "%p" (default does not)
    and core_uses_pid is set, then .PID will be appended to
    the filename.
. corename format specifiers:
    %<NUL>  '%' is dropped
    %%  output one '%' 
    %p  pid 
    %u  uid 
    %g  gid 
    %d  dump mode, matches PR_SET_DUMPABLE and                                                                                                                                                              
        /proc/sys/fs/suid_dumpable
    %s  signal number
    %t  UNIX time of dump
    %h  hostname
    %e  executable filename (may be shortened)
    %E  executable path
    %<OTHER> both are dropped
### 如何在Android上使用GDB生成和分析coredump文件 #### 配置环境准备 为了能够在Android设备上利用GDB进行core dump的生成与分析,需先确保已安装适当版本的Android NDK以及设置好开发环境。对于C++开发的应用而言,这一步骤尤为关键[^2]。 #### 启用Core Dump功能 针对较新版本的Android系统(如P及以上),核心转储(coredump)支持已被集成到操作系统内部。要激活此特性并允许应用崩溃时创建core dump文件,可以通过修改`/proc/sys/kernel/core_pattern`来指定core文件存储路径及其命名模式[^3]。 例如,在具有root权限的情况下执行如下命令可将core dumps放置于特定目录: ```bash echo "/data/local/tmp/core-%e.%p" > /proc/sys/kernel/core_pattern ``` 此处`%e`代表执行文件名而`%p`表示进程ID。 #### 编译带有调试信息的应用程序 当通过NDK构建项目时,应启用编译选项以保留完整的调试符号表。这样做的目的是为了让后续借助gdb工具读取core dump变得更为容易。具体来说可以在`Application.mk`中加入以下配置项: ```makefile APP_CFLAGS += -g -O0 ``` 上述指令告知编译器尽可能多地嵌入源码级别的元数据,并关闭优化措施以便更精确地映射机器指令回原始代码片段。 #### 使用ADB启动目标app并与远程GDB连接 一旦应用程序部署完毕并且处于等待状态,就可以采用adb shell方式进入终端界面进而触发一次预期中的crash事件从而获取相应的core dump样本;之后再运用预先设定好的脚本来加载该二进制镜像连同其关联的核心转储一起送至本地计算机上的GNU Debugger实例里做进一步剖析工作[^1]。 下面给出一段Python脚本作为示范,用于自动化处理以上流程: ```python import os,subprocess,time,json,re def get_device_info(): result=subprocess.run(['adb','devices'],stdout=subprocess.PIPE).stdout.decode('utf-8') devices=[line.split('\t')[0]for line in result.strip().splitlines()[1:]if 'device' in line] return json.dumps({'devices':devices}) def setup_gdbserver(app_package_name,port=5039): subprocess.call(f'adb shell am force-stop {app_package_name}',shell=True) time.sleep(2)# wait for app to stop completely pid_output=subprocess.check_output( f'adb shell pgrep -f {re.escape(app_package_name)}',stderr=subprocess.STDOUT, universal_newlines=True) pids=re.findall(r'\d+',pid_output) if not pids: raise Exception("Failed to find PID of the application.") main_pid=pids[-1] gdb_server_command=f"gdbserver :{port} --attach {main_pid}" print(f'Setting up GDB server with command:{gdb_server_command}') adb_shell_process=subprocess.Popen( ['adb','-s',json.loads(get_device_info())['devices'][0],'shell'], stdin=subprocess.PIPE, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL ) adb_shell_process.stdin.write(gdb_server_command.encode()) adb_shell_process.stdin.close() adb_shell_process.wait() setup_gdbserver('com.example.yourapplication') ``` 这段代码实现了自动停止给定包名的目标App、查询其正在运行的服务进程号(PID),并通过ADB Shell向远端注入一条命令开启监听模式下的gdbserver服务,最后绑定选定端口等待来自PC侧发起的会话请求。 #### 加载core dump至本地GDB 完成前面几步操作后,现在可以回到电脑这边打开一个命令提示符窗口输入类似这样的语句把之前收集起来的数据导入进来查看问题所在了: ```bash $ arm-linux-androideabi-gdb ./obj/local/arm64-v8a/libyourlib.so ... (gdb) target remote tcp::5039 Remote debugging using tcp::5039 ... (gdb) core-file /path/to/the.core ... ``` 这里假设读者已经下载好了匹配架构类型的交叉编译版GDB客户端软件包,并且知道怎样定位到待检视库文件的确切地址。按照指示逐步建立起双向通信链路直至成功附加到远程进程中去,紧接着便是调用`core-file`命令传参指向先前所提到过的那部分内存快照资料来进行最终阶段的故障排查作业了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值