转自:http://www.heimizhou.com/windows-remote-debug-linux-c-plus-plus.html
最近有一个需求,就是需要在Windows上远程调试Linux上的C++程序,然后我就从网上搜集各种方法,但是发现很多方法中是先在Windows上编译程序,然后再从Linux上编译程序,最后进行远程调试,这种方法使我的调试不能进入源代码,后来经过尝试发现只需要在Linux上编译程序即可。下面从三个方面:需要安装的软件、安装与配置、配置远程调试,来介绍一下我的方法流程。
1. 需要安装的软件
所用平台的操作系统版本分别是:
(1) Windows:Windows 7 旗舰版 (32位)
(2) Linux:Ubuntu 12.04 LTS (32位)
具体需要安装的软件如表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 安装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 在MinGW上安装相关的环境
2.1.3 环境变量设置
针对MinGW进行环境变量设置。右键点击“计算机”,选择“高级系统设置”,在弹出的窗口中,选择“高级”选项卡,点击界面中的“环境变量”按钮,如图2-3所示。
图2-3 环境变量设置位置
在系统变量中,找到“Path”变量,点击“编辑”按钮,如果没有“Path”变量,点击“新建”按钮,在变量值最后加上C:\MinGW\bin的路径,即MinGW安装目录下的bin目录,记得用“;”与其他变量值隔开,如图2-4所示。
图2-4 设置环境变量Path
环境变量设置完成后,打开命令行,输入gdb并回车,如果进入GDB调试界面,并显示GDB版本号,说明MinGW的安装和环境变量设置成功。如图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 下载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 下载Eclipse
2.3 Linux安装配置Samba
2.3.1 安装Samba
在Terminal中,输入sudo apt-get install samba,执行画面如图2-8所示。
图2-8 执行sudo apt-get install samba
安装完成后,输入sudo apt-get install smbfs,执行画面如图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 执行sudo apt-get install gdbserver
3. 配置远程调试
3.1 Windows上映射共享文件夹
打开计算机,点击“映射网络驱动器”按钮,如图3-1所示。
图3-1 选择映射网络驱动器
在弹出的“映射网络驱动器”窗口的文件夹中,输入\\192.168.6.6\Share,其中IP地址是第2.3节中进行共享文件夹配置的Linux操作系统的IP地址,Share是共享文件夹配置的目录,具体如图3-2所示,然后点击“完成”按钮。
图3-2 映射网络驱动器
在弹出的“Windows安全”窗口中,输入第2.3.4小节设置的用户名和密码,如图3-3所示,然后点击“确定”按钮,会弹出如图3-4所示的窗口,目录下默认没有文件。
图3-3 输入访问共享文件夹的用户名和密码
图3-4 访问Linux上的共享文件夹目录
3.2 Eclipse建立远程C++项目
3.2.1 切换工作目录
打开Eclipse,将工作目录切换到Linux共享文件夹下的目录,如图3-5所示。
图3-5 切换Eclipse的工作目录
3.2.2 新建C++项目
如图3-6所示,其中“Project type”选择“Makefile Project”下的“Empty Project”,“Toolchains”选择“MinGW GCC”,点击“Next”按钮,然后,点击“Finish”按钮完成新项目的创建。
图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 新建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 Debug Configuration窗口
图3-9 Select Preferred Launcher窗口
图3-10 Preferences (Filtered)窗口
然后,选择“Debugger”选项卡,在“Debugger Options”中选择“Connection”选项卡,输入Linux上GDBserver的IP和端口号,如图3-11所示。最后,点击“Apply”按钮以及“Debug”按钮,进行远程调试。
图3-11 Debugger Connection
C++程序远程调试起来后,Windows上的Eclipse中默认在程序的main函数处中断,如图3-12所示。Linux上的GDBserver会通过监听端口,发现来自Windows的远程调试,如图3-13所示。
图3-12 程序在HelloWorld的main函数处中断
图3-13 Linux监听远程调试端口
3.4.2 增加断点进行远程调试
在Eclipse中,找到需要加断点的行,右键点击该行,选择“Toggle Breakpoint”,给该行增加断点,如图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 运行至断点
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