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

时间:2013-03-28 14:57:33

标签: c++ eclipse gdb remote-debugging eclipse-cdt

我正在与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 ++项目
  • 创建远程项目(使用与rdt-server的“Linux”连接)
  • 编译远程项目(基于Makefile)

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

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

什么不起作用:在Eclipse中调试

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

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

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

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

5 个答案:

答案 0 :(得分: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(从网站下载),gdbserver 7.12,aarch64-linux-gnu-gdb 7.6。

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

  • 手册
  • 自动
    • 密码验证
    • public key auth

<强>手册

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

Pro:分配通过Eclipse配置SSH连接以允许Eclipse

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

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

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

在“主要”标签下:

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

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

    为什么我们这样做:自动启动器首先通过SSH连接到主板并为您启动gdbserver

    enter image description here

在“调试器”选项卡下:

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

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

    enter image description here

    enter image description here

最后,像在CLI中一样手动启动目标上的gdbserver

gdbserver :1234 path/to/executable

通常从Eclipse启动调试器。

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

使用密码验证自动

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

它使用SSH和密码连接到目标,并且每次都会自动在目标上启动gdbserver,这非常方便!

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

在Eclipse集中:

使用公钥自动

与密码验证非常相似,只是您必须转到:“连接”,“新建”,然后选择“基于公钥的验证”

优点:

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

缺点:

  • 第一次关键设置可能会受到伤害
  • 必须在设备开始时重做密钥设置

如果您执行以下操作,SSH无需密码即可连接:

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

ssh user@host

没有输入任何密码。

更改流程的当前工作目录

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

答案 1 :(得分:1)

  

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

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

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

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

答案 2 :(得分:1)

不幸的是,这个问题还没有产生理想的解决方案。不过,您可能对我实际“解决”问题的方式感兴趣:

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

答案 3 :(得分:1)

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

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

目前,这些要求在Raspberry Pi和OLinuxino等丰富的Linux ARM板上非常普遍。这些板通常具有足够的资源来运行工具链,但不足以提供远程桌面环境来远程运行IDE。

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

答案 4 :(得分:1)

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

它在从Windows机器到Linux上的程序开发中工作正常