使用gdbserver远程调试

使用gdbserver远程调试,第1张

使用gdbserver可以对目标设备上的程序进行远程调试。

gdbserver基本用法如下:

此时gdbserver监听端口号1234,并等待客户端连接。

然后就可以对目标设备的程序进行debug了。

最初在使用gdbserver的时候,我遇到了如下问题:

这个问题的核心是:在手机上运行的gdbserver是配置为面向arm架构的(arm-eabi-linux),而在PC端运行的gdb是配置为面向X86_64架构的。

查看gdbserver的版本信息:

可以看到目标设备的gdbserver面向的架构是 arm-eabi-linux

而我的PC上的gdb的架构是 "x86_64-unknown-linux-gnu"

所以,出现了上述问题。

解决方法

保证gdbserver和gdb配置的架构是一致。在PC端安装针对arm架构配置的gdb工具。

gdb:The GNU Debugger for the ARM EABI (bare-metal) target

在archlinux上解决方式是安装 arm-none-eabi-gdb

然后使用arm-none-eabi-gdb连接gdbserver就OK了。

1,先下载最新版本的gdb源代码包,我使用的是gdb-7.6.tar.gz,使用tar命令进行解包(tar -xvzf gdb-7.6.tar.gz),cd进gdb-7.6/gdb目录,使用vi找到remote.c中的如下代码:

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 = 0i <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

else

rsa->regs[i].in_g_packet = 1

}

}

使用如下命令对代码进行配置、编译和安装

./configure --target=arm-linux --prefix=/usr/local/arm-gdb -v

make

make install

2,gdbserver使用android4.2模拟器中自带的版本(v7.1)

3,将NDK编译好的C/C++可执行程序,上传到模拟器中/data/test目录下,假设可执行程序的名称为testHello。

4,使用命令:gdbserver :7000 /data/test/testHello 启动模拟器端的调试。

5,启动arm-linux-gdb之前,使用vi打开~/.bash_profile文件,在其中添加:

export PATH=$PATH:/usr/local/arm-gdb/bin,以便在程序的其他目录可以直接启动arm-linux-gdb程序

6,cd至ndk编译好的testHello文件所在目录

7,使用如下命令进行端口映射:adb forward tcp:7000 tcp:7000,将模拟器的7000端口和本机的7000端口进行映射

8,使用命令:arm-linux-gdb testHello启动gdb调试

9,使用target remote :7000 链接模拟器中gdbserver启动的服务。

10,自此,我们就可以使用gdb命令进行代码调试了。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/7237570.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-03
下一篇2023-04-03

发表评论

登录后才能评论

评论列表(0条)

    保存