代码之家  ›  专栏  ›  技术社区  ›  rewbs

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

  •  16
  • rewbs  · 技术社区  · 14 年前

    我在Windows上运行EclipseCDT来开发在远程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主机端做了一些错误。我的具体问题是:

    • gdb的cygwin版本是否足以调试远程Linux进程,还是需要一个特殊的交叉gdb才能在Windows上运行它? 使用Linux进程?如果是这样,我能在哪里得到这样一个全球发展银行?

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

    谢谢,

    -R


    更多信息: 这个 RSE FAQ 提供一些指针,但不幸的是我仍然被阻止。常见问题解答描述了两种方法:

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

    我也养大了 this issue on the CDT forum .

    5 回复  |  直到 6 年前
        1
  •  0
  •   bmargulies    12 年前

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

        2
  •  4
  •   Mohamed Abdelazim    9 年前

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

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

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

        3
  •  3
  •   Eugene Weiss    7 年前

    只需在支持目标平台的情况下重建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]}
    
        4
  •  1
  •   TheRealOrange    7 年前

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

        5
  •  0
  •   Martin    6 年前

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

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