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

rew*_*wbs 16 linux windows gdb eclipse-cdt gdbserver

我在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[...]
Run Code Online (Sandbox Code Playgroud)

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

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

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

谢谢,

-R


更多信息:RSE常见问题提供了一些三分球,但不幸的是,我仍然受阻.FAQ描述了两种方法:

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

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

小智 5

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

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

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


Eug*_*iss 5

只需在目标平台支持下重建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
Run Code Online (Sandbox Code Playgroud)

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

> echo ${BASH_VERSINFO[5]}
Run Code Online (Sandbox Code Playgroud)


tut*_*szy 5

我在 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
Run Code Online (Sandbox Code Playgroud)

下载Windows编译器:

sudo apt-get install mingw-w64
Run Code Online (Sandbox Code Playgroud)

检查您想要调试二进制文件的目标配置平台(在 --target 参数中放入什么内容):

echo ${BASH_VERSINFO[5]}
Run Code Online (Sandbox Code Playgroud)

准备针对您所需平台但在不同主机上运行的 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
Run Code Online (Sandbox Code Playgroud)

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

make LDFLAGS=-static
Run Code Online (Sandbox Code Playgroud)

您可以在 gdb 文件夹中找到您的调试器。最好去掉它的调试符号,因为构建可执行文件后会很大:

strip -s gdb/gdb.exe
Run Code Online (Sandbox Code Playgroud)

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


bma*_*ies 1

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