Linux环境抓取程序异常退出(崩溃)的堆栈信息(core dump)

目录

一、文档说明

二、Linux环境下生成core文件

2.1.当前shell窗口临时配置

2.2.永久生效配置

三、堆栈信息(core dump)调试

3.1.通过生成的core文件调试

3.2.通过程序进程名称调试

3.3.通过程序进程PID调试


一、文档说明

Linux环境下程序进程发生异常(崩溃)而挂掉,通常很难查找原因,但是一般Linux内核给我们提供的核心文件,记录了进程在崩溃时候的信息。通常存在以下三种调试程序异常退出(崩溃)的应用场景:

场景1:通过配置Linux环境程序进程发生异常(崩溃)退出时生成core文件,使用gdb命令对程序异常退出生成的core文件进行堆栈信息的调试。(适用于所有场景,推荐使用)

场景2:通过程序进程名称,直接使用gdb命令进行调试。(适用于命令行方式直接调试程序的场景)

场景3:通过程序进程的PID值,直接使用gdb命令进行调试。(适用于通过服务接口调用到程序进程,进行调试程序的场景)

二、Linux环境下生成core文件

2.1.当前shell窗口临时配置

# 查看生成core文件的开关是否开启

sudo ulimit -a

我们可以看到,第一行core文件大小为0,表示没有开启。

# 使用命令ulimit -c [kbytes]可以设置系统允许生成的core文件大小,生成core文件大小说明如下所示:

ulimit -c 0   —>不产生core文件

ulimit -c 100设置core  —>文件最大为100k

ulimit -c unlimited  —>不限制core文件大小

# 执行生成core文件大小(不限制大小)命令,然后查看core文件大小

#生成不限制大小的core文件
sudo ulimit -c unlimited
#查看配置的core文件大小
sudo ulimit -a

这样程序进程崩溃就可以生成core文件了,但是这种方法只能在当前shell中生效。(不建议使用)

2.2.永久生效配置

#  进入编辑模式,在profile文件中加入ulimit -c unlimited

sudo vim /etc/profile

# 使用source命令使配置文件文件马上生效

sudo source /etc/profile

#  进入编辑模式,在sysctl.conf配置文件中指定生成文件的路径和名字,在配置文件中添加如下两行内容:

sudo vim /etc/sysctl.conf

kernel.core_pattern=/swdata/core/core_%e_%p
kernel.core_uses_pid=0

# 在/swdata/下创建core目录,用sysctl -p /etc/sysctl.conf(如果此命令执行后不生效,则需要重启服务器后生效)使修改的配置马上生效

sudo mkdir -p /swdata/core
sudo sysctl -p /etc/sysctl.conf

备注:core_pattern的命名参数如下

%c 转储文件的大小上限

%e 所dump的文件名

%g 所dump的进程的实际组ID

%h 主机名

%p 所dump的进程PID

%s 导致本次coredump的信号

%t 转储时刻(由1970年1月1日起计的秒数)

%u 所dump进程的实际用户ID

# 验证core文件配置是否成功,执行验证core文件生成命令,可以看到/swdata/core下生成了一个core文件,说明已经设置成功。

sudo kill -s SIGSEGV $$
sudo ls /swdata/core

配置完成,接下来进程出问题就可以用core文件调试了。

三、堆栈信息(core dump)调试

3.1.通过生成的core文件调试

# 调用自己的程序发生崩溃时,同样会在/swdata/core/目录下生成一个core文件,命名格式为:core_[processName]_[processPid]

# 使用file命令可以查询到此core崩溃文件生成的对应程序

sudo file core_apiprocess_13275

# 使用gdb命令可以对崩溃堆栈文件,进行堆栈信息排查(若是服务器没有gdb命令,则需要首先安装gdb命令)

# 执行gdb [core崩溃文件生成的对应程序] [core文件],等待gdb命令运行停止后执行bt

sudo gdb /data/apiservice/app/api/x64-linux/apiprocess core_apiprocess_13275
#过程中需要等待gdb命令运行完成后输入bt
bt

等待崩溃堆栈信息输出完成后,即可查看程序崩溃的堆栈信息。

输入quit命令即可退出gdb命令调试。

3.2.通过程序进程名称调试

# 调用需要调试崩堆栈信息的程序(本次调试使用的apiToDocument程序)

# 使用gdb  [process]进行调试,等待gdb命令运行停止后执行r  [运行内容]

# 调用程序使其发生崩溃,此时gdb会有输出,等待gdb命令运行停止后执行bt

3.3.通过程序进程PID调试

# 查询需要调试崩溃堆栈信息程序的PID(本次调试使用的apiprocess程序)

sudo ps -e|grep apiprocess

# 使用gdb  --pid=[pid值]进行调试,等待gdb命令运行停止后执行c

# 调用自己的程序使其发生崩溃,此时gdb会有输出,等待gdb命令运行停止后执行bt

等待崩溃堆栈信息输出完成后,即可查看程序崩溃的堆栈信息,输入quit命令即可退出gdb命令调试。

<think>我们正在处理关于如何从MTK设备抓取dump文件的问题。根据提供的引用,我们可以总结出以下步骤:1.**环境搭建**:需要安装GAT(GenericAnalysisTool)和SpOffineDebugSuite工具(引用[1]和[2])。2.**触发dump**:可以通过手动触发panic,使设备进入橙屏(orangescreen)状态来抓取dump(引用[1])。3.**解析dump**:使用GAT工具解析db文件(引用[2])。解析时,注意关注SYS_MINI_RDUMP和SYS_COREDUMP文件夹(引用[2])。4.**分析dump**:使用gdb等工具分析dump文件,需要vmlinux和SYS_MINI_RDUMP文件(引用[3])。使用gdb的`examine`命令(简写`x`)查看内存地址中的值(引用[3])。因此,我们可以将抓取dump的过程分为环境准备、触发dump抓取dump、解析dump和分析dump几个步骤。下面我们根据这些步骤详细说明:###环境搭建1.安装GAT工具:从联发科获取GenericAnalysisTool(GAT)并安装。2.安装SpOffineDebugSuite:这是联发科提供的离线调试工具套件,用于解析dump文件。###触发dump-手动触发panic:可以通过adb命令或者设备上的硬件按键组合触发panic,使设备进入橙屏状态。橙屏状态表示设备已经触发了崩溃,并开始生成dump文件。###抓取dump1.当设备进入橙屏状态后,连接设备到电脑。2.使用GAT工具抓取dump文件。具体操作步骤可能包括:-打开GAT工具。-选择正确的端口和设置。-开始抓取dump,工具会将设备中的dump文件保存到本地。###解析dump1.使用GAT工具解析db文件:GAT工具内置了解析功能,可以解析抓取dump文件。2.解析KE(KernelException)文件:在GAT工具的安装目录下,通常有一个`aee_db_extract`工具,用于解析db文件。运行该工具,指定db文件路径,即可解析出有用的信息。3.解析后,重点关注SYS_MINI_RDUMP和SYS_COREDUMP文件夹中的内容,这些包含了主要的崩溃信息。###分析dump1.准备调试符号:需要设备的vmlinux(内核镜像的调试符号文件)和SYS_MINI_RDUMP文件。2.使用gdb加载vmlinuxdump文件:```bashgdbvmlinux(gdb)targetremote:0#或者使用core文件,具体取决于dump格式(gdb)coreSYS_MINI_RDUMP```3.使用gdb命令分析:-使用`bt`(backtrace)查看调用栈。-使用`examine`命令(`x`)查看内存地址的值,例如:```x/10x0x地址#以十六进制查看10个地址单元x/10i0x地址#查看10条指令```###注意事项-在环境搭建时,确保安装的工具版本与设备固件匹配。-触发dump可能会导致设备重启,确保在安全环境下操作。-解析和分析dump需要一定的调试经验,特别是对内核调试的理解。§§相关问题§§1.如何手动触发MTK设备的panic?2.如何配置GAT工具来抓取dump?3.解析MTKdump文件时遇到问题怎么办?4.如何获取MTK设备的vmlinux文件?5.使用gdb分析MTKdump的常用命令有哪些?</think>### 从MTK设备抓取dump文件的完整流程 #### **1. 环境搭建** - **安装必需工具**: - **GAT工具**(Generic Analysis Tool):用于dump抓取和初步解析[^1][^2] - **SpOffineDebugSuite**:离线调试套件,提供深度解析能力[^1][^2] - 确保工具版本与设备芯片平台匹配(如天玑系列需对应版本) - **环境配置**: ```bash # 示例:设置GAT工具路径 export GAT_HOME=/path/to/gat-win32-x86_64-4 export PATH=$PATH:$GAT_HOME/modules/spsst/tools ``` #### **2. 触发dump** - **手动触发panic**: - 通过ADB命令强制触发内核崩溃: ```bash adb shell "echo c > /proc/sysrq-trigger" ``` - 设备将进入**橙屏状态**(Orange Screen of Death),此时开始生成dump[^1] - **自动触发条件**: - 系统级错误(如kernel panic) - 硬件异常(如看门狗超时) - 通过`/proc/aee_trigger`接口触发 #### **3. 抓取dump文件** 1. 设备进入橙屏后通过USB连接PC 2. 启动GAT工具: - 选择正确的设备端口(通常为高通HS-USB模式) 3. 执行抓取命令: ```bash aee_dump_extract -i /dev/ttyACM0 -o output_dir ``` 4. 关键输出文件: - **SYS_MINI_RDUMP**:核心内存快照(必备)[^2][^3] - **SYS_COREDUMP**:完整系统状态[^2] - **db文件**(如`EE_DB_00000001.db`):结构化调试数据[^2] #### **4. 解析dump** - **解析DB文件**: ```bash aee_db_extract EE_DB_00000001.db ``` 输出线程堆栈、寄存器状态等关键信息[^2] - **分析内存数据**: - 使用GDB加载vmlinux和SYS_MINI_RDUMP: ```bash gdb vmlinux SYS_MINI_RDUMP ``` - 查看内存指令: ```gdb (gdb) x/10i 0xffffffc012345678 # 反汇编10条指令 (gdb) x/8xg 0xffffffc001234567 # 以8字节格式查看内存 ``` #### **5. 关键分析技巧** - **内存查看语法**: ```gdb x/<n><f><u> <addr> # GDB标准命令[^3] ``` - `n`:显示条目数 - `f`:格式(`x`十六进制, `i`指令, `t`二进制) - `u`:单位大小(`b`字节, `h`半字, `w`字) - **常见问题定位**: - 通过`bt`命令查看崩溃调用栈 - 检查`PC寄存器`值定位崩溃点 - 分析`aee_exp_backtrace`文件获取异常上下文 > **注意**:完整流程依赖MTK提供的**vmlinux符号文件**,需提前从编译产物中获取[^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值