使用gdb和gdbserver从Windows远程调试Linux进程:在Windows侧需要什么?

26
我正在Windows上运行Eclipse CDT,开发在远程Linux系统上构建和测试的C代码。目前,该代码从未在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主机侧出了错。我的具体问题是:

  • Cygwin版本的gdb是否足以调试远程Linux进程,或者我需要特殊的交叉gdb才能在Windows上运行并与Linux进程一起工作?如果需要,有哪里可以获取这样的gdb?

  • 使用gdb进行远程调试需要在主机系统上可用符号。最简单的实现方式是什么?我只需将Linux目标构建产生的符号复制到Windows主机上吗?还是必须在Windows上进行完整构建?是否有避免此要求的方法,例如仅在目标上提供符号?

谢谢,

-R


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

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

我还在CDT论坛上提出了此问题

6个回答

10

只需使用支持目标平台的 Cygwin 重新构建 gdb 即可。以下是针对 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]}

这太准确了!在 VirtualBox 中运行 CentOS 7,并在 Windows 10 主机上使用 Eclipse/Cygwin64 完美地工作。已下载并编译 GDB 8.1.1。 - speed488

5

4

我在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]}

为目标平台准备makefiles,但在不同的主机上运行。我们将其编译为静态文件,这样它就不依赖于任何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

大功告成!gdb.exe已经准备好在Windows上运行,并且可以远程调试Linux可执行文件了!


我可以确认,使用 WSL 2 可以正常工作(为什么不行呢)。在 /tmp 中使用 make LDFLAGS=-static -j8 进行构建,在我的五年老的 i7 上花费了一分钟多一点的时间。(没有安装 makeinfo,所以速度有所提升,但远远不到 30 分钟。) 两个注意事项: 1)tar xf gdb-<ver>.tar.xz 也可以完成任务。不再需要 -J 2)为什么要在 .../build/x86_64-redhat-linux-gnu 中进行构建,而不是直接在 .../build 中? - Morty

1

使用gcc/gdb设置交叉编译或交叉调试环境是一个非常困难的问题,而且几乎从来不是最有效的解决方案。在Windows计算机上放置Linux虚拟机并在那里进行调试会更加简单。如果你真的需要在远程调试,请建议使用ssh并使用命令行gdb。如果您无法在远程位置获取源代码,则可以从您控制下的Linux虚拟机进行远程调试。


1
Visual Studio Community Edition 2017具备GDB交叉编译和调试工具。结合Linux服务器或Windows Linux子系统,您可以可靠地为Linux系统开发C代码。请查看this guide.

0

在软件开发中,通常在Linux上比在Windows上更容易。但这是离题了。

当你调试交叉编译的二进制文件时,重要的是使用交叉编译器中的gdb,而不是宿主机上的gdb。例如,你不能使用为Windows构建的gdb来调试Linux进程(虽然可以,但不推荐)。需要使用交叉编译器gdb来调试远程进程(这是用于构建二进制文件的同一工具链的一部分)。由于你说你从未在Windows上进行编译,所以我非常确定这可能是你的问题。最简单的方法是在远程机器上使用命令行中的gdb,并通过ssh进行调试。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接