编译和使用 gdb

在 linux 和 arm 上跑 gdb

Posted by Jerry Chen on February 25, 2021

编译准备

源码

编译器

  • 编译器 gcc
  • 交叉编译器 arm-linux-gnueabihf-gcc

Linux 平台下 for linux 的编译

编译依赖的 expat 库

  1. 解压 tar 包

    1
    
    tar -vxf expat-2.2.10.tar.gz
    
  2. 进入解压后目录,并进行配置

    host 体系怎么写?会根据 host 自动选择编译器为 your-host-gcc 系(注意需要能通过环境变量找到它);

    ldd /usr/bin/bash 命令的结果中有一条 libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2,其中 x86_64-linux-gnu 就是当前体系;

    1
    
    ./configure --host=x86_64-linux-gnu --prefix=$PWD/_install
    
  3. 编译和安装

    1
    
    make && make install
    

最终生成 libexpat.a;

编译 gdb

  1. 安装工具

    没有 texinfo 编译会报错 “makeinfo: not found”

    1
    
    sudo apt-get install texinfo
    
  2. 解压 tar 包

    1
    
    tar -vxf gdb-10.1.tar.gz
    
  3. 进入解压后目录,并进行配置

    host 体系会自动选择编译器(注意需要能通过环境变量找到它),target 体系为远程调试的目标体系;

    --disable-werror 的意思是让警告不作为错误提示;

    1
    2
    
    ./configure --host=x86_64-linux-gnu --target=x86_64-linux-gnu --prefix=$PWD/_output --disable-werror\
    --with-expat --includedir=$HOME/public/expat-2.2.10/_install/include --libdir=$HOME/public/expat-2.2.10/_install/lib
    
  4. 编译和安装

    1
    
    make && make install
    

最终生成 x86_64 目标文件:gdb

Linux 平台下 for armhf 的编译

编译依赖的 expat 库

  1. 解压 tar 包

    1
    
    tar -vxf expat-2.2.10.tar.gz
    
  2. 进入解压后目录,并进行配置

    host 体系怎么写?会根据 host 自动选择编译器为 your-host-gcc 系(注意需要能通过环境变量找到它);

    ldd /usr/bin/bash 命令的结果中有一条 libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2,其中 x86_64-linux-gnu 就是当前体系;

    1
    
    ./configure --host=x86_64-linux-gnu --prefix=$PWD/_install
    
  3. 编译和安装

    1
    
    make && make install
    

最终生成 libexpat.a;

编译 gdb

  1. 安装工具

    没有 texinfo 编译会报错 “makeinfo: not found”

    1
    
    sudo apt-get install texinfo
    
  2. 解压 tar 包

    1
    
    tar -vxf gdb-10.1.tar.gz
    
  3. 进入解压后目录,并进行配置

    host 体系会自动选择编译器(注意需要能通过环境变量找到它),target 体系为远程调试的目标体系;

    --disable-werror 的意思是让警告不作为错误提示;

    1
    2
    
    ./configure --host=x86_64-linux-gnu --target=arm-linux-gnueabihf --prefix=$PWD/_output --disable-werror\
    --with-expat --includedir=$HOME/public/expat-2.2.10/_install/include --libdir=$HOME/public/expat-2.2.10/_install/lib
    
  4. 编译和安装

    1
    
    make && make install
    

最终生成 x86_64 目标文件:arm-linux-gnueabihf-gdb

armhf 平台下 for armhf 的编译

编译依赖的 expat 库

  1. 解压 tar 包

    1
    
    tar -vxf expat-2.2.10.tar.gz
    
  2. 进入解压后目录,并进行配置

    host 体系怎么写?会根据 host 自动选择编译器为 your-host-gcc 系(注意需要能通过环境变量找到它);

    1
    
    ./configure --host=arm-linux-gnueabihf --prefix=$PWD/_install
    
  3. 编译和安装

    1
    
    make && make install
    

最终生成 libexpat.a;

编译 gdb

  1. 安装工具

    没有 texinfo 编译会报错 “makeinfo: not found”

    1
    
    sudo apt-get install texinfo
    
  2. 解压 tar 包

    1
    
    tar -vxf gdb-10.1.tar.gz
    
  3. 进入解压后目录,并进行配置

    host 体系会自动选择编译器(注意需要能通过环境变量找到它),target 体系为远程调试的目标体系;

    --disable-werror 的意思是让警告不作为错误提示;

    1
    2
    
    ./configure --host=arm-linux-gnueabihf --target=arm-linux-gnueabihf --prefix=$PWD/_output --disable-werror\
    --with-expat --includedir=$HOME/public/expat-2.2.10/_install/include --libdir=$HOME/public/expat-2.2.10/_install/lib
    
  4. 编译和安装

    1
    
    make && make install
    

最终生成 arm 目标文件:gdb

关于 ulimit

ulimit 用于限制 shell 启动进程所占用的资源,不同参数是不同的种类的资源;

默认限制

默认不允许产生 core 文件;

允许产生 coredump 文件

以下可临时解除限制,只在一个 shell 中生效;

永久生效可添加到 /etc/profile 末尾;

1
ulimit -c unlimited

进行测试

建议操作

  1. 将动态库拷贝到 /usr/lib 下,这样就不用 export LD_LIBRARY_PATH=xxx 了;
  2. gdb 拷贝到 /usr/bin 下;

产生一个 coredump

  1. 解除 core 文件限制

    1
    
    ulimit -c unlimited
    
  2. 编写段错误程序 test.c

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    #include <stdio.h>
       
    int main(int argc, char *argv[])
    {
        char *a = 0;
        printf("222222\n");
        *a = 8;
        printf("333333\n");
        return 0;
    }
    
  3. 编译 main.c

    1
    
    gcc -g test.c -o test
    
  4. 运行程序,产生 core

    /proc/sys/kernel/core_pattern 可以设置格式化的 core 文件保存位置或文件名;

    1
    2
    3
    
    ➜  ~ ./test
    222222
    [1]    13365 segmentation fault  ./test
    
  5. 使用 gdb 调试段错误程序 + core 文件

    执行后会立刻定位到段错误发生行,也可在 gdb 环境中输入 where 进行定位;

    1
    
    gdb test core