使用Visual Studio远程编译Nginx on Linux并远程Debug

为什么要使用VS开发

  和普通科班出身的人不同,我的 C++ 开发入门时候用的 IDE 应该就是Visual Studio 2012,而且自己写的一些小软件也基本上是在 windows 上跑跑而已,所以基本没有怎么用过 gdb 。等到了我接到 linux 开发需求的任务时已经为时已晚。虽然说此类 debugger 无非就是干三件事情:代码断点、变量监视、查看堆栈,但是用惯了VS系列 IDE 的我发现我已经不能接受gdb这种命令行下的 debugger 软件了。

  万幸的是,在今年的 Microsoft Build 2017 Developer Conference 上,VS 开始原生支持远程编译、远程 debug ,这意味着我可以用 Linux 里的 gcc/g++ 去编译、用 gdb 去调试,再在最外面用 VS 这个“壳子”来让这个过程图形化,可以说是非常酷炫了。

这次的挑战

  这次我遇到的一个任务是给某公司的 Load Balance 服务器上的 nginx 开发一个定制插件。这个插件包括了以下功能:

  • 能通过 HTTP 请求的 Header 中的 UID 信息来区分不同的用户
  • 动态查询 UID 对应的不同用户的限速值并给予限速(上行、下行)
  • 实现一定的负载均衡功能

  仅仅就限速这个功能来说,还是非常好实现的,现成的插件也是一大堆,再不济用 openresty 也是没问题的,但是动态限速和 UID 获取就得再对现成的限速代码做一定修改了。

  由于 nginx 的插件需要连同 nginx 一块编译,所以在 linux 平台上调试起来对于我这个 gdb 小苦手也是非常难受的,所以这一次我决定用一下 VS2017 提供的远程 Debug 新功能。

相关介绍

  对于这个新功能的详细介绍请参看这里,讲解得非常清晰,我就说说自己的一些理解吧。

  这个 Remote Debugger 的底层实质还是 gdb-server ,所以它的写代码到编译到调试的过程实质上是这样的:

  • 首先在 VS 的 IDE 中修改了代码之后,代码会保存到硬盘,在按下 Remote Debugger 按钮之后,VS 会通过你预先输入的 SSH 帐号密码使用 SCP 传输到远程 Linux 机器上。
  • 然后 VS 将通过 SSH 远程使用 GCC 编译源代码,若出现错误,则将错误传输到 Windows 的 VS 界面上,如果没有错误,将生成二进制可执行文件。
  • VS 再通过 gdb-server 打开一个端口供远程主机访问,然后 VS 接入端口,即可使用 gdb 对远程机器上跑的程序进行调试,VS 再把这个过程在界面中可视化,这样就做到了在 VS 中写、调试跑在 Linux 上的代码。

阅读