您的位置:首页 > 运维架构 > Linux

Windows远程调试Linux上的C++程序:Eclipse+MingW+Samba+GDBserver

2016-05-19 09:31 1251 查看
转自: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 创建共享目录

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

12mkdir /home/transplant/Sharechmod 777 /home/transplant/Share
2.3.3 备份并编辑smb.conf

1

2

sudo
cp
/etc/samba/smb.conf
/etc/samba/smb.conf_backup

sudo
gedit
/etc/samba/smb.conf

搜寻这一行文字:

1# security = user
用下面这两行取代:

1

2

security
=
user

username
map
=
/etc/samba/smbusers

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

123456789101112[Share]comment = Shared Folder with username and passwordpath = /home/transplant/Sharepublic = yeswritable = yesvalid users = testsharecreate mask = 0700directory mask = 0700force user = nobodyforce group = nogroupavailable = yesbrowseable = yes
然后顺便把这里改一下,找到[global],把workgroup=WORKGROUP改成:

1

2

3

4

workgroup
=
WORKGROUP

display
charset
=
UTF-8

unix
charset
=
UTF-8

dos
charset
=
cp936

2.3.4 添加网络访问账户

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

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

1

2

sudo
smbpasswd
-a
testshare,然后输入密码123456

sudo
gedit
/etc/samba/smbusers

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

1testshare = "network username"
2.3.5 重启smbd重启一下smbd,在Terminal中输入:

1

sudo
service
smbd
restart

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

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

图2-10 执行sudo apt-get install gdbserver3. 配置远程调试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源文件,输入以下代码:

1

2

3

4

5

6

7

8

9

10

11

12

#include
<iostream>

using
namespace
std;

int
main()

{

cout
<<
"Hello
World!"
<<
endl;

int
i
=
8;

int
j
=
8;

int
k
=
i
+
j;

cout
<<
"k
= "
+
k
<<
endl;

return
0;

}

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

1234567HelloWorld: HelloWorld.o g++ -o HelloWorld HelloWorld.oHelloWorld.o: HelloWorld.cpp g++ -c -g HelloWorld.cppclean: rm -f HelloWorld rm -f *.o
3.3 Linux启动GDBserver3.3.1 编译C++程序给新建的Eclipse工作目录授予读写权限,并切换到新建的C++项目所对应的目录,在Terminal中输入:

1

2

sudo
chmod
777
/home/transplant/Share/Project
–R

cd
/home/transplant/Share/Project/HelloWorld

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

1make
编译生成HelloWorld可执行文件和*.o文件。3.3.2 启动C++程序调试服务器通过GDBserver启动C++程序调试服务器,在Terminal中输入:

1

gdbserver
192.168.6.6:12345
./HelloWorld

这样就创建了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] /article/8499745.html

[2] /article/2600890.html

[3] /article/6436023.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: