Windows远程调试Linux上的C++程序

最近有一个需求,就是需要在Windows上远程调试Linux上的C++程序,然后我就从网上搜集各种方法,但是发现很多方法中是先在Windows上编译程序,然后再从Linux上编译程序,最后进行远程调试,这种方法使我的调试不能进入源代码,后来经过尝试发现只需要在Linux上编译程序即可。下面从三个方面:需要安装的软件、安装与配置、配置远程调试,来介绍一下我的方法流程。

1. 需要安装的软件

所用平台的操作系统版本分别是:
(1) Windows:Windows 7 旗舰版 (32位)
(2) Linux:Ubuntu 12.04 LTS (32位)
具体需要安装的软件如表1-1所示。

表1-1 需要安装的软件
表1-1

2. 安装与配置

2.1 Windows安装MinGW

2.1.1 安装MinGW Installation Manager

http://sourceforge.net/projects/mingw/files/上,下载mingw-get-setup.exe,双击打开如图2-1所示的界面,点击“Install”按钮,安装MinGW Installation Manager。

图2-1图2-1 安装MinGW Installation Manager

2.1.2 安装编译器、调试器、MSYS等

在MinGW Installation Manager窗口中,选择安装如下选项,具体如图2-2所示。
(1) mingw32-base:包含GCC、C编译器、GDB等。
(2) mingw32-gcc-g++:包含C++编译器等。
(3) msys-base:精简的MSYS。
选择图中“Installation”选项下的“Apply Changes”,安装勾选项。

图2-2图2-2 在MinGW上安装相关的环境

2.1.3 环境变量设置

针对MinGW进行环境变量设置。右键点击“计算机”,选择“高级系统设置”,在弹出的窗口中,选择“高级”选项卡,点击界面中的“环境变量”按钮,如图2-3所示。

图2-3图2-3 环境变量设置位置

在系统变量中,找到“Path”变量,点击“编辑”按钮,如果没有“Path”变量,点击“新建”按钮,在变量值最后加上C:\MinGW\bin的路径,即MinGW安装目录下的bin目录,记得用“;”与其他变量值隔开,如图2-4所示。

图2-4图2-4 设置环境变量Path

环境变量设置完成后,打开命令行,输入gdb并回车,如果进入GDB调试界面,并显示GDB版本号,说明MinGW的安装和环境变量设置成功。如图2-5所示。

图2-5图2-5 进入GDB调试界面

2.2 Windows安装Eclipse

2.2.1 下载安装JDK

当前是在http://www.oracle.com/technetwork/java/javase/downloads/index.html上面下载JDK安装包,如图2-6所示,当前下载后的文件是jdk-8u20-windows-i586.exe。下载完成后进行JDK安装,其中包含了JRE的安装。

图2-6图2-6 下载JDK

2.2.2 下载Eclipse

https://www.eclipse.org/downloads/上面下载Eclipse IDE for C/C++ Developers的Windows 32 Bit版本,如图2-7所示,下载后的文件是eclipse-cpp-luna-R-win32.zip。解压下载的压缩包,双击目录中的eclipse.exe文件,即可运行Eclipse。

图2-7图2-7 下载Eclipse

2.3 Linux安装配置Samba

2.3.1 安装Samba

在Terminal中,输入sudo apt-get install samba,执行画面如图2-8所示。

图2-8图2-8 执行sudo apt-get install samba

安装完成后,输入sudo apt-get install smbfs,执行画面如图2-9所示。

图2-9图2-9 执行sudo apt-get install smbfs

2.3.2 创建共享目录

创建共享目录,输入以下命令,目录可以根据自己的需求更换。

2.3.3 备份并编辑smb.conf

搜寻这一行文字:

用下面这两行取代:

将下列几行新增到文件的最后面,假设允许访问的用户为:testshare。而文件夹的共享目录为/home/transplant/Share

然后顺便把这里改一下,找到[global],把workgroup=WORKGROUP改成:

2.3.4 添加网络访问账户

现在要添加testshare这个网络访问账户。如果在当前系统中没有这个账户,那么在Terminal中输入:

要注意,上面只是增加了testshare这个用户,却没有给用户赋予本机登录密码。所以这个用户只能从远程访问,不能从本机登录。而且samba的登录密码可以和本机登录密码不一样。
现在要新增网络使用者的账号,在Terminal中输入:

在新建立的文件内加入下面这一行并保存

2.3.5 重启smbd

重启一下smbd,在Terminal中输入:

看一下smbd监听的端口,如果显示相应的端口就代表启动成功,在Terminal中输入:

2.4 Linux安装GDBserver

Ubuntu 12.04 LTS上默认有GDB调试工具,但是没有GDBserver,所以需要进行安装。在Terminal中,输入sudo apt-get install gdbserver,具体的安装执行画面如图2-10所示。

图2-10图2-10 执行sudo apt-get install gdbserver

3. 配置远程调试

3.1 Windows上映射共享文件夹

打开计算机,点击“映射网络驱动器”按钮,如图3-1所示。

图3-1图3-1 选择映射网络驱动器

在弹出的“映射网络驱动器”窗口的文件夹中,输入\\192.168.6.6\Share,其中IP地址是第2.3节中进行共享文件夹配置的Linux操作系统的IP地址,Share是共享文件夹配置的目录,具体如图3-2所示,然后点击“完成”按钮。

