使用 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-hostname
和 1234
)
最后,就像我们在 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++ 应用程序的主要内容,如果未能解决你的问题,请参考以下文章
使用 Eclipse 作为 Node.JS 远程调试器(拒绝连接)