嵌入式调试程序GDB Server

合集下载

gdbserver 工作原理

gdbserver 工作原理

gdbserver 工作原理gdbserver是一种用于调试目标程序的工具,它与gdb(GNU调试器)配合使用,可以实现远程调试功能。

本文将介绍gdbserver 的工作原理及其在调试过程中的应用。

一、gdbserver的工作原理gdbserver是一个在目标系统上运行的程序,它与gdb通过网络连接进行通信。

在目标系统上,gdbserver会替代目标程序的执行,从而使得gdb可以对目标程序进行远程调试。

具体来说,gdbserver的工作原理如下:1. 在目标系统上启动gdbserver,并指定目标程序的可执行文件及其参数。

2. gdbserver会监听一个指定的端口,等待gdb的连接。

3. 在主机上,通过gdb命令连接到目标系统的gdbserver。

4. gdb与gdbserver建立通信后,可以发送各种命令给gdbserver,如设置断点、查看变量值等。

5. gdbserver接收到命令后,在目标系统上执行相应的操作,并将结果返回给gdb。

6. gdb根据返回的结果进行调试操作,如显示变量值、执行下一条指令等。

7. 调试过程中,gdbserver会不断接收来自gdb的命令,并在目标系统上执行相应的操作。

二、gdbserver的应用gdbserver主要用于以下场景:1. 嵌入式系统调试:对于嵌入式系统,通常无法直接在开发主机上运行目标程序,而是需要将目标程序部署到目标系统上进行调试。

gdbserver提供了一种远程调试的方式,可以通过网络连接到目标系统进行调试。

2. 跨平台调试:gdbserver可以在不同的操作系统上运行,例如在Linux上运行gdbserver进行Windows程序的调试。

这种方式可以避免在不同操作系统之间部署gdb的复杂性。

3. 防止干扰:在某些情况下,调试器的运行会对目标程序的执行产生干扰,导致调试结果不准确。

使用gdbserver可以避免这种问题,因为gdbserver运行在目标系统上,与目标程序相互独立。

gdbserver

gdbserver

gdbservergdbserver远程调试嵌入式linux应用程序方法此处所讲的是基于gdb和gdbsever的远程调试方法。

环境为:PC机:win7、虚拟机:10.04、下位机:飞嵌TE2440开发板。

嵌入式linux应用程序的开发一般都是在linux里面编写好代码,并用交叉编译器arm-linux-gcc编译好之后再下载到板子上运行。

如果建立了远程调试(能够在PC机ubuntu中调试板子中的linux应用程序),这样对于开发程序是极其方便的。

以下是摘自网络上的一些方法。

其中加入了自己所遇到的一些问题,并提出了解决方法。

1、首先建立nfs文件系统,让PC机ubuntu上的文件系统这里假设路径为:/home/xxx/work/可以挂载到板子上去。

方法可以见本博的另一篇文章。

其中IP环境是PC 机win7的IP为192.168.0.11(这个不重要,只要保证在同一个网段即可)。

虚拟机中IP为:192.168.0.57。

下位机中的IP为192.168.0.16。

2、安装交叉编译环境arm-linux-gcc等工具。

方法可以网上找。

这里假设已经安装好,并且版本是3.4.1。

路径为:/usr/local/arm/3.4.1/bin。

并建好环境变量。

3、下面我们就来测试一个简单的例子。

/*Hello.c*/ #include int main() {printf(“hello word!\\n”); return 0; }程序输好以后确认无误,保存。

进入程序文件所在目录# arm-linux-gcc hello.c �Co hello将hello文件放入nfs共享目录中/home/xxx/work/中,并在串口终端中执行hello程序./hello。

4、安装gdb和gdbserver要经行gdbserver远程调试,还必须安装gdb远程调试工具: gdb的源代码包可以从http://.tw/Linux/sourceware/gdb/releases/下载,我下载的是gdb-6.6。

Gdb 的简单使用gdb+gdbserver 方式进行ARM 程序调试

Gdb 的简单使用gdb+gdbserver 方式进行ARM 程序调试

G db的简单使用gdb+gdb s e r v e r方式进行A R M程序调试1:gdb的简单使用G D B是G NU开源组织发布的一个强大的UN I X下的程序调试工具。

或许,各位比较喜欢那种图形界面方式的,像V C、B C B等I D E的调试,但如果你是在UN I X平台下做软件,你会发现G D B这个调试工具有比V C、B C B的图形化调试器更强大的功能。

