Linux 环境下一般使用 GDB 进行调试,但是在调试大型程序时不太方便,比如线程来回切换、查看堆栈等,不是那么直观。使用 VC++ 进行远程调试,有 GUI 界面,比较方便直观查看线程切换、堆栈、函数参数值等等。下面介绍如何使用 VC++ 远程调试 Linux 程序。
环境准备
Linux 系统上要安装 GDB 和 gcc/g++ 之类的,以便能够编译 C/C++ 代码。
注意:编译程序时需加上 -g 选项,否则无法命中断点。
远程调试
说明一下,VC++ 要能远程调试 Linux 程序,需要的 VC++ 版本会比较高,比如 Visual Studio 2017/2019 等,但是版本不限,专业版、社区版都可以。
- 在 Linux 上启动程序,如下图所示
- 从 VS 的【附加到进程】选项向导中选择连接类型为
SSH
,并输入 Linux 系统的 IP 地址
然后回车,输入用户名和密码,并执行连接,如下图所示
注意:建议使用 root 用户连接调试,避免因为权限不足导致无法访问部分共享库。
- 设置调试类型为
Native(GDB)
,如下图所示
- 从可用进程列表中选择要调试的进程名称并附加,VS 即进入调试状态;将 Linux 程序对应的源码在 VS 中打开,并设置断点,然后就可以开始调试了,如下图所示
当程序运行到断点处就会中断下来,等待用户下一步操作。
问题排查
连接类型没有 SSH
如果在【附加到进程】选项向导的连接类型中没有 SSH 选项,则可能没有安装调试 Linux 应用程序的运行环境,打开 Visual Studio 安装程序,勾选如下图所示的工具集,并执行安装
无法访问远程服务
如果输入 Linux 系统的 IP 地址后,没有跳出【连接到远程系统】向导,那么在【工具】视图下打开【选项】向导,在【跨平台】选项页中添加连接,如果提示如下图所示
那么该问题是 Visual Studio 产品的一个 Bug:https://developercommunity.visualstudio.com/t/Connection-Manager-Error-The-remote-ser/1499473,可以使用 Visual Studio 的其它版本来解决该问题。
连接远程系统超时
如果在用 SSH 远程连接 Linux 系统时提示连接超时,如下图所示
在确保两台机器的 IP 地址正常(能够 ping 通),并且端口没有被防火墙阻止后,可能的原因是在登录时,SSH 服务端会对客户端的 IP 做反向解析,此时连接不到 DNS 就出现了延时。解决办法是,打开 /etc/ssh/sshd_config
,修改(如果没有就新增一行)
UseDNS no
无法连接到GDB
在附加进程启动调试时,如果提示无法连接到 GDB,如下图所示
此时检查 Linux 主机是否安装 GDB,执行如下命令进行安装
$ sudo apt-get install gdb
无法命中断点
进入调试状态后,如果无法命中断点,则可能的原因如下
- Linux 程序使用 gcc/g++ 编译/链接时,没有使用 -g 选项。
- 断点所在的源码文件不属于当前附加的进程,其被编译到其它进程中。
- 远程连接时的用户权限不足,无法访问指定文件。
- 代码在实时内核中运行(该部分暂未找到解决办法)。