在进行嵌入式系统开发中,受到嵌入式系统资源的限制,调试环境和通用桌面系统的调试环境有差别,引入了远程调试技术。这时,调试器运行于通过桌面系统,被调试的程序则运行于基于特定硬件平台的嵌入式系统(目标系统)。因此,要求调试器和被调试程序之间进行通信,调试器还需要能够处理某些特定硬件平台的信息。
  插桩(stub)方案是在目标系统和调试器内分别加入某些功能模块,二者互通信息来进行调试。而通过引入GDBSERVER这个远程服务程序,正好可以充当目标机上的stub,本地主机上运行我们通常使用的调试器GDB,当时在指定“调试目标”的时候我们不再用file命令指定调试的可执行文件,而是用target remote命令来指定需要调试的目标机,由它发起对目标机的连接。
  远程调试示意图:

  GDB远程调试环境原理图:

(用dia做的图,但是怎么边线没有导出来?)
  一个远程调试实例(由于我身边没有开发板,只能把主机当目标机来做实验拉。):这里通过搭建一个主机PC端和目标机端的gdbserver来做实验。
  1、编译宿主机上的GDB调试器
  如果目标机是arm内核的话,就得用arm-linux-gcc来编译gdb拉,我这里直接就可以用系统已经安装的gdb。
  2、编译目标机上的stub程序,即编译一个gdbserver(这个stub程序也应该是符合目标机内核体系结构的,如果是arm,也需要用arm-linux-gcc来编译)并下载到目标机上去,我这里直接用已经安装好的gdbserver。
  3、编写一个简单的用于调试的程序
  
                
                
                /* test.c */
#include stdio.h>
int main()
{
        int i;
        i = 10;
        printf("i = %d\n", i);
        return 0;
}
  4、编译可运行于目标板的机器代码,并下载到目标机上
如果目标板是arm,那么应该这么编译:
shell> arm-linux-gcc  -g -o test test.c
我这里直接这么编译就可以拉:
shell> gcc  -g -o test test.c编译好以后就要下载到目标机上,并且在宿主机上也要保留一份。
  5、在目标机上运行gdbserver服务
shell> gdbserver 127.0.0.1:2345 test
Process test created; pid = 12655
Listening on port 2345
  6、在宿主机上发起连接和调试
shell> gdb test
GNU gdb 6.4-debian
Copyright 2005 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i486-linux-gnu"...Using host libthread_db library "/lib/tls/i686/cmov/libthread_db.so.1".
(gdb) target remote 127.0.0.1:2345
Remote debugging using 127.0.0.1:2345
0xb7f4d790 in ?? ()
这个时候我们可以看到目标机那边有了出现了下面的信息:
Remote debugging from host 127.0.0.1

