添加adb功能;添加lrzsz工具;添加core dump的gdb分析功能

添加adb功能:

1.git现在a35_adb分支,执行如下操作

替换d40的如下目录并重新编译:

media

ats2853_ota_file\ota.bin

packshop\Trunk\Proj\Libs

替换内核,并重命名:内核的替换路径如下:

"/home/zhanbb/D40/0908/ax5-kernel/zboot.img" "/home/zhanbb/D40/0908/d40/packshop/Trunk/Backup/Images/kernel/kernel_D40"

adb操作:

adb devices  //连接d40的adb
adb pull /extern/err/core-hunter-11-0-0-440-18  //获取d40中的文件,注意传输文件不是在终端模式

adb shell   //adb连接终端

添加lrzsz工具

嵌入式开发——文件系统部署rz、sz命令_lrz命令-CSDN博客

1.下载源码

官网:https://ohse.de/uwe/software/lrzsz.html

2.解压编译源码,编译时要指定编译工具链,和d40的编译工具链一致

tar zxvf lrzsz-0.12.20.tar.gz
cd lrzsz-0.12.20/
CC=/opt/rockchip-linux/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc CFLAGS=-O2 ./configure
make -j12

3.将编译出来的src/lrz和lsz复制到文件系统的/bin目录,对应代码的\d40\packshop\Trunk\Images\rootfs\bin\

4.编译代码烧录后,便能在嵌入式开发板上面使用,上传指令是lrz,下载是lsz,配合SecureCRT便能实现文件的传输

1sz core-hunter-11-0-0-399-15//传输文件到电脑

dea2924360f64e89b63644f347c6bf64.png

e9976c6c2e1d44b2a434b478017251c7.png

添加core dump功能

首先在rcS文件里面添加如下指令,使得在启动应用程序之前,先打开core dump功能,并指定core dump保存的地址和大小,

rm -rf /extern/err/
mkdir /extern/err/
ulimit -c 25600
echo "/extern/err/core-%e-%s-%u-%g-%p-%t" > /proc/sys/kernel/core_pattern
sync

ulimit -c unlimited//如果需要配置成无限制core dump大小选这个

ec1440d5f7f6402d9385969adbd258e6.png设置完后,当产生错误,程序会产生core dump文件,地址为/extern/err/,然后用lrzsz把文件传出

1sz core-hunter-11-0-0-399-15

e9976c6c2e1d44b2a434b478017251c7.png

或者使用adb把文件传出

adb devices
adb pull /extern/err/core-hunter-11-0-0-440-18//注意修改文件名

712fd8d5600f4c85b0c0b42f55964ff5.png

将core dump文件复制到linux,执行gdb指令,注意,gdb需要和你的编译工具链配合,如我的编译工具链是/opt/rockchip-linux/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc

那么我应该使用的gdb应该是/opt/rockchip-linux/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gdb

指令如下

还需要注意的是hunter.debug应该和烧录的hunter要同一次编出来的,不然会有问题,所以编译完建议吧hunter.debug复制出来

注意:使用gdb指令调试core dump还需要可执行文件才行

gdb  "/home/zhanbb/D40/adb/a15-rk3308/packshop-a15/Trunk/Proj/Bin/hunter.debug"   "/home/zhanbb/D40/core/core-hunter-11-0-0-440-18"     //记得修改core-hunter-11-0-0-443-16文件名

9723339ef32548bba2af8f87ac234c01.png

893ca69db1c64f8eaa058d3805685edc.png

问1:core dump+GDB的调试手段详解,并且可以使用哪些gdb指令分析core dump文件:

Core dump文件是程序异常终止时,操作系统生成的一个文件,它记录了程序崩溃时的内存、寄存器状态、堆栈信息等。通过分析core dump文件,可以帮助开发者定位程序崩溃的原因。GDB(GNU Debugger)是一种广泛使用的调试工具,能够帮助开发者分析core dump文件。下面将详细介绍如何使用GDB调试core dump文件,以及相关的GDB指令。

### 开启Core Dump文件生成

首先,确保系统允许生成core dump文件。在Linux系统中,可以通过`ulimit -c unlimited`命令来取消core文件大小的限制,从而使得在程序崩溃时能够生成core dump文件。

### 使用GDB分析Core Dump文件

1. **启动GDB**:在命令行中输入`gdb <程序名> <core文件名>`启动GDB,并加载core dump文件。例如,如果程序名为`a.out`,core dump文件名为`core.1234`,则输入`gdb a.out core.1234`。

2. **基本分析**:

   - `bt`:显示当前线程的调用栈帧(backtrace),这是最常用的调试命令之一,可以让你看到程序崩溃时的函数调用关系。

   - `info threads`:列出所有线程,对于多线程程序,可以查看哪些线程在运行。

   - `thread <num>`:切换到编号为`<num>`的线程,与`info threads`命令配合使用,可以逐个检查各个线程的状态。