所谓“寸有所长,尺有所短”就是这个道理。

一般来说,G D B主要帮忙你完成下面四个方面的功能:1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。

2、可让被调试的程序在你所指定的调置的断点处停住。

(断点可以是条件表达式)3、当程序被停住时,可以检查此时你的程序中所发生的事。

4、动态的改变你程序的执行环境。

从上面看来,G D B和一般的调试工具没有什么两样,基本上也是完成这些功能,不过在细节上,你会发现G D B这个调试工具的强大,大家可能比较习惯了图形化的调试工具,但有时候,命令行的调试工具却有着图形化工具所不能完成的功能。

让我们一一看来。

一个调试示例——————源程序:tst.c1#include<stdio.h>23int func(int n)4{5int sum=0,i;6for(i=0;i<n;i++)7{8sum+=i;9}10return sum;11}121314main()15{16int i;17long result=0;18for(i=1;i<=100;i++)19{20result+=i;21}2223printf("result[1-100]=%d\\n",result);24printf("result[1-250]=%d\\n",func(250));25}编译生成执行文件:(L i nu x下)h c hen/t e s t>cc-g t s t.c-o t s t使用G D B调试:h c hen/t e s t>gdb t s t<--启动G D BGNU gdb 5.1.1Copyright2002Free 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 itunder certain conditions.Type"show copying"to see the conditions.There is for details.T his GDB was configured as"i386-suse-linux"...(gdb)l<--l命令相当于li s t,从第一行开始例出原码。

gdbserver 程序参数

gdbserver 程序参数

gdbserver 程序参数
gdbserver是一个用于远程调试的程序,它允许你在目标系统上调试应用程序,而不必在本地运行调试器。

当你在远程目标系统上运行gdbserver时,你需要指定一些参数来配置它的行为。

首先,你需要指定gdbserver要调试的应用程序的名称和可选的命令行参数。

这通常是作为gdbserver的最后一个参数给出的,例如:
gdbserver :2345 myapp.
这里的":2345"是gdbserver监听的端口号,"myapp"是要调试的应用程序的名称。

其次,你可能需要指定一些调试相关的选项,例如是否允许远程主机连接、是否启用多线程调试等。

这些选项通常作为命令行参数给出,例如:
gdbserver --multi :2345 myapp.
这里的"--multi"选项表示启用多线程调试。

此外,你可能还需要指定一些与连接和认证相关的选项,例如指定允许连接的主机、设置连接密码等。

这些选项也可以作为命令行参数给出,具体取决于gdbserver的版本和支持的功能。

总之,通过适当地指定gdbserver的程序参数,你可以配置它以满足你的远程调试需求。

希望这些信息能够帮助你更好地使用gdbserver进行远程调试。

gdbServer调试

gdbServer调试

gdbServer调试调试android上的c/c++程序一直是个难题,以前我经常靠输出log来解决问题,对于稍复杂一些的工程,这几乎是个不可能完成的任务,尤其有些错误,在wincewindows下都没事,只在android上出现,就更难找了。

后来看了些资料,知道可以用gdbserver来调试,今天决定必须把这个先弄清楚,不然以后干活效率实在是太低了,找了很多网站,终于成功了。

这里把整个过程整理一下,以备以后查阅。

1.准备gdbserver。

android1.0代码刚对外开放到时候,里面并没拎gdbserver,有些强人就自己编程了gdbserver去采用。

不过现在不好了,android的新源码里已经涵盖了gdbserver,就在prebuilt目录下。

如果想要在android1.0里使用,可以到如下地址下载:准备工作把它放到/system/bin,这样它就在预设的path里了。

启动模拟器后:adbpushgdbserver/system/bin如果提示信息文件系统不容写下的话,继续执行一下“adbremount”,因为预设就是用所读模式装载的。

2.编译程序。

