使用 Eclipse CDT/RSE/RDT 远程调试 C++ 应用程序

Posted

技术标签:

【中文标题】使用 Eclipse CDT/RSE/RDT 远程调试 C++ 应用程序【英文标题】:Remote debugging C++ applications with Eclipse CDT/RSE/RDT 【发布时间】:2013-03-19 02:00:38 【问题描述】:

我正在与 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 进程。

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

我正在使用 MSYS/Git 提供的 ssh 二进制文件(不在 PATH 上) Cygwin 不在PATH

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

【问题讨论】:

【参考方案1】:

使用 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(从网站下载)、gdbserver 7.12、aarch64-linux-gnu-gdb 7.6 中测试。

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

手册 自动 密码验证 公钥认证

手动

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

Pro:无需通过 Eclipse 配置 SSH 连接,让 Eclipse 能够

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

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

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

在“主要”标签下:

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

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

我们这样做的原因:自动启动器首先通过 SSH 连接到开发板并为您启动 gdbserver

在“调试器”选项卡下:

“GDB 调试器”:与主机 CLI 中使用的相同,此示例为 aarch64-linux-gnu-gdb

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

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

gdbserver :1234 path/to/executable

并从 Eclipse 正常启动调试器。

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

密码验证自动

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

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

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

在 Eclipse 集合中:

解决“安全存储无法保存主密码”错误,如下所述:How to solve "Secure storage was unable to save the master password" in Eclipse CDT remote application with SSH password debug connection? 将启动器设置为:“自动远程调试启动器” 设置“远程绝对文件路径 用于 C/C++ 应用程序”到/root/path/to/project/path/to/executable “连接”、“新建”,然后选择“基于密码的身份验证”

使用公钥自动

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

优点:

如果您有加密的私钥,则克服“安全存储无法保存主密码”(不安全,但适合 对于服务器,您可能已经设置了公钥

缺点:

第一次按键设置可能会受伤 无论何时开发板都必须重做密钥设置

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

在目标上设置~/.ssh/authorized_keys 以包含来自主机的~/.ssh/id_rsa.pub 在主机上有一个未加密的私钥,它绕过了我们的密码问题 正确设置讨厌的文件夹权限:https://unix.stackexchange.com/questions/36540/why-am-i-still-getting-a-password-prompt-with-ssh-with-public-key-authentication

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

ssh user@host

无需输入任何密码。

更改进程的当前工作目录

How to set the current working directory of the program when remote debugging with gdbserver Automatic Launcher in Eclipse CDT?

【讨论】:

【参考方案2】:

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

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

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

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

【讨论】:

好吧,我也认为,交叉构建太复杂了。我正在尝试采用纯粹的远程方式,因为我不想在 Windows 机器上构建任何东西,这会导致更多问题(并且在我的公司笔记本电脑上需要更大的软件)【参考方案3】:

很遗憾,这个问题还没有得到想要的解决方案。不过,您可能对我实际上是如何“解决”这个问题感兴趣:

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

【讨论】:

【参考方案4】:

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

在桌面 PC 上运行 IDE 使用目标系统上的远程工具链来构建而不是安装本地交叉工具链 只需单击一下即可在远程系统上执行自动化调试和运行(启动 gdbserver,附加到它,并提供控制台输出)

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

我的最终解决方案: 经过几天的努力,我终于为NetBeans C/C++ Remote Development Environment放弃了Eclipse CDT+RDT+RSE,这对我来说就像一个魅力。

【讨论】:

【参考方案5】:

您可以尝试this plugin 与 Eclipse,并行应用程序版本 here is a link

在从Windows机器开发到Linux上编程时效果很好

【讨论】:

以上是关于使用 Eclipse CDT/RSE/RDT 远程调试 C++ 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

使用远程 Git 签出存储库运行 eclipse

Eclipse PyDev 使用远程解释器

在远程机器上运行 Eclipse 项目

使用 Eclipse 作为 Node.JS 远程调试器(拒绝连接)

Eclipse中使用Git之一把远程仓库的项目,clone到eclipse里面

tomcat启动debug模式,使用eclipse远程调试