说明连接成功,下面就可以在宿主机上进行调试拉。这个调试和我们平时在桌面系统进行gdb调试是一样的。
比如列出源代码信息:
(gdb) l
1       /* test.c */
2       #include 
3
4       int main()
5       {
6               int i;
7
8               i = 10;
9
10              printf("i = %d\n", i);
  如果想进行内核调试的话,可以用kgdb。内核调试步骤大概如下:
  1、在http://kgdb.linsyssoft.com/downloads上下载当前使用内核的kgdb patch,在主机端安装patch:
shell> cd /path/to/kernel/source
shell> patch -p1 -i /path/to/patch/file
  运行make menuconfig命令确保kgdb选项中的KERNEL_HACKING被选上,重新编译内核,把新生成的内核镜像zImage复制到开发板。
  2、在启动开发板上的内核前需要设置:gdb gdbttyS=0 gdbbaud=38400。这样系统启动的时候将在创建init内核线程之前听下来,等待主机的gdb连接。
  3、在主机端建立和目标机(开发板)的KGDB调试接口的连接:
shell> cd /path/to/kernel/source
shell> gdb vmlinux
gdb: set remotebaud 38400
gdb: target remote /dev/ttyS0
  之后的过程就和普通gdb调试类似拉。这里的KGDB和GDBSERVER一样也是一个stub哦。在目标机端用来和主机端的gdb调试器进行通信,从而实现远程调试。
说明:以上内容为《嵌入式系统开发原理与实践》第7章学习笔记。

利用GDB进行远程调试相关推荐

  1. eclipse gdb gdbserver 远程调试

    https://blog.csdn.net/linuxarmsummary/article/details/44975495 我们在 Linux 主机中搭建我们的开发环境,使用 Ubuntu 10.0 ...

  2. tomcat开发远程调试端口以及利用eclipse进行远程调试

    一.tomcat开发远程调试端口 方法1 WIN系统 在catalina.bat里:  SET CATALINA_OPTS=-server -Xdebug -Xnoagent -Djava.compi ...

  3. 【嵌入式】Linux开发工具gdb及远程调试

    gdb及远程调试 gdb gdb安装 gdb调试命令 gdb 调试步骤 嵌入式远程调试 在开发板上运行 gdbserver 在PC端执行 其他Liunx开发工具 交叉反汇编器 arm-linux-ob ...

  4. 利用开发者工具远程调试Android时,华为手机无法被识别

    利用开发者工具远程调试Android时,华为手机无法被识别的解决办法: 安装华为手机助手,成功安装华为手机驱动,重启USB调试,就可以了. 参考资料: 远程调试Android设备使用入门 键盘快捷键参 ...

  5. VsCode + gdb + gdbserver远程调试arm嵌入式linux C/C++程序

    基本流程跟我的另一篇文章<VsCode + gdb + gdbserver远程调试C++程序>一样,不一样的是需要重新编译gdb和交叉编译gdbserver. 一.准备工作 sudo ap ...

  6. 利用GDB进行多线程调试

    一.多线程调试 多线程调试重要就是下面几个命令: info thread 查看当前进程的线程. thread <ID> 切换调试的线程为指定ID的线程. break file.c:100 ...

  7. 在海思芯片上使用GDB远程调试

    0.载GDB安装包,下载地址:Index of /gnu/gdb,使用8.2版本 1.见下面链接: 在海思芯片上使用GDB远程调试_大橙子疯的博客-CSDN博客_海思gdb调试 和 arm-linux ...

  8. 使用gdbserver远程调试

    使用gdbserver远程调试   1.默认crosstool交叉编译器没有自带gdbserver,需要自行编译 到GNU官方FTP下载,目前最新版的是gdb-6.7.1 下载地址:http://ft ...

  9. 通过QEMU 和 IDA Pro远程调试设备固件

    0x00 背景与简介 这篇文章主要讲了如何在模拟环境下调试设备固件. 作者:Zach Cutlip 原文链接:http://shadow-file.blogspot.gr/2015/01/dynami ...

最新文章

  1. python太阳花的编程_python大佬养成计划----HTML DOM
  2. 【Python】str转datetime与datetime计算
  3. 鸿蒙系统的升级名单,首批升级鸿蒙系统的名单确认,华为安卓系统将成为过去式!...
  4. JZOJ 5390. 【NOIP2017提高A组模拟9.26】逗气
  5. 微分方程_微分方程 | 线性微分方程组的求解(上)
  6. String练习代码保存
  7. 促销海报设计的套路你知道么? 看这里!
  8. python 安装pyautogui图形自动化
  9. Kernel Panic常见原因以及解决方法
  10. ug链轮设计软件_同为三维设计软件,solidworks与ug有何不同
  11. DMA访问(直接内存访问)
  12. SIFT算法原理介绍
  13. 惠普803墨盒清零步骤_打印机惠普7110墨盒清零的方法
  14. Win10环境下VS2003安装教程
  15. 本地访问阿里云故障问题
  16. 5V转3V的降压芯片和LDO
  17. 正版软件 Directory Opus 12 Pro Windows 平台上的资源管理器,定是功能完全、可定制化程度高的那款。
  18. SVG—初识5之SVG变形动画和阶段性学习成果展示
  19. Node.js 有难度的面试题,你能答对几个?
  20. 【JavaScript】制作一个抽奖转盘页面

热门文章

  1. linux系统取代windows,Linux不可能取代Windows
  2. centos将某一目录权限给用户_centos7如何新建普通权限用户,仅能访问指定目录,使用gcc?...
  3. 使用嵌套循环,打印四行五列星星矩形(每次只能打印一个*)
  4. signature=14a3e4f784cf9004647ea52bac22e550,维族老年慢性阻塞性肺疾病患者合并肺动脉高压的临床研究...
  5. mysql mpm_使用Zabbix + MPM全面监控MySQL
  6. python django下载_简单了解django文件下载方式
  7. so库调用java函数_linux下so动态库调用主程序函数
  8. mysql优化难 选db2_DB2数据库优化的几条策略_MySQL
  9. python 安装包列表导出到 txt
  10. sun.misc.unsafe类的使用