图3-2图3-2  映射网络驱动器

在弹出的“Windows安全”窗口中,输入第2.3.4小节设置的用户名和密码,如图3-3所示,然后点击“确定”按钮,会弹出如图3-4所示的窗口,目录下默认没有文件。

图3-3图3-3 输入访问共享文件夹的用户名和密码

图3-4图3-4 访问Linux上的共享文件夹目录

3.2 Eclipse建立远程C++项目

3.2.1 切换工作目录

打开Eclipse,将工作目录切换到Linux共享文件夹下的目录,如图3-5所示。

图3-5图3-5 切换Eclipse的工作目录

3.2.2 新建C++项目

如图3-6所示,其中“Project type”选择“Makefile Project”下的“Empty Project”,“Toolchains”选择“MinGW GCC”,点击“Next”按钮,然后,点击“Finish”按钮完成新项目的创建。

图3-6图3-6 新建C++项目

3.2.3 新建源码和makefile文件

首先,新建源文件。右键点击新建的“HelloWorld”项目,选择“New”下面的“Source File”,新建HelloWorld.cpp源文件,输入以下代码:

然后,创建makefile文件,右键点击新建的“HelloWorld”项目,选择“New”下面的“Source File”,新建makefile文件,输入以下代码:

3.3 Linux启动GDBserver

3.3.1 编译C++程序

给新建的Eclipse工作目录授予读写权限,并切换到新建的C++项目所对应的目录,在Terminal中输入:

编译C++程序,在Terminal中输入:

编译生成HelloWorld可执行文件和*.o文件。

3.3.2 启动C++程序调试服务器

通过GDBserver启动C++程序调试服务器,在Terminal中输入:

这样就创建了HelloWorld程序的进程,并且调试服务器开始监听12345端口。其中IP地址和端口可以根据具体需求进行修改。

3.4 Windows远程调试C++程序

3.4.1 进行C++项目调试配置

在Eclipse中,右键点击HelloWorld项目,选择“Refresh”更新项目。然后右键点击HelloWorld项目,选择“Debug As”中的“Debug Configurations…”。在弹出的“Debug Configuration”窗口中,选择新建“C/C++ Remote Application”,如图3-7所示。

图3-7图3-7 新建C/C++ Remote Application

新建完成后,在图3-8的“C/C++ Application”中输入HelloWorld,然后点击下方的“Select other…”,弹出如图3-9所示的窗口,勾选窗口中的“Use configuration specific settings”,在“Launchers”中选择“GDB (DSF) Manual Remote Debugging Launcher”,然后点击“Change Workspace Settings…”,弹出如图3-10所示的窗口,在“C/C++ Remote Application [Debug]”中勾选“GDB (DSF) Manual Remote Debugging Launcher”,点击“Apply”按钮和“OK”按钮,返回到图3-9所示的窗口,点击“OK”按钮,返回到图3-8所示的窗口,选择“Disable auto build”。

图3-8图3-8 Debug Configuration窗口

图3-9图3-9 Select Preferred Launcher窗口

图3-10图3-10 Preferences (Filtered)窗口

然后,选择“Debugger”选项卡,在“Debugger Options”中选择“Connection”选项卡,输入Linux上GDBserver的IP和端口号,如图3-11所示。最后,点击“Apply”按钮以及“Debug”按钮,进行远程调试。

图3-11图3-11 Debugger Connection

C++程序远程调试起来后,Windows上的Eclipse中默认在程序的main函数处中断,如图3-12所示。Linux上的GDBserver会通过监听端口,发现来自Windows的远程调试,如图3-13所示。

图3-12图3-12 程序在HelloWorld的main函数处中断

图3-13图3-13 Linux监听远程调试端口

3.4.2 增加断点进行远程调试

在Eclipse中,找到需要加断点的行,右键点击该行,选择“Toggle Breakpoint”,给该行增加断点,如图3-14所示。

图3-14图3-14 给代码增加断点

点击Resume按钮,可以使程序运行到新增的断点处,如图3-15所示。然后,可以通过Eclipse工具栏上的“Step Into”、“Step Over”、“Step Return”等按钮,进行多种调试。
(1) “Step Into (F5 )”:单步执行,遇到子函数就进入并且继续单步执行。
(2) “Step Over (F6)”:在单步执行中,在函数内遇到子函数时不会进入子函数内单步执行,而是将子函数整个执行完再停止,也就是把子函数整个作为一步。
(3) “Step Return”:在单步执行到子函数内时,用step return就可以执行完子函数余下部分,并返回上一层。

图3-15图3-15 运行至断点

4. 总结

本文主要介绍在Windows上使用Eclipse开发环境来远程调试Linux上的C++程序的方法流程,本文是从需要安装的软件、安装与配置、配置远程调试三个方面展开进行的介绍。本文中的方法也存在一定的缺陷,主要是没有实现通过Eclipse对C++程序进行远程自动编译,需要通过远程桌面或telnet来对C++程序进行手动make编译。本文所提及到的软件版本都是文档撰写时期所使用的软件版本。

5. 参考资料

[1] http://blog.csdn.net/txk1452/article/details/7603272
[2] http://blog.csdn.net/xukai871105/article/details/9297027
[3] http://www.cnblogs.com/foxhengxing/archive/2010/08/14/1799774.html

Windows远程调试Linux上的C++程序》上有 2 条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注
教你如何拥有自己的Gravatar头像