嵌入式调试程序GDB Server
- 格式:pptx
- 大小:2.44 MB
- 文档页数:10
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运行在目标系统上,与目标程序相互独立。
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。
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 :2345 myapp.
这里的":2345"是gdbserver监听的端口号,"myapp"是要调试的应用程序的名称。
其次,你可能需要指定一些调试相关的选项,例如是否允许远程主机连接、是否启用多线程调试等。
这些选项通常作为命令行参数给出,例如:
gdbserver --multi :2345 myapp.
这里的"--multi"选项表示启用多线程调试。
此外,你可能还需要指定一些与连接和认证相关的选项,例如指定允许连接的主机、设置连接密码等。
这些选项也可以作为命令行参数给出,具体取决于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是一个用于调试目标机器上的程序的工具。
它有以下参数:
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。
qtcreator单步调试嵌入式arm程序的方法前言该方法配置步骤为:(1)安装gdb-multiarch。
(2)在qtcreator中配置gdb-multiarch。
(3)启动板子上的gdbserver。
(4)将qtcreator连接到板子上的gdbserver,启动单步调试。
1.安装gdb-multiarch使用“sudo apt-get install gdb-multiarch”命令安装gdb-multiarch。
安装完如图1所示。
图12.在qtcreator中配置gdb-multiarch在qtcreator中添加gdb-multiarch步骤如下。
在[工具]-[选项]中,在[Debuggers]页面中,添加gdb-multiarch,如图2和图3所示。
图2图3在[构建套件(kit)]页面中,添加gdb-multiarch对应的调试器,如图4所示。
图43.在板子上启动gdbserver将要调试的程序拷贝到板子上,如图5所示。
图5用如下指令,启动gdbserver。
gdbserver 172.24.119.123:8888 /tmp/only_only_test172.24.119.123是虚拟机的IP地址。
8888是选取的一个通信端口。
/tmp/only_only_test是板子上要调试的程序。
如图6所示。
图64.qtcreator连接gdbserver单步调试首先,确保虚拟机与板子能互相ping通,如图7所示。
图7然后,在虚拟机的qtcreator中,用Debug模式编译程序,如图8所示。
图8在虚拟机中的qtcreator中,点击[调试]-[开始调试]-[Attach to Running Debug Server...]。
参考图9进行设置。
图9设置中:✧本地执行档:虚拟机中待调试程序的存在位置。
✧Override server channel: IP地址为板子IP地址,端口号为gdbserver启动时指定的端口号。
gdbserver调试步骤编译gdb/gdbserver编译arm-linux-gdb下载gdb-7.12,解压缩进⼊⽬录./configure --target=arm-linux --program-prefix=arm-linux- --prefix=/opt/arm-linux-gdb/修改gdb/remote.c//==================================如果gdb提⽰:GDB7.6 Remote 'g' packet reply is too long修改gdb/remote.c⽂件,屏蔽process_g_packet函数中的下列两⾏:if (buf_len > 2 * rsa->sizeof_g_packet)error (_(“Remote ‘g’ packet reply is too long: %s”), rs->buf);在其后添加:if (buf_len > 2 * rsa->sizeof_g_packet) {rsa->sizeof_g_packet = buf_len ;for (i = 0; i < gdbarch_num_regs (gdbarch); i++){if (rsa->regs[i].pnum == -1)continue;if (rsa->regs[i].offset >= rsa->sizeof_g_packet)rsa->regs[i].in_g_packet = 0;elsersa->regs[i].in_g_packet = 1;}}make && make install编译gdbserver进⼊gdb/gdbserver⽬录./configure --target=arm-linux --host=arm-linux修改⽣成的makefile,将CC AR GXX都修改为交叉编译⼯具链中的⼯具make将⽣成的gdbserver移植到⽬标机即可⽬标机:arm 假设正在运⾏的程序名字为hello,其进程ID 为6622,⽬标机IP为192.168.0.11,那么在⽬标机端开启gdbserver的命令格式:#命令格式gdbserver IP:PORT --attach PID具体到⽬标机开启的命令为:[root@test ~]# gdbserver 192.168.0.11:8888 --attach 6622Attached; pid = 6622Listening on port 8888调试机:PCroot@liangwode:# arm-linux-gdbGNU gdb (GDB) 7.12Copyright (C) 2016 Free Software Foundation, Inc.License GPLv3+: GNU GPL version 3 or later </licenses/gpl.html>This is free software: you are free to change and redistribute it.There is NO WARRANTY, to the extent permitted by law. Type "show copying"and "show warranty" for details.This GDB was configured as "--host=x86_64-pc-linux-gnu --target=arm-linux".Type "show configuration" for configuration details.For bug reporting instructions, please see:</software/gdb/bugs/>.Find the GDB manual and other documentation resources online at:</software/gdb/documentation/>.For help, type "help".Type "apropos word" to search for commands related to "word".(gdb) target remote 192.168.0.11:8888Remote debugging using 192.168.0.11:8888warning: Can not parse XML target description; XML support was disabled at compile timeReading /home/storm/ftp/hello from remote target...warning: File transfers from remote targets can be slow. Use "set sysroot" to access files locally instead. Reading /home/storm/ftp/hello from remote target...Reading symbols from target:/home/storm/ftp/hello...done.Reading /lib/libc.so.6 from remote target...Reading /lib/ld-linux-armhf.so.3 from remote target...Reading symbols from target:/lib/libc.so.6...done.Reading symbols from target:/lib/ld-linux-armhf.so.3...done.0x76f0a8d4 in nanosleep () at ../sysdeps/unix/syscall-template.S:8484 ../sysdeps/unix/syscall-template.S: No such file or directory.。
gdbserver用法使用gdbserver进行调试的常见步骤如下:1. 在目标设备上启动gdbserver:通过命令行启动gdbserver,并指定绑定的IP和端口,例如:```$ gdbserver <ip:port> <e某ecutable>```这将在目标设备上开启一个gdbserver进程,并监听来自指定IP和端口的连接请求。
2.在主机上运行GDB:在主机上打开终端,使用GDB命令行工具连接到目标设备,例如:```$ gdb <e某ecutable>```3. 在GDB中设置连接到gdbserver:在GDB命令行中输入以下命令来连接到正在运行的gdbserver进程:```(gdb) target remote <ip:port>```4.设置断点和调试:一旦连接建立,您可以在GDB中设置断点,观察变量和执行程序。
例如:```(gdb) break <function_name>(gdb) run(gdb) print <variable_name>(gdb) step```5.分析和调试:使用GDB的各种命令和调试功能,如单步执行(step)、步入函数(step into)、跳出函数(step out)、打印变量(print)、查看栈帧(backtrace)等,对目标程序进行分析和调试。
此外,GDB还提供了一些附加功能来支持使用gdbserver进行远程调试,例如:- 多目标调试:允许同时调试多个目标设备或进程,只需在GDB中连接到不同的gdbserver实例即可。
- 远程文件传输:可以使用GDB的`file`命令来传输目标设备上的可执行文件和调试信息文件到主机上,方便在本地进行调试。
需要注意的是,使用gdbserver进行远程调试可能需要目标设备和主机之间的网络连接,同时也需要确保主机和目标设备上的可执行文件和调试符号文件的兼容性。
用GDB/gdbserver进行远程调试在开发嵌入式系统时,可以使用GDB和gdbserver作为调试工具,来调试用户空间的程序。
gdbserver是调试代理程序,运行于目标机(Target)上,GDB是调试工具,运行于开发主机(Host)上,所以调试时,系统的结构图如下:通过网络连接进行调试的步骤1.由于是通过网络进行调试,先要配置开发主机和目标机的IP地址,使它们之间可以进行网络通讯2.在目标机上运行gdbserver当被调试程序正在运行时,可以先用ps命令查看其PID,然后用如下命令:gdbserver HOST:PORT --attatch PID [&]其中,HOST是开发主机的IP地址(可以不指定,表示接受任何IP地址),PORT是任意指定的一个端口号(只要不与著名端口相同即可)。
如果想让gdbserver在后台运行,可以命令最后加上&。
也可以通过gdbserver启动被调试的程序,用如下命令:gdbserver HOST:PORT [app_name] [parameter] [&]HOST和PORT的含义与前述相同,app_name为程序名,paramter是传给程序的参数。
在目标主机上的程序文件可以被strip过,这样可以节约空间3.在开发主机上运行gdb先用如下命令启动GDB:gdb [app_name]app_name为要调试的可执行文件,它在编译的时候需要加-g选项,并且不能被strip,因为GDB需要得到其符号表。
然后使用如下命令指定共享库的位置:set solib-absolute-prefix PA THPA TH可指定为[SRC_DIR]/vsos/rootfs。
需要PA TH目录下的共享库的存储目录结构与目标机上共享库的存储结构一致。
最后连接上目标机上的gdbserver,用如下GDB命令:target remote TARGET:PORT其中,TARGET为目标主机的IP地址,PORT为前面指定的端口这以后,就可以像调试本地程序一样使用GDB了,只是不能用run命令,应该用continue 命令,因为程序已经开始执行了。
gdbserver远程调试原理
GDB( GNU调试器)通过GDB远程调试协议与GDB服务器(gdbserver)进行通信,以实现远程调试功能。
远程调试过程如下:
1. 用户在目标机器上启动gdbserver,并指定需要调试的可执行文件以及端口号。
2. GDB服务器在目标机器上等待GDB客户端连接。
3. 用户在开发机上使用GDB客户端,使用远程调试命令(如“target remote”)连接到目标机器的IP地址和指定的端口号。
4. GDB客户端与GDB服务器之间通过网络进行通信,使用GDB远程调试协议进行交互。
5. GDB客户端发送调试命令给GDB服务器,如设置断点、单步执行、查看变量值等。
6. GDB服务器执行接收到的调试命令,并将结果返回给GDB 客户端。
7. GDB客户端根据结果进行相应的操作,如显示变量值、程序的当前执行位置等。
8. 过程 5-7 循环执行,直到调试结束。
在远程调试过程中,GDB客户端与GDB服务器之间通过GDB远程调试协议进行数据的传输和交互。
该协议定义了通信的格式和规则,使得GDB客户端能够向GDB服务器发送调试命令,并接收服务器返回的响应。
通常,GDB服务器运行在目标机器上,而GDB客户端运行在开发机上。
GDB服务器需要与目标机器的操作系统相匹配,
以便与目标机器上的应用程序进行交互调试。
远程调试可以帮助开发人员在嵌入式设备等远程环境中调试程序,提高调试效率。
环境:pc = windows7 x64phone = Android 4.03(需要root权限)准备:gdbserver可以在NDK目录下的prebuilt文件夹内找到(如下图所示,在三个Android-开头的文件夹中都有gdbserver文件夹,里面的bin文件就是编译好的gdbserver,根据自己的cpu选择对应的bin程序,一般情况是arm),找到后可在对应文件的上级目录找到Windows下的gdb文件在NDK目录下的toolchains文件下,同样寻找对应的cpu的文件夹如图一般选择arm-linux-androideabi –x.x,然后在其\prebuilt\windows-x86_64\bin子目录可以看到下图所示:其中arm-linux-androideabi-gdb.exe就是我们要找的gdb程序(其他cpu请找对应的gdb 可执行程序),这里为了方便使用,我将改目录加入了path环境变量,同时将arm-linux-androideabi-gdb.exe复制重命名为gdb。
如果找不到,可在NDK的根目录下直接搜索gdb和gdbserver,从结果中寻找。
第一步:手机端运行gdbserver在cmd控制台下使用adb push命令发送进手机,并使用“adb shell chmod 777 +gdbserver 路径”的方法给文件可执行的权限,使用cd命令进入gdbserver所在目录,使用“./ gdbserver”启动服务(这里有个小技巧,可以将文件push到/system/bin/目录,以后执行的时候就不需要cd到gdbserver所在目录了,不过直接push可能push不到,需要在pc的cmd控制台下输入“adb remount”之后再push,如果执行chmod时出现权限不够,请在adb shell 命令后增加su命令即“adb shell su ….”,以root权限运行,执行前请确认手机已经root,否则可能会报错)重新打开一个cmd窗口使用“adb forward tcp:23946 tcp:23946”对模拟器的数据进行转发(如果在同一局域网内,不需要设置这步,这里设置是设置对于模拟器上数据的端口转发到pc本地)gdbserver的启动命令有两种:一种是attach方式,调试已经启动的程序;一种是使用gdbserver启动程序的方式(这种方式我只会启动bin程序);两种方式的命令格式分别为:gdbserver :23946 + bin程序路径gdbserver :23946 –-attach [PID]其中:23946与gdbserver之间有空格请注意,数字代表listen port,可自己设置,不过注意上面的adb forward 转发也需要同步修改。
Android Native C程序使用GDBServer调试(2013-03-28 10:21:57)转载▼作者:Sam (甄峰) sam_code@在嵌入式系统应用程序开发中,常见的调试方法就是print缩小差错范围,然后一步步找到出错点。
这显然效率太低,所以不少人尝试使用GDBServer的方式调试。
Sam之前也短暂使用过,但过后很多信息忘记了,现记录如下。
GDBServer+ 交叉编译-GDB 调试的主要思路是:GDBServer运行在开发板上(目标机,目标平台)。
而嵌入式GDB(如: arm-linux-gdb)则运行在开发机(宿主机)上。
如果目标机上没有GDBServer, 则需要下载GDBServer程序交叉编译。
(Sam之前的Blog 有过描述)我们现在把目标集中到Android开发平台上,据说在Android早期版本上,没有GDBServer。
但在Sam手头的Android2.2上,已经有了GDBServer,呵呵,那就直接用吧。
例1:在Android平台使用GDBServer调试简单的应用程序:Debug时,需要二进制文件中包含Debug信息,如符号Talbe,调试段等。
这就需要增加-g 编译选项。
且最好使用-O0 (不做任何优化)。
1.1: 确保Debug信息齐全。
在Application.mk中:APP_OPTIM := debug此时编译:/opt/Android_NDK/android-ndk-r8c/ndk-build -B V=1这时,发现编译中,使用-g 。
且最终使用-O0。
符合我们要求。
但请一定注意:ndk-build 将目标文件放到:/obj/local/armeabi-v7a/然后copy了一份到lib/armeabi-v7a. 但又使用strip 去掉了这份二进制的调试信息,以减小其大小。
(strip 命令从XCOFF 对象文件中有选择地除去行号信息、重定位信息、调试段、typchk 段、注释段、文件头以及所有或部分符号表)所以,不能使用lib/armeabi-v7a的库和可执行程序debug. 否则必然会报找不到符号表。