嵌入式技术分享

Embedded Technology Sharing

gdb在嵌入式arm linux软件开发上的使用

目标

在arm linux系统中使用gdb工具,快速定位软件开发过程中产生的段错误(Segment fault)位置,提高软件开发及调试效率。
需要交叉编译gdb。

下载gdb源码

wget https://ftp.gnu.org/gnu/gdb/gdb-8.3.1.tar.xz

解压

tar -vxf gdb-8.3.1.tar.xz

配置 -> 编译 -> 安装

vi gdb_build.sh

#!/bin/bash
export PATH=$PATH:/usr/local/arm/arm-2009q3/bin
make distclean
CUR_DIR=`pwd`
SRC=${CUR_DIR}
INSTALL_PREFIX=${CUR_DIR}/arm-gdb
CROSS_PREFIX=arm-none-linux-gnueabi
rm -rf ${INSTALL_PREFIX}
mkdir -p ${INSTALL_PREFIX}

cd ${SRC}

./configure  \
        --host=${CROSS_PREFIX} \
        --prefix=${INSTALL_PREFIX} \
#       --enable-shared \
        --disable-werror \
        --without-uiout \
        --enable-tui --disable-gdbtk --without-x \
        --without-included-gettext \
        --enable-threads \
        --with-expat \
        --without-python \
        --disable-binutils \
        --disable-ld \
        --disable-gas \
        --disable-sim

make -j4 && make -j4 install

cd -

注意:
1.交叉编译器名称;
2.重新加载交叉编译器路径到环境变量;
3.选择是否开启动态库,默认使用静态。

段错误演示

1.pc
2.arm linux

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void test(void)
{
        char *p = NULL;
        //p = malloc(10);
        strcpy(p,"10");
        printf("p=%s\n", p);
        free(p);
}

int main(int argc, char *argv[])
{
        printf("11111111\n");
        test();
        printf("22222222\n");
        return 0;
}

什么是core dumped

core的意思是核心,dumped的意思就是抛出,转储,core dumped就是核心转储的意思。当一个进程异常退出前,该进程会抛出当时该程序进程的内存详细情况并将这些信息存储在硬盘上,文件名通常是core,这行为(过程)就叫core dump。

生成core_dump文件

ulimit -c unlimited
echo “core-%e-%p-%t” > /proc/sys/kernel/core_pattern

调试

gdb 可执行文件 core_dump文件

如果文章对您有帮助,欢迎移至上方按钮打赏博主;

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注