targetexecutable:libomstts(out/target/product/generic/obj/executables/libomstts_intermediates/linked/libomstts)prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-g++-nostdlib-bdynamic-wl,-t,build/core/armelf.x-wl,-z,nocopyreloc-wl,-dynamic-linker,/system/bin/linker-wl,--gc-sections-oout/target/product/generic/obj/executables/libomstts_intermediates/linked/libo mstts-lout/target/product/generic/obj/lib-wl,-rpath-link=out/target/product/generic/obj/lib-llog-lcutils-lutils-landroid_runtime-lnativehelper-lstdc++-lz-lc-lstdc++-lmout/target/product/generic/obj/lib/crtbegin_dynamic.oout/target/product/gene ric/obj/executables/libomstts_intermediates/src/tts.oout/target/product/generic/obj/executables/libomstts_intermediates/src/ttswrap per.oout/target/product/generic/obj/lib/crtend_android.otargetnon-prelinked:libomstts(out/target/product/generic/symbols/system/bin/libomstts)ou t/host/linux-x86/bin/acpout/target/product/generic/obj/executables/libomstts_intermediates/linked/libo msttsout/target/product/generic/symbols/system/bin/libomsttstargetstrip:(out/target/product/generic/obj/executables/libomstts_intermediates/libomstts) out/host/linux-x86/bin/soslim--strip--shady--quiet--outfileout/target/product/generic/symbols/system/bin/libomsttsout/target/product/generic/obj/executables/libomstts_intermediates/libomsttsin stall:out/target/product/generic/system/bin/libomsttslibomstts-fptout/host/linux-x86/bin/acp-fptout/target/product/generic/obj/executables/libomstts_intermediates/libomsttsou t/target/product/generic/system/bin/libomstts生成的可执行文件是libomstts,可以看到,初次链接的目标文件是“out/target/product/generic/obj/executables/libomstts_i ntermediates/linked/li bomstts”,然后拷贝到“out/target/product/generic/symbols/system/bin/libomstts”,strip后的文件是“out/target/product/generic/obj/executables/libomstts_intermediates/libomstts”和“out/target/product/generic/system/bin/libomstts”。

gdbserver调试方法

gdbserver调试方法
gdbserver开始监听2345端口(你也可以设其他的值),然后启动hello,你会看到“Process test created:pid=88 ”
3、回到Host端
#export PATH=$PATH:/home/cby/arm-gdb/bin(arm-linux-gdb的路径)
1、交叉编译,带参数-gstabs 或 -g 加入调试信息。
假设要调试的程பைடு நூலகம்为hello.c。
#arm-linux-gcc -g hello.c -o hello
2、在Target Board开启gdbserver
#gdbserver <host-ip>:2345 hello (我的host-ip是192.168.0.178)
#arm-linux-gdb hello
最后一行显示:This GDB was configured as “--host=i686-pc-linux-gnu,--target=arm-linux”...
说明此gdb在X86的Host上运行,但是调试目标是ARM代码。
(gdb)target remote <target-board-ip>:2345 (我的target-board-ip is 192.168.0.177)
注意:你的端口号必须与gdbserver开启的端口号一致,这样才能进行通信。
建立链接后,就可以进行调试了。调试在Host端,跟gdb调试方法相同。注意的是要用“c”来执行命令,不能用“r” 。因为程序已经在Target Board上面由gdbserver启动了。
结果输出是在Target Board端,用超级终端查看。

gdbserver 参数

gdbserver 参数

gdbserver 参数
gdbserver是一个用于调试目标机器上的程序的工具。

它有以下参数:
1. \<host:port\>:指定gdbserver绑定的主机和端口号。

默认情况下,绑定到本地主机的端口2345。

2. \<program\>:要调试的目标程序的路径和名称。

3. \<core\>:指定要调试的核心转储文件。

4. --attach \<pid\>:附加到运行中的进程,其中\<pid\>是进程ID。

5. --multi \<port\>:启动多个gdbserver实例,每个实例都绑定到不同的端口。

6. --once:只允许调试目标程序运行一次。

一旦目标程序终止,gdbserver将停止。

7. --reverse \<host:port\>:以反向连接模式运行gdbserver,即等待gdb连接。

8. --wrapper \<wrapper\>:用于运行目标程序的包装器命令。

这些是gdbserver的一些常用参数,可以根据需要进行调整和组合使用。

嵌入式软件图形化调试环境的搭建

嵌入式软件图形化调试环境的搭建

ARM 调试方法(适用于E8000/E7000)王铮2013/21.准备工作a)编译工具链中的arm编译与调试工具,主要包括arm-g++,arm-none-linux-gnueabi-gdb (arm-gdb), gdbserverb)将gdbserver复制到目标机上。

c)在PC端编译要调试的ARM程序,编译完成后,将其复制到目标机上。

注意,编译选项中加入–g。

如果有优化的话将其改为不用优化。

