我正在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描述了两种方法:
答案 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进行调试。