博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
搭建交叉调试环境 arm-linux-gdb配合gdbserver
阅读量:4927 次
发布时间:2019-06-11

本文共 1801 字,大约阅读时间需要 6 分钟。

    在嵌入式开发中,有时候需要进行源码级别的调试,可以设置断点,单步执行,相比于每步打印printf或者printk来说,更加友好。下面就来介绍这种调试方法。

    gdb交叉调试类似于网络浏览器,本地PC为客户端,远程开发板为服务器端,双方都要统一编译工具链,版本最好保持一致。 

   --target 指定了目标机交叉编译器前缀,比如--target=arm-linux ,缺省值为i386-linux

   --host   指定了编译后的程序需要在哪里运行, 比如,--host=arm-linux

   --prefix  指定了要安装的目录

    因此,在编译arm-linux-gdb的时候,不需要指定host,因为它是在本地PC上跑的,在编译gdbserver时,需要指定host为arm-linux,因为,gdbserver是在arm平台上跑的。两者都需要指定相同的target。

    编译arm-linux-gdb

    在gdb-7.8的解压目录下新建 arm-gdb,用于存放编译生成文件。

    ./configure --target=arm-linux --prefix=/ -gdb/

     然后make && make install ,就可以在arn-gdb/bin/目录下面找到arm-linux-gdb,

     如果有需要,可以将此执行路径加入到系统环境变量中去。

    编译gdbserver

    在gdb-7.8目录中,切换到gdb/gdbserver目录中,

    ./configure  --target=arm-linux  --host=arm-linux

    然后 make CC=/opt/gcc-3.4.5-glibc-2.3.6/bin/arm-linux-gcc ,就可以再当前目录下生成gdbserver。

    这里需要注意的是运行gdbserver还需要libthread_db库,若你自己做的文件系统内没有这个库的话需要将本地交叉编译工具中的libthread_db*拷贝到开发板中去。

    sudo cp /opt/gcc-3.4.5-glibc-2.3.6/arm-linux/lib/libthread_db* /home/hao/nfs/lib/ –d

    使用-d选项,复制时,连同链接关系一起复制过去。

    使用方法

    将生成的gdbserver拷贝到开发板上去,PC机和开发板之间通过nfs文件系统沟通,开发板IP:192.168.0.200,本地主机IP:192.168.0.104

    在本地机器上面,用arm-linux-gcc –g 编译一个应用程序,在开发板上,执行

   

    gpbserver使用方法: gpbserver 开发板ip地址:通信端口(随意取) 要调试的程序 【程序的命令行参数】

    然后在本地机器上面,启动arm-linux-gdb,操作如下:

  

    连接成功后,开发板上会显示:

   

    然后就可以在本地PC上面执行gdb命令,调试输出在

    注意:执行target remote 后,开发板上面的程序已经在运行,本地不能使用run命令,而能用continue命令。

    调试命令在本地输入,调试输出结果在开发板上面输出。

    原理介绍,在开发板上面的gdbserver会启动一个子进程,然后用测试程序替换子进程,自身作为父进程,接收来自PC机上面arm-ling-gdb的调试命令输入,

   

    让程序在奔溃时产生core dump文件,用PC机上面的arm-linux-gdb来分析此文件,确定崩溃位置。  

    1. 产生core dump文件

       linux系统默认是不产生core dump文件(ulimit –c 得出结果为0,程序不产生),设置ulimit –c unlimited,不限制core dump输出大小。

    2. 执行待测试程序,产生core dump文件,默认名为core

    3. 使用arm-linux-gdb调试core文件

        在本地PC机器上面,执行 arm-linux-gdb ./test_debug ./core 文件,就可以发现产生段错误的地址。

   

      这样的调试,看起来很复杂,如果实在想调试,而且CPU处理速度够快的话,直接移植低版本的gdb到板子上就行。

 

  gdb交叉调试相关链接:

 

 

 

Technorati 标签: ,

转载于:https://www.cnblogs.com/cherishui/p/4414013.html

你可能感兴趣的文章
vue2 cdn 加载html,vue项目中使用CDN加载
查看>>
数组转集合踩坑
查看>>
node.js的异步I/O、事件驱动、单线程
查看>>
vue cli3 子目录问题
查看>>
github.com访问慢解决
查看>>
微服务架构最强详解
查看>>
转:哈夫曼树详解
查看>>
.Net Core Identity外面使用Cookie中间件
查看>>
【坐在马桶上看算法】算法1:最快最简单的排序——桶排序
查看>>
C#中泛型之Dictionary
查看>>
强连通分量
查看>>
Linux 入门 bash语句 第三课
查看>>
LeetCode 27. 移除元素
查看>>
【原创】phpcms v9 0day
查看>>
杂谈SharpDx中的WIC组件——我们需要WIC的图片编码功能么?
查看>>
移动端弹性盒
查看>>
觉得比较重要的一张触发器的图,高手跳过哈!
查看>>
JAVA中使用jcifs集成AD域用户认证
查看>>
SSH框架 jar包版本的选择
查看>>
1699. Turning Turtles
查看>>