在Windows上用Eclipse远程调试Linux下的C程序

from:http://linmingren.me/blog/2013/09/windows%E7%94%A8eclipse%E8%BF%9C%E7%A8%8B%E8%B0%83%E8%AF%95linux%E4%B8%8B%E7%9A%84c%E7%A8%8B%E5%BA%8F/

这个标题看起来有点弱智,因为Eclipse本来就可以Linux下跑,那直接本地调试就得了,还搞啥远程调试。哎,别说,我还真碰到有这需求的。试想如果你的版本控制软件在Linux上由于种种原因跑不起来(要么是License,要么域用户之类的问题),那么你只能在Windows下check out你的代码,这时候如果你们能够在Windows上直接把活都干了,还是比较爽的(我个人是于在Linux上把活干了的,毕竟Linux上工具多一些)。

要在Windows上装的东东
1. Mingw (也可以是Cygwin,不过Mingw看起来似乎要小点)
2. gdb (mingw再带了一个,但是不能用于远程调试Linux下的程序,原因是target不一样)
3. Eclipse c++ IDE
4. Python (编译gdb时用到libpython27.a这个静态库)

安装Mingw
我的Windows和Linux都是64位的,不过这里的Mingw安装32位的就行了,
1. 从Sourceforge上下载mingw-get-setup.exe 并安装, 选择mingw32-gcc-g++和msys-base即可。

编译gdb
1. 从Sourceforge下载gdb windows的源代码,找最新的那个就行。
2. 复制到Mingw的用户目录下 (比如我的就在{Mingw安装目录}\msys\1.0\home\linmingren)。
3. 启动{Mingw安装目录}\msys\1.0下的msys.bat来启动Mingw模拟环境。
4. 解压,configure和编译

1
2
3
4
5
tar -xvf gdb-7.6.tar.gz
cd gdb-7.6
./configure –target=x86_64-generic-linux-gnu (如果你的Linux是32位,可以用–target=i686-pc-linux-gnu)
make
make install

make的过程都会出下面这个错(我试过用mingw-get-inst-20120426.exe安装出来的Mingw编译就可以通过,最新的那几个Mingw编译都会出这个错)

原因是util.c中的do-while循环少了个分号,我的妈呀,这代码是实习生写的吗。

加上分号后,make就成功了

5. 生成的可执行文件在{Mingw安装目录}\msys\1.0\local\bin下面。

建立Eclipse工程
先下载Eclipse C++ IDE,我下的是eclipse-cpp-kepler-R-win32-x86_64,然后按下面的步骤建立一个C++工程。
1. 创建C++工程
Hello World 或者Empty 随便你。只要Toolchains选择了MinGW GCC就行 (如果你看不到这个选项,请把你的Mingw的bin目录加到PATH中)。

2. 加一个C++文件,内容随便,搞点C++语句进去就行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <map>
#include <list>
int main() {
    std::map<int, std::string> map;
    std::list<std::string> list;
    list.push_back(“string1″);
    list.push_back(“string2″);
    map.insert(std::make_pair(1,”value1″));
map.insert(std::make_pair(2,”value2″));
std::cout<<*list.begin()<<std::endl;
std::cout<<map.begin()->second<<std::endl;
    return 0;
}

 

3. 按Build All或者Build Project来编译它,这时Eclipse会生成Windows下的一个可执行文件,还会生成一个makefile文件。我们后面需要用这个makefile编译出Linux版本的可执行文件。

共享代码给Linux
这里用的cifs协议来把Windows上的目录共享给Linux,这样比通过samba共享要简单一点。

1. 在Windows上把Eclipse工程所在的目录共享,记得把权限改成共享用户可以写,因为在Linux下编译时需要生成文件(为了简单,我对所有人都可以写)。

2. 在Linux上mount这个目录
其中的用户名和密码是Windows上的共享用户的名字和密码,192.168.0.101就是Windows的ip。

1
mount -t cifs -o username=share,password=123456 //192.168.0.101/test /mnt/share

远程调试

1. 登陆到Linux上,跳到/mnt/share/test/Debug目录,跑make clean & make 生成Linux下的可执行文件 (文件后缀还是exe,呵呵).
2. 用gdbserver启动这个程序
这里的192.168.0.102是Linux机器的地址

1
gdbserver 192.168.0.102:10000 ./test.exe

3. 在Eclipse的Debug Configurations中新建一个Remote c/c++ Application

4. 指定gdb可执行文件

5. 制定gdbserver的ip和端口

6. 在Eclipse中配置源代码搜索路径
<br ”" title=”sourcelookup” width=”584″ height=”366″ />
7. 调试,可以看到Eclipse停在了我们设置的断点那里 (如果无法设置断点,应该是你还还设置代码搜索路径)。

我参考了这篇文章:

Windows 下使用Eclipse CDT 远程调试 Linux C/C++ 程序

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>