3. **深入分析**:

   - `frame <n>`:选择调用栈中的第`n`个栈帧。在有了调用栈的情况下,可以通过该命令进一步查看不同栈帧的上下文。

   - `list`:显示当前执行代码的周围源代码。如果GDB能找到源代码,这个命令可以帮助理解程序崩溃时正在执行什么代码。

   - `print <expr>`:打印表达式`<expr>`的值。这可以用来查看变量的值或者表达式的结果。

   - `x/<n>f <address>`:以格式`f`(如`x`表示十六进制)显示内存地址`<address>`开始的`<n>`个单位的内容。这个命令对于分析程序的内存状态非常有用。

4. **特定情况分析**:

   - 对于段错误(Segmentation Fault):通常需要检查导致崩溃的指针或内存访问操作,使用`x`命令检查崩溃时访问的内存地址。

   - 对于死锁:查看各线程的调用栈和锁的状态,确定是哪个资源造成的死锁。

5. **退出GDB**:输入`quit`或简写`q`退出GDB。

### 高级功能

- **设置条件断点**:如果想在特定条件下才停止程序,可以使用`break`命令的条件形式,如`break file.c:123 if x==1`。

- **查看变量的历史值**:如果开启了GDB的逆向调试功能(需要GDB支持),可以查看变量在过去的值,帮助分析变量如何变化至异常状态。

- **自动化分析**:可以编写GDB脚本自动执行一系列命令,对于复杂的分析过程,这可以大大节省时间。

通过上述方法和指令,你可以对core dump文件进行深入分析,找到程序崩溃的原因。务必记住,有效的调试是建立在对程序结构和逻辑深入理解的基础上的。因此,在使用GDB等工具时,结合对代码的熟悉和理解,才能更高效地定位问题。

问2:与直接在GDB运行程序类似, core dump文件加 载起来之后,GDB会直接显示触发问题的那一行 代码,也可以使用backtrace、print等常规命令 从core dump文件中获取信息,请详细说说如何使用backtrace、print等常规命令 从core dump文件中获取信息

当使用GDB加载core dump文件后,可以通过一系列的命令来获取程序崩溃时的详细信息。这些信息对于理解程序在崩溃时的状态非常有帮助。下面详细解释如何使用`backtrace`、`print`等常规命令从core dump文件中获取信息。

### 使用`backtrace`获取调用栈信息

1. **`backtrace`或`bt`命令**:这是分析core dump文件时最常用的命令之一。它显示了程序崩溃时的函数调用栈(也称为堆栈跟踪)。每一行代表一个栈帧,包含了函数名、源文件名和行号(如果可用)。

   

   - 使用方法:在GDB提示符下输入`backtrace`或简写`bt`后回车。

2. **查看特定栈帧的详细信息**:通过`frame <n>`或`f <n>`命令选择特定的栈帧,其中`<n>`是`backtrace`命令输出中的栈帧编号。选中栈帧后,可以更详细地查看该栈帧的上下文信息。

### 使用`print`打印变量值

1. **`print <expression>`或`p <expression>`命令**:用于打印表达式的值。这个命令非常有用,可以查看崩溃时各种变量的值。`<expression>`可以是变量名、数组元素、结构体成员等。

   - 使用方法:在GDB提示符下输入`print 变量名`或`p 变量名`后回车。

2. **查看复杂类型的变量**:对于结构体、类实例等复杂类型的变量,`print`命令同样适用。例如,如果想查看一个名为`obj`的对象的`member`成员,可以使用`print obj.member`。

### 其他相关命令

- **`info locals`命令**:显示当前栈帧中所有局部变量的值。这对于快速查看函数内部状态非常有用。

- **`list`命令**:显示当前代码的周围源代码。如果你已经通过`backtrace`定位到了问题发生的函数,使用`list`可以查看该函数的源代码,帮助理解代码逻辑。

- **`x`命令**:用于检查内存地址处的内容。格式为`x/NFU addr`,其中N是要显示的单元数,F是显示格式,U是单位大小,addr是内存地址。这对于分析指针引用、数组内容等非常有帮助。

### 实际操作示例

假设你已经加载了core dump文件,并且GDB停在了触发问题的那一行代码。你可以按照以下步骤进行:

1. 输入`bt`或`backtrace`查看调用栈。

2. 选择感兴趣的栈帧(如第0帧)使用`frame 0`。

3. 使用`info locals`查看当前栈帧的局部变量。

4. 对于特定变量,使用`print 变量名`来查看其值。

5. 如果需要查看源代码,使用`list`命令。

通过这些步骤,你可以获取大量关于程序崩溃时状态的信息,这对于诊断问题和修复bug非常有帮助。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

文武先生hh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值