C++ 在NetBeans中使用远程生成主机时,断点如何工作?

C++ 在NetBeans中使用远程生成主机时,断点如何工作?,c++,netbeans,embedded,remote-debugging,gdbserver,C++,Netbeans,Embedded,Remote Debugging,Gdbserver,我的任务是为嵌入式平台建立一个开发环境。到目前为止,我已经在NetBeans中设置了一个远程构建主机,它将所有源文件复制到目标设备,使用设备g++、ld等上的GNU工具链对它们进行本机编译,然后运行编译后的二进制文件并将标准输出转发到NetBeans运行的开发机器 我不明白的是:如果断点只存在于NetBeans中,构建机上的二进制文件如何知道何时何地启动/停止?构建主机只需要ssh访问和编译/链接工具链,但似乎以某种方式与NetBeans通信以进行调试。我的一位同事建议它使用gdbserver,

我的任务是为嵌入式平台建立一个开发环境。到目前为止,我已经在NetBeans中设置了一个远程构建主机,它将所有源文件复制到目标设备,使用设备g++、ld等上的GNU工具链对它们进行本机编译,然后运行编译后的二进制文件并将标准输出转发到NetBeans运行的开发机器


我不明白的是:如果断点只存在于NetBeans中,构建机上的二进制文件如何知道何时何地启动/停止?构建主机只需要ssh访问和编译/链接工具链,但似乎以某种方式与NetBeans通信以进行调试。我的一位同事建议它使用gdbserver,但我在NetBeans网站上没有找到有关此软件包的任何文档,而且它没有安装在构建主机上,至少不是从apt安装的。NetBeans是如何做到这一点的?

gdb在目标机器上运行的。只有与gdb命令等的通信通过网络传输到本地机器。如果需要了解更多信息,请阅读gdb文档/


您也可以这样做-只需打开远程终端,运行gdbserver,启动gdb,您就完成了:

GUI IDE使用或可以配置为使用不同的命令行工具链进行编译和调试,通常通过将每个必需的工具链程序作为子流程运行并通过标准流与之交互来完成这一任务。本质上,IDE将使用gcc或gdb,其文本接口与在终端窗口中运行它时使用的相同。IDE使用其对源文件中的行的了解来配置gdb中的断点,就像手动运行它一样

在您的情况下,IDE被配置为使用远程主机来完成所有这一切,因此工具链不是在本地调用的,而是通过到远程机器的ASSSH会话来控制的,在远程机器上进行构建和运行

由于gdb调试器和目标程序在同一台计算机上运行,因此不需要gdbserver

在gdb对于目标系统来说太大的情况下,gdbserver是一个小程序,它经常为目标系统交叉编译并加载到目标系统上。它充当一个紧凑的小委托,通过串行或网络连接与构建机器上运行的主gdb程序进行对话,并代表gdb执行与处理器、内存和运行程序的原始交互


另一种可能性是gdbserver角色由与gdb运行在同一台机器上的助手程序担任,而gdb会命令类似JTAG调试适配器的东西在较低级别与目标硬件交互。但是,在这种情况下,实现gdbserver协议的助手程序通常不称为gdbserver,而是具有实现特定的名称,例如openocd。

gdbserver通常与GCC一起提供。我不确定你的系统的包装是如何损坏的。您可能需要单独安装一个gdb包。至于如何在Netbeans中设置它。。。没有线索。@user4581301哪个gdbserver没有返回任何东西,所以我认为它没有安装。gdbserver是否必须存在才能使这个功能存在?可能,而且它通常会使工作变得非常简单,即使有办法解决它。查看在您的目标计算机上运行apt get install gdb是否有用。但是,如果未安装gdbserver,目标计算机如何使用它?那么这是一个奇迹。@只有当程序在不同于gdb的计算机上运行时,才需要PeterJ gdbserver。很可能在同一台机器上运行gdb和gdbserver,但这样做毫无意义。OP询问远程调试。无论如何,调试软件和硬件中最好的一款——Segger J-Link在本地机器上使用gdbserver,与其他机器相比,它的速度非常快。编写良好的软件,通用本地和远程,易于配置-因为它对本地和远程调试使用几乎相同的配置。在本例中,远程调试指的是IDEGDB连接,而不是GDBCPU连接。当GDB未在目标CPU上运行时,那么是的,您可以与在目标CPU上运行的gdbserver通信协议,也可以与本地设备(如openocd)通信,后者使用gdbserver协议并通过硬件调试接口控制目标。如果他们真的调用这个gdbserver的实现,Segger有点不寻常,但不管怎样。这与这里提出的问题完全无关。在我的场景中,机器2和机器3是同一台机器。最终,我希望机器1和2是相同的,但目前,我正在嵌入式平台上编译。根据您的回答,我假设NetBeans只是通过ssh向目标平台上的gdb命令行版本发出命令,而gdbserver不参与其中。这是公司吗 是吗?是的。gdbserver只有在gdb运行在与被调试程序不同的机器上的情况下才会明智地参与进来。