zoukankan      html  css  js  c++  java
  • 嵌入式交叉编译GDB,结合vscode图形化调试C和C++代码 coredump定位段错误

    第一部分:交叉编译GDB

    GDB源码下载路径:
    http://ftp.gnu.org/gnu/gdb/


    遇到的主要难点:

    选择合适的GDB源码版本
    我的mips-linux交叉编译器不支持C++11特性,所以我选择较老的GDB版本
    //是不是不太明白我在说啥?自己去试错就知道了。我之前选择了GDB9.1版本,编译途中遇到报该错。
    //之后又下载了一个GDB版本来编译,make的时候有其他错误,我无法解决。
    最终,我选择的合适版本是 gdb-7.12.1.tar.xz,建议读者也下载该版本。
    //版本老点不要紧,够用就行。贪多嚼不烂。
    

      

    编译前基本知识科普:

    --prefix指定安装路径 
    后面的路径一般是我们自己新创建的用来存放目标程序(现在我们的目标程序就是GDB)的文件夹
    
    --target --host 一般一样,指定为交叉编译器的前缀
    (我当前mips平台的交叉编译器是mips-linux-gnu-gcc,所以这里后面写mips-linux-gnu)
    
    CC指定交叉编译器
    

      

    之后进行编译安装,参考的文档是:

    正点原子的<< I.MX6U嵌入式Linux驱动开发指南V1.5.pdf>>第B3章节,

    后续操作步骤只有几步,很简单。可转去参考该文档,不参考也可以,本博客也会详解步骤。

    我的GDB源码,默认解压后得到的文件夹是gdb-7.12.1,cd进入该文件夹,就是进入了源码根目录。

    1.1 在源码根目录下,执行交叉编译GDB并安装:

    ./configure --target=mips-linux-gnu --prefix=/home/lmw/open_lib/GDB/GDBStupHere
    make 
    make install

    留心点(point):

    1.2 进入源码根目录内的gdb/gdbserver子文件夹,执行交叉编译GDBServer:

    ./configure --target=mips-linux-gnu --host=mips-linux-gnu CC=mips-linux-gnu-gcc
    make
    

      

    其他备注:

    0. 必须先保证开发板和ubuntu主机能ping通,我们在ubuntu主机内进行代码编写,

    所以我的应用程序源码在ubuntu主机内。


    1.

    编译应用程序时要加[-g]选项,否则,GDB调试时会报错。

    2.

    在我的linux板子上,执行:
    gdbserver 192.168.1.23:2001 main_app
    //192.168.1.23是主机ubuntu的IP,2001是端口号,可以随便写, main_app是目标可执行程序
    
    开启ubuntu终端,在待调试的应用程序源码文件夹内去启动GDB,执行:
    mips-linux-gnu-gdb main_app
    
    连接到开发板上,执行:
    target remote 192.168.1.20:2001
    //192.168.1.20是开发板的IP
    
    之后ubuntu主机与开发板即可连接成功,可以使用GDB命令进行调试了。
    

      

     我的ubuntu情况展示:

     第二部分: 结合vscode进行图形化调试

     PS:

     

    下图是图形化调试前需要在嵌入式板子上敲的命令:

    之后我们点击linux系统内的vscode上的调试按钮就可以了:

    第三部分:  段错误解决神器之coredump使用

    Core Dump
    当程序运行的过程中异常终止或崩溃,操作系统会将程序当时的内存状态记录下来,保存在一个文件中,这种行为就叫做Core Dump(中文有的翻译成“核心转储”)。
    我们可以认为 core dump 是“内存快照”,但实际上,除了内存信息之外,还有些关键的程序运行状态也会同时 dump 下来,
    例如寄存器信息(包括程序指针、栈指针等)、内存管理信息、其他处理器和操作系统状态和信息。
    core dump 对于编程人员诊断和调试程序是非常有帮助的,因为对于有些程序错误是很难重现的,例如指针异常,而 core dump 文件可以再现程序出错时的情景。
    
    相关设置
    如果没有进行core dump 的相关设置,默认是不开启的。可以通过ulimit -c查看是否开启。如果输出为0,则没有开启,
    需要执行ulimit -c unlimited开启core dump功能。
    编译应用程序源码时要加-g选项。

     

     PS:需要注意,要通过menuconfig配置内核,使能core功能:

    第四部分  调试CPP代码

    .

    /************* 社会的有色眼光是:博士生、研究生、本科生、车间工人; 重点大学高材生、普通院校、二流院校、野鸡大学; 年薪百万、五十万、五万; 这些都只是帽子,可以失败千百次,但我和社会都觉得,人只要成功一次,就能换一顶帽子,只是社会看不见你之前的失败的帽子。 当然,换帽子决不是最终目的,走好自己的路就行。 杭州.大话西游 *******/
  • 相关阅读:
    elf和内存分布
    平衡二叉树
    sdio驱动
    wifi
    阻塞赋值与非阻塞赋值
    线性失真与非线性失真
    数字前端,后端介绍
    总线
    并行全比较排序算法&并对角标排序
    verilog memory
  • 原文地址:https://www.cnblogs.com/happybirthdaytoyou/p/13558041.html
Copyright © 2011-2022 走看看