当 gdb 遇上第三者

第一章 和谐的二人世界

小明是一个无忧无虑的嵌入式程序员,他精通 printf 大法,足以处理绝大多数的 bug,他非常的开心。

虽然和有着 IDE 集成开发环境下各种图形化的断点调试、变量观察等高效程序调试方法的程序员相比,

小明的程序调试方法比较原始,但作为一个 Linux 环境下的嵌入式程序员,小明并没有太多的选择,命令行才是王道。

终于有一天小明想尝试一下早已耳闻的程序调试利器 gdb,说干就干,但小明的工作是调试 ARM 板上的程序,

即程序编译是在 Linux pc 机上进行,然后编译出来的程序下载到 ARM 板上运行,所以和直接调试 Linux 下的程序还有点差别,

需要用到 gdb 的远程调试,即需要在 ARM 板上运行 gdbserver,然后在 Linux pc 启动 gdb 进行远程连接调试,

所以小明做的第一步即是交叉编译出 gdbserver 然后放到 ARM 板上,这难不倒他。

和大多数人一样,小明使用的也是 windows 系统的 pc,所以小明采用了虚拟机运行 Linux 来交叉编译程序,

然后在虚拟机内进行 gdb 远程调试,远程调试是通过网络的,所以在这之前小明要保证 ARM 板和 Linux 虚拟机是能 ping 通的,

这也难不倒小明,很快他用网线把 ARM 板和 windows pc 直接相连,然后在虚拟机下设置桥接 windows pc 对应的网卡,完美解决。

下面是小明的工作环境:

ARM 板 <—–> 运行 Linux 虚拟机的 windows pc

小明在确保 ARM 板和 Linux 虚拟机的网络是通的之后在 ARM 板上敲下如下命令:

gdbserver :7788 exe

exe 是小明要调试的程序,他让 gdbsever 监听 7788 端口等待连接,然后转到 Linux 虚拟机上敲下如下命令:

gdb exe

target remote 192.168.1.155:7788

192.168.1.155 是小明 ARM 板的 IP 地址。很快 ARM 板的终端打印出已建立建立连接的信息。

兴奋的小明紧接着着输入了几个命令感受了一个 gdb 的强大。

break main
run
....

小明先在 main 函数的入口处设置了一个断点,再使用 run 命令让程序跑起来,程序按小明的预期停在 main 函数的入口处,

小明脸上露出了满意的笑容,然后使用各种命令调试了一番,小明的 ARM 板和 Linux 虚拟机都工作的很好,小明很开心。

第二章 第三者的出现

终于有一天,小明受够了老板无休止的加班安排,还开着丝毫没有竞争力的薪资,他决定跳槽了。

很快小明找到了一份薪资还满意的工作,顺利的入职了,小明再次快乐的开始了新的工作。

又到了解 bug 的时候了,没关系,小明深知 printf 大法,并还掌握了 gdb 这一利器,这难不倒他。

说干就干,这一次小明想再一次的尝试使用 gdb 来调试程序。但新的公司的开发环境和之前有点不太一样,

新的公司为了管控代码和加快代码的编译速度将代码放置在 Linux 服务器上,还设置了加密环境,代码拿到本地即打不开,

小明是通过远程登陆 Linux 服务器进行编辑编译代码的,然后通过 samba 目录拷贝编译输出下载到 ARM 板上,

显然 ARM 板是没办法直接和 Linux 服务器相连的,但没关系啊,只要 ARM 板和 Linux 服务器能 ping 的通就行啊,小明想。

小明的 windows pc 是可以和 Linux 服务器 ping 通的,所以只需要将 ARM 板连接至 windows pc 连接的网络环境就行了啊,

机智的小明想到。如下小明的想法:

ARM 板 <—–> 公司网络环境 <—–> Linux 服务器

windows pc <—–> 公司网络环境 <—–> Linux 服务器

可是新公司的网络环境为了方便管理员工的 pc 使用了微软开发的域网络,只有加入域才能正常的使用网络。

这让小明头疼了,通常微软搞的东西在 Linux 上就不好使,这到了 ARM 板就更不好使了,要让 ARM 板加入公司的域网络太麻烦了,

新公司的网络环境这下把小明难住了,无奈的小明为了尽快解 bug 放弃了这一条路,继续默默的使用 printf 大法。

第三章 寄信人

项目进展的还不错,小明迎来了一小段清闲的时间,生命不息,折腾不止,这是小明的座右铭,他决定利用这一小段清闲时间折腾一下。

这让他想起了起初想用 gdb 调试程序却以失败告终的结局,心有不甘,他决定一定要解决这个问题。

让 ARM 板加入域网络这条路很难走通,那有没有其他办法呢?小明认真的思考起来。

显然现在让 ARM 板连接 windows pc 是很简单的,而且 windows pc 是可以连上 Linux 服务器的,那有没有办法让 windows pc

成为一个类似的寄信人的角色,转发 ARM 板和 Linux 服务器之间的数据呢?转发,转发,转发,小明脑海闪现过一个专业名词,

端口转发,对的,一定就是它,虽然没修过网络工程的小明隐约感觉到就是这个技术可以解决现在的难题。

小明立马打开谷歌浏览器在搜索栏上敲下:windows 端口转发的搜索关键字,很快小明发现这正是他要找的解决办法。

虽然得知 windows 上提供的端口转发只支持 tcp 协议的转发,但庆幸的是 gdb 是使用的 tcp 连接。

小明迫不及待的打开了 windows 上的终端,敲下了如下几个命令设置好了端口 7788 的转发。

netsh interface portproxy add v4tov4 listenport=7788 connectaddress=192.168.1.155 connectport=7788

转发的目的地即是 IP 为 192.168.1.155 的 7788 端口上,这是小明 ARM 板的 IP 地址。

小明还掌握了查看现有的端口转发的情况,使用如下命令:

netsh interface portproxy show all

另外的小明有时还需要删除这些端口转发规则,他这样做:

netsh interface portproxy delete v4tov4 listenport=7788

第四章 完美的结局

设置好端口转发规则后,小明再次在 ARM 板上输入了如下命令:

gdbserver :7788 exe

然后再转到 Linux 服务器上输入如下命令先启动 gdb

gdb exe

接下来要设置进行远程连接了,很显然 Linux 服务器还是没办法看到 ARM 板的地址的,所以远程连接的 IP 应该是 windows pc 的 IP。

立马小明再次在 windows pc 的终端上敲下如下命令,获取到了 windows pc 的 IP 地址为:10.120.99.56。

ipconfig

然后小明再次到 Linux 服务器上的 gdb 命令行敲下如下命令进行远程连接,

target remote 10.120.99.56:7788

再次转到 ARM 板的终端上小明看到了已建立连接的打印输出,小明心奋不已,再次露出了满意的笑容,

小明立马再次在 Linux 服务器上继续输入命令调试了一番,

break main
run
next
....

从此小明又再一次愉快的用上了 gdb 调试,这次小明的工作环境变成了这样:

ARM 板 <—–> windows pc <—–> Linux 服务器

最后再说两句

下面开始的是废话,可以不看,除了祝大家节日快乐那一句,哈哈~~

写到这里终于写完了,我的脸上露出了满意的笑容。今天是五一假期的第二天,祝大家节日快乐!

我的五一假期是彻底被这感冒打败了,再没了出去玩的力气,只有呆在屋里擦着鼻涕写下这两篇推文,

看我这么可怜份上给我点个赞吧,你们的点赞和关注是我输出的动力源泉,对了还有转发,哈哈~~

关注的扫下面:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值