21

我在 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常见问题解答提供了一些指示,但不幸的是我仍然被阻止。常见问题解答描述了两种方法:

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

我也在CDT 论坛上提出了这个问题

4

6 回答 6

9

只需在目标平台支持的情况下重建 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]}
于 2017-12-15T11:34:41.607 回答
5

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

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

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

于 2015-07-28T14:45:55.907 回答
3

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

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

于 2020-04-22T10:42:17.500 回答
1

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

于 2017-10-22T05:03:01.160 回答
0

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

于 2013-03-10T17:32:03.080 回答
0

在 Linux 上进行软件开发通常比在 Windows 上容易得多。但那是题外话。

当您调试交叉编译的二进制文件时,重要的是您使用来自交叉编译器的 gdb - 而不是宿主 gdb。例如,您不能使用为 Windows 构建的 gdb 来调试 linux 进程(当然可以,但不推荐)。您需要使用交叉编译器 gdb 来调试远程进程(它是用于构建二进制文件的同一工具链的一部分)。正如您所说,您永远不会在 Windows 上编译,我很确定这可能是您的问题。让它工作的最简单方法是从远程计算机上的命令行使用 gdb,在其中编译,并通过 ssh 进行调试。

于 2018-08-18T06:38:52.670 回答