15

我正在与 Eclipse(在 Windows 中)进行斗争,以使其连接到我的 Linux 机器并在那里远程编译和调试 C++ 代码。

我有什么工作:

  • 已安装 CDT/RSE/RDT(Eclipse Juno、CDT 8.1.2、PTP(RDT) 6.0.4、RSE 3.4)
  • rdt-server 在 Linux 机器上运行 ( perl ./daemon.pl 4075)
  • 创建本地 C++ 项目(基于 Makefile)
  • 编译和调试本地 C++ 项目
  • 创建远程项目(使用“Linux”连接到 rdt-server)
  • 编译远程项目(基于 Makefile)

我可以做的一些手动操作(没有 Eclipse):

  • “远程”调试我编译的项目:ssh mybox 'cd /path/to/project; gdb main'
  • 启动一个 gdbserver:ssh mybox 'cd /path/to/project; gdbserver fqdn:10000 main'

什么不工作:在 Eclipse 中调试

  • 通过“C++ 应用程序”调试错误:未指定程序(因为我没有本地代码)
  • 通过“C++ 远程”调试错误:未指定程序(我需要本地代码吗?)
  • 通过“C++ attach”调试(调试器:“gdbserver”)
    • gdbserver 在 linuxbox 上运行
    • gdb 无法与 gdbserver 通信(cygwin gdb 7.5,linux gdb/gdbserver 7.3);警告:架构拒绝了目标提供的描述。
  • 通过“C++ attach”调试(调试器:“gdb”)将尝试附加到我的 Windows 进程。

其他可能导致问题的事情:

  • 我正在使用sshMSYS/Git 提供的二进制文件(不在PATH
  • Cygwin 未开启PATH

我真的很想在 Eclipse 中为我的 C++ 项目进行远程调试。您对如何从这里开始有任何建议吗?

4

5 回答 5

2

使用 CLI 进行健全性检查

在您做任何事情之前,请确保您:

  • 正确交叉编译应用程序并使其运行。您不一定需要使用 Eclipse 来执行此操作。
  • 从命令行让 GDB 远程调试正常工作

这个答案假设你可以在开发板上做:

sudo apt-get install gdbserver
gdbserver :1234 path/to/executable

在主机上:

aarch64-linux-gnu-gdb \
  -ex "target remote board-hostname:1234" \
  -ex "file path/to/cross/compiled/executable" \
  -ex 'tb main' \
  -ex c

然后正确调试所有内容。

Eclipse 设置

在 Ubuntu 16.04 主机、Eclipse Oxygen 4.7.0(从网站下载)、gdbserver7.12、7.6 中测试aarch64-linux-gnu-gdb

我已成功使用以下所有方法:

  • 手动的
  • 自动的
    • 密码验证
    • 公钥认证

手动的

使用这种方法,我们必须先gdbserver在目标上启动,然后再在 Eclipse 上运行调试。

Pro:省去了通过 Eclipse 配置 SSH 连接,让 Eclipse 能够

gdbserver缺点:每次调试开始时都必须重新启动。如果 Eclipse 理解gdbserver --multi,这可能会被克服,但我认为它不会?

由于其简单性,我建议您首先使用此方法。

打开调试配置,然后创建一个新的“C/C++ 远程应用程序”。

在“主要”选项卡下:

  • 像往常一样选择“名称”、“项目”和“C/C++ 应用程序”进行本地调试

  • 在底部启动器中,单击“选择其他”,选中“使用配置特定设置”并选择“GDB(DSF)手动远程调试启动器”

    为什么我们这样做:自动启动器首先使用 SSH 连接到开发板并gdbserver为您启动。

    在此处输入图像描述

在“调试器”选项卡下:

  • “GDB 调试器”:与主机上 CLI 中使用的相同,aarch64-linux-gnu-gdb对于本示例

  • board-hostname子选项卡“连接”:将主机名和端口设置为在 CLI(和1234)上传递给主机

    在此处输入图像描述

    在此处输入图像描述

gdbserver最后,就像我们在 CLI 中所做的那样,在目标上手动启动:

gdbserver :1234 path/to/executable

并从 Eclipse 正常启动调试器。

gdbserver每次终止程序时都必须重新启动。

自动密码验证

这是固定公开密码的开发板的最佳方法。

它通过SSH和密码连接到目标,gdbserver每次都自动在目标上启动,超级方便!

目标gdbserver标准输出转到 Eclipse“控制台”窗口,这进一步减少了窗口切换。

在 Eclipse 集中:

使用公钥自动

与密码验证非常相似,不同之处在于你必须去:“连接”,“新建”,并选择“基于公钥的验证”

优点:

  • 如果您有加密的私钥(不安全,但可以
  • 对于服务器,您可能已经设置了公钥

缺点:

  • 键设置可能会在第一次伤害
  • 每当开发板被核弹时,必须重做密钥设置

如果您满足以下条件,SSH 无需密码即可连接:

在使用此方法之前,请确保您的授权密钥可以在命令行中使用,即您现在应该能够执行以下操作:

ssh user@host

无需输入任何密码。

更改进程的当前工作目录

在 Eclipse CDT 中使用 gdbserver Automatic Launcher 远程调试时如何设置程序的当前工作目录?

于 2017-08-13T09:06:59.767 回答
1

不幸的是,这个问题尚未产生所需的解决方案。不过,您可能对我如何实际“解决”问题感兴趣:

我们现在直接在 Linux 机器上进行开发,远程做所有事情。我们在 Linux 机器上设置桌面用户并通过 VNC 登录以运行 Eclipse 并将其用作gdb. 虽然 VNC 不是最好的解决方案(也许我们稍后会尝试 NX),但这个解决方案让我们摆脱了gdbserverRSE/RDT 的任何问题。

于 2013-04-11T12:37:15.573 回答
1

截至目前(Luna M6),Eclipse CDT+RDT+RSE 似乎是一条链,当您需要时缺少一些链接:

  • 在台式电脑上运行 IDE
  • 使用目标系统上的远程工具链来构建而不是安装本地交叉工具链
  • 自动调试和运行,通过单击在远程系统上执行(启动 gdbserver,附加到它,并提供控制台输出)

这些要求在如今大量的 Linux ARM 板(如 Raspberry Pi 和 OLinuxino)中非常普遍。这些板通常有足够的资源来运行工具链,但不足以提供远程桌面环境来远程运行 IDE。

我的最终解决方案: 经过几天的努力,我终于放弃了 Eclipse CDT+RDT+RSE 转而使用NetBeans C/C++ 远程开发环境,这对我来说就像是一种魅力。

于 2014-04-11T13:11:55.420 回答
1

“通过“C++ 远程”调试错误:未指定程序(我需要本地代码吗?)”

是的,因为符号是从本地代码副本加载的。

在此类启动配置的调试器选项卡中,您将找到远程服务器和端口的设置。使用您在启动 gdbserver 时指定的机器名称和端口。

AFAIK 这仍然不起作用,因为在本地 Windows 机器上运行的 gdb 将不支持调试 linux 程序。您将需要 gdb 的交叉构建(使用 host=mingw-or-something 和 target=linux 配置和构建)。

于 2013-03-29T07:21:01.540 回答
1

你可以用 Eclipse 试试这个插件,对于并行应用程序版本 ,这里是一个链接

它在从 Windows 机器开发到在 Linux 上编程时运行良好

于 2015-10-20T18:15:13.893 回答