【问题标题】:How do breakpoints work when using a remote build host in NetBeans?在 NetBeans 中使用远程构建主机时断点如何工作?
【发布时间】:2017-12-22 08:34:53
【问题描述】:

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

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

【问题讨论】:

  • gdbserver 通常与 GCC 一起提供。我不确定您的系统包装是如何分解的。您可能需要单独安装 gdb 包。至于如何在 Netbeans 中设置...没有线索。
  • @user4581301 which gdbserver 没有返回任何东西,所以我认为它没有安装。 gdbserver have to 是否存在才能使此功能存在?
  • 可能,即使有办法绕过它,它通常也会使工作变得容易得多。看看在你的目标上运行 apt-get install gdb 是否有用。

标签: c++ netbeans embedded remote-debugging gdbserver


【解决方案1】:

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

在您的情况下,IDE 配置为对所有这些使用“远程主机”,因此工具链不是在本地调用,而是通过 ssh 会话控制到远程计算机,在该远程计算机上进行构建和运行。

因为gdb调试器和目标程序在同一台计算机上运行,​​所以不需要gdbserver

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

另一种可能性是gdbserver 角色 由与gdb 运行在同一台机器上的帮助程序持有,它命令类似于JTAG debug adapter 与目标硬件交互一个较低的水平。但是,在这种情况下,实现 gdbserver 协议的帮助程序通常不称为“gdbserver”,而是具有特定于实现的名称,例如 openocd

【讨论】:

  • 在我的场景中,机器 2 和 3 是同一台机器。最终,我希望机器 1 和 2 相同,但目前我正在嵌入式平台上编译。根据您的回答,我假设 NetBeans 只是通过 ssh 向目标平台上的命令行版本 gdb 发出命令,而不涉及 gdbserver。这是正确的吗?
  • 是的。 gdbserver 只会(明智地)在gdb 运行在与被调试程序不同的机器上的情况下参与。
【解决方案2】:

gdb 在目标机器上运行。只有与 gdb(命令等)的通信才能通过网络连接到您的本地计算机。如果需要了解更多信息,请阅读 gdb 文档/

你也可以做同样的事情——只要打开远程终端,运行 gdbserver,启动 gdb,你就完成了 :)

【讨论】:

  • 如果没有安装gdbserver,目标机器如何使用?
  • 那真是个奇迹。
  • @PeterJ gdbserver 仅当程序在与gdb 不同的计算机上运行时才必需。在同一台机器上运行gdbgdbserver 可能可能,但这样做毫无意义。
  • OP 询问了 remote 调试。无论如何,最好的调试软件(和硬件)之一 - Segger J-Link 在本地机器上使用 gdbserver,与其他机器相比,它的速度很快。编写良好的软件,通用(本地和远程),易于配置 - 因为它使用几乎相同的配置进行本地和远程调试
  • Remote 在这种情况下是指 IDEGDB 连接,而不是 GDBCPU 连接。当 GDB 未在目标 CPU 上运行时,可以,您可以与运行在目标上的 gdbserver 通信协议,或者您可以与本地设备(如 openocd)通信,它使用 gdbserver 协议并通过 a 控制目标硬件调试接口。如果 Segger 真的调用了这个 gdbserver 的实现,那么 Segger 有点不寻常,但无论如何。这与这里提出的问题无关。您通常不会对在操作系统下运行的程序使用硬件调试。
猜你喜欢
  • 1970-01-01
  • 2012-10-28
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 2016-08-27
  • 2012-06-15
  • 2020-09-13
  • 2021-03-10
相关资源
最近更新 更多