(将-O3、-O2等改为-O0或者直接去掉-O)如果存在优化的话可能导致断点无法命中。

d)在目标机的命令行中输入./gdbserver <目标机地址>:<要使用的端口> <ARM 程序路径> 如./gdbserver 192.168.0.155:10000 ./f其中192.168.0.155 为目标机IP地址,10000为要使用的调试端口,./f为要调试的ARM程序输入该命令后系统会出现打开端口等待调试等信息。

如下Process f created; pid = 858Listening on port 10000以上工作配置完成后,即可进行PC端的配置2.文本GDB调试a)在PC端启动arm-none-linux-gnueabi-gdb,命令如下arm-none-linux-gnueabi-gdb <ARM 应用程序路径>,如arm-none-linux-gnueabi-gdb f其中f为要进行调试的ARM应用程序。

这里的ARM应用程序必须和目标机上的一致。

b)在GDB的命令行中输入目标机的地址和调试端口,如(gdb) target remote 192.168.0.155:10000这是GDB将进入调试模式c)按c键,启动应用程序注意:这里不要按r,这点和使用GDB不同d)后面的操作就和GDB完全相同了如下(gdb) b mainBreakpoint 1 at 0x9870: file obexftp.c, line 376.(gdb) info bNum Type Disp Enb Address What1 breakpoint keep y 0x00009870 in main at obexftp.c:376(gdb) ce)关于一些报错信息如出现某些库找不到的信息,是由于没有指定GDB的搜寻库路径的原因如下的错误信息Error while mapping shared library sections:/work/lib/libobexftp.so.0: No such file or directory.Error while mapping shared library sections:/work/libc.so.6: No such file or directory.这是需要指定gdb的搜索路径,键入如下语句(gdb) set solib-search-path <需要搜索的路径> 如(gdb) set solib-search-path /work/lib。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
gdbserver方式 gdbserver本身的体积很小,能够在具有很少存储容量的目标系统上独 立运行,因而非常适合于嵌入式环境
stub(插桩)方式 stub方式则需要通过链接器把调试代理和要调试的程序链接成一个可执 行的应用程序文件,如果程序运行在没有操作系统的机器上,那么stub 需要提供异常和中断处理序,以及串口驱动程序,如果程序运行在有操 作系统的嵌入式平台上,那么stub需要修改串口驱动程序和操作系统异 常处理。
GDB Server
gdbserver是一个可以独立运行的控制程序,它可以运行在类UNIX操作 系统上,当然,也可以运行在Linux的诸多变种。gdbserver允许远程 GDB调试器通过target remote命令与运行在目标板上的程序建立连 接。 GDB和gdbserver之间可以通过串口线或TCP/IP网络连接通信, 采 用 的 通 信 协 议 是 标 准 的 GDB 远 程 串 行 协 议 ( Remote Serial Protocol RSP)。
编译阶段
# make CC=arm-linux-gcc
Step Four
远程调试程序 交叉编译
# arm-linux-gcc –g tstgdb.c –o tstgdb
目标机运行
# ./gdbserver 10.0.0.10:2335 tstgdb
Step Four
远程调试程序 开发机 调试程序
了解GDB Server
远程调试环境由宿主机GDB和目标机调试stub共同构成, 两者通过串口或TCP连接。使用 GDB标准程串行协议协同 工作,实现对目标机上的系统内核和上层应用的监控和调试 功能。调试stub是嵌入式系统中的一段代码,作为宿主机 GDB和目标机调试程序间的一个媒介而存在。
GDB的两种调试代理方式
开发环境
192.168.0.121 文件服务器
192.168.0.122 开发机(宿主机)
10.0.0.1
目标机(arm平台) gdbserver
10.0.0.10
任务要求
Step One Step Two Step Three Step Four
解压GDB源码包 配置编译gdb 配置编译gdbserver 远B
解压gcc源码包
# tar xzvf gdb-7.4.tar.gz
安装相关工具
# sudo apt-get install texinfo # sudo apt-get install libncurses5-dev # sudo apt-get install m4 # sudo apt-get install flex # sudo apt-get install bison
# arm-linux-gdb tstgdb
(gdb)target remote 10.0.0.10:2335
Step Two
安装GDB
# ./configure --target=arm-linux --prefix=/usr/local/arm-gdb -v
# make # make install
Step Three
编译gdb server 配置
# cd /gdb/gdbserver # ./configure --target=arm-linux --host=arm-linux
相关文档
最新文档