使用gdb和gdbserver从Windows远程调试Linux进程:Windows端究竟需要什么?

时间:2010-08-17 12:46:38

标签: windows linux gdb eclipse-cdt gdbserver

我正在Windows上运行Eclipse CDT来开发构建的C代码。在远程Linux系统上测试。目前,代码永远不会在Windows上编译。

我可以使用CDT在gdbserver下的Linux目标上开始远程进程,然后从Windows主机上附加gdb。但是,gdb会立即失败,并出现以下错误:

warning: A handler for the OS ABI "GNU/Linux" is not built into this configuration
of GDB.  Attempting to continue with the default i386 settings.
[...]
Remote 'g' packet reply is too long: 74afe9bff0aee9bf02000000f4af4a00a0aee9bf[...]

两个Linux系统之间的调试工作正常,因此很明显我在Windows主机端做错了。我的具体问题是:

  • gg的Cygwin版本是否足以调试远程Linux进程,或者我是否需要一个特殊的交叉gdb才能在Windows上运行它与Linux进程一起工作?如果是这样,我可以在任何地方获得这样的gdb吗?

  • 使用gdb进行远程调试需要在主机系统上提供符号。实现这一目标的最简单方法是什么?我可以将Linux目标上的构建产生的符号复制到Windows主机,还是必须在Windows上进行完整构建?有没有办法避免这个要求,这样我才能在目标上提供符号?

谢谢,

-R


更多信息: RSE FAQ提供了一些指示,但不幸的是我仍然被阻止了。 FAQ描述了两种方法:

  • 通过ssh在远程系统上启动gdb客户端。这里的问题是CDT调试启动器中的某些字段与本地系统(项目路径,可执行路径等)相关联。
  • 构建/获取支持从Windows调试Linux进程的gdb的交叉调试版本。这里的问题是关于如何实现这一目标的信息很少。

我也提出了this issue on the CDT forum

6 个答案:

答案 0 :(得分:4)

现在有一个插件 http://marketplace.eclipse.org/content/direct-remote-c-debugging

允许您通过ssh远程启动服务器上的gdb。它关注路径映射和其他事情。

您不需要gdb服务器远程运行

答案 1 :(得分:3)

只需使用目标平台支持重建gdb。你可以使用Cygwin。 RHEL目标平台示例:

> wget http://ftp.gnu.org/gnu/gdb/gdb-<ver>.tar.xz
> tar -xJvf gdb-<ver>.tar.xz
> mkdir -p gdb-<ver>/build/x86_64-redhat-linux-gnu
> cd gdb-<ver>/build/x86_64-redhat-linux-gnu
> ../../configure --target=x86_64-redhat-linux-gnu
> make && make install
> x86_64-redhat-linux-gnu-gdb.exe --version

此后不要忘记重新配置工具链。 要获取目标配置名称,可以使用:

> echo ${BASH_VERSINFO[5]}

答案 2 :(得分:1)

Visual Studio Community Edition 2017具有GDB交叉编译和调试工具。将它与Linux服务器或Windows Linux子系统结合使用,您就可以可靠地为Linux系统开发C代码。看看this guide.

答案 3 :(得分:1)

我无法在Windows上构建,但是发现在Linux下构建它非常容易。总结并完成@Eugene响应: 首先,准备资源:

wget http://ftp.gnu.org/gnu/gdb/gdb-<ver>.tar.xz
tar -xJvf gdb-<ver>.tar.xz
mkdir -p gdb-<ver>/build/x86_64-redhat-linux-gnu
cd gdb-<ver>/build/x86_64-redhat-linux-gnu

下载Windows编译器:

sudo apt-get install mingw-w64

查看要调试二进制文件的目标配置平台(要在--target参数中添加什么内容):

echo ${BASH_VERSINFO[5]}

准备针对所需平台但在不同主机上运行的makefile。我们将其静态编译,使其不依赖于任何DLL或其他库。同样,我们根据gdb wiki的建议,禁止构建其他二进制文件:

../../configure --host=x86_64-w64-mingw32 --target=x86_64-pc-linux-gnu --enable-static=yes --disable-interprocess-agent --disable-binutils --disable-ld --disable-gold --disable-gas --disable-sim --disable-gprof

最后,构建(大约需要30-60分钟):

make LDFLAGS=-static

您可以在gdb文件夹中找到调试器。在构建可执行文件之后,剥离调试符号也很不错:

strip -s gdb/gdb.exe

Voila! gdb.exe准备在Windows中运行并可以远程调试Linux可执行文件!

答案 4 :(得分:0)

使用gcc / gdb设置交叉编译或交叉调试环境是一个非常困难的问题,它几乎不是最有效的解决方案。将Linux VM放在Windows机器上并在那里进行调试将会少得多。如果您真的需要调试“那边”,我建议只使用命令行gdb进行ssh-ing。如果您不能拥有源代码,那么从您控制的Linux VM进行远程调试将是切实可行的。

答案 5 :(得分:0)

Linux上的软件开发通常比Windows上容易得多。但这不是主题。

调试交叉编译的二进制文件时,重要的是使用交叉编译器提供的gdb而不是宿主gdb。例如,您不能使用为Windows构建的gdb调试linux进程(可以,但是不建议这样做)。您需要使用交叉编译器gdb调试远程进程(它是用于构建二进制文件的同一工具链的一部分)。正如您所说的那样,您永远不会在Windows上编译,我敢肯定这可能是您的问题。使它正常工作的最简单方法是仅在远程计算机上的命令行上使用gdb,在该计算机上进行编译,然后通过ssh进行调试。