老戚的黑科技之gdb与gdbServer的使用

一、调试原理
有很多时候我们需要把编译出来的进程运行在另外一台机子上,可能是嵌入式开发板,也可能是另一台linux虚拟机,由于某种原因,在起gdb单步调试的时候关联不到源码,这会让我们很不爽。今天将会在这里介绍一种新的调试手段,让进程运行在另一台机子上的同时,单步调试的时候也能显示源码。
很多人只知道用gdb来调试进程,却不知道gdbServer的存在,从名称上也能猜出来,gdbServer是gdb的一个服务端,那gdb必然就是相对应的那个客户端了。这二则之间是TCP连接,gdb发送命令给gdbServer,gdbServer收到命令后会控制进程进行相对应的操作,然后把操作结果反馈给gdb。
二、安装gdb、gdbServer
1、首先从http://ftp.gnu.org/gnu/gdb/上找到系统需要的那个gdb安装包,注意版本号要一样。
2、在linux上用gdb -v来查看gdb的版本,如:
老戚的黑科技之gdb与gdbServer的使用_第1张图片这里的gdb版本是7.6.1-64.e17,因此在网站上找到gdb-7.6.1.tar.gz该包下载。
3、解压:tar zxf gdb-7.6.1.tar.gz
4、在linux系统下,不需要设置/configure –target=arm-linux,只需要执行./configure即可,自动会生成Makefile文件,随后make,直到编译完成。
5、执行cd gdb-7.6.1/gdb/gdbserver,在gdbServer这个目录下有一个gdbServer的可执行文件,只需要把该文件拷贝到目标机子的/usr/bin目录下即可。
三、gdbServer与gdb测试
先交代一下测试环境:
老戚的黑科技之gdb与gdbServer的使用_第2张图片其中在机子D上跑从机子B编译出来并拷贝过来的进程。
从图中也能看出来,机子D跟外网不是直接相连的,因此在这里需要用ssh这个工具创建一个隧道(创建方法请查看老戚的黑科技之SSH隧道技术)。在机子B上运行
$ ssh -NfL 6666:192.168.1.100:5555 172.16.163.212 即可。在创建了隧道,机子D能通过5555这个端口跟外网通讯了,那就可以在机子D上启动gdbServer了。
启动gdbServer的方法是:
gdbserver 192.168.1.100:5555 uinet_server_bin -c 1 -n 1 -- -p 0这里的5555告诉gdbServer监听的端口是什么,192.168.1.100告诉gdbServer监听的地址是什么。这里写图片描述
启好了gdbServer,那就只需要再启动gdb就算完成一半了,启动gdb的方法是:

gdb uinet_server_bin

老戚的黑科技之gdb与gdbServer的使用_第3张图片target remote localhost:6666 告诉gdb将要连接的gdbServer是哪个。
这里为什么是localhost呢?因为我们这里建立的SSHClient监听的端口是6666,而且SSHClient跟gdb 是在同一台机子上。我们需要把报文发到6666端口,那地址可以是localhost跟127.0.0.1 。
连接成功后,gdbServer会显示:
这里写图片描述
gdb端会显示:
老戚的黑科技之gdb与gdbServer的使用_第4张图片
到此就可以在gdb这边加断点或单步执行了,并且还能看到源码哦。按c就能跑起来了,快来试试吧!!!

你可能感兴趣的:(老戚的黑科技)