CLion 中的 GDB Monitor 命令

Posted

技术标签:

【中文标题】CLion 中的 GDB Monitor 命令【英文标题】:GDB Monitor commands in CLion 【发布时间】:2017-02-10 03:47:12 【问题描述】:

我正在尝试使用远程 GDB 调试嵌入式项目。我的系统:

目标:ARM Cortex M0。 SEGGER J-Link GDB Server V6.10命令行版 arm-none-eabi-gdb 7.10.1.20160616-cvs CLion 2016.2.2,内部版本 #CL-162.1967.7 Ubuntu 16.04

我的 .gdbinit 文件中有以下内容:

target remote localhost:2331 #(I remove this line when debugging with CLion)
set verbose on
file "/path_to_output_file/blinky.elf"
monitor reset
break main

困扰我好几天的事情是,如果我直接从终端使用 gdb 进行调试,这可以正常工作,但当我在 CLion 中使用调试器时就不行了。在 CLion 中,我得到了错误:

此目标不支持“monitor”命令。

我的理论是终端接受“监视器重置”命令(至少它不会抱怨)。另一方面,CLion 会打印一个错误,但之后似乎会继续前进而不进行重置。结果似乎是,当我在 CLion 中启动新的调试会话时,我不会从 main() 的开头开始。

CLion 是否阻止了监控命令?如果是这样,那么为什么以及是否有解决方法?

我感觉我的问题可能与CPP-7322 和CPP-7256 有关。

【问题讨论】:

【参考方案1】:

CLion 不会故意阻止来自.gdbinit 的任何特定命令。问题是,这些命令在调试器启动时执行,然后附加到目标。这意味着monitor reset 命令在没有运行远程会话的情况下被执行,因此它失败了。

只是为了澄清:

手动执行 GDB 时会发生以下情况:

# commands from .gdbinit
target remote localhost:2331
set verbose on
file "/path_to_output_file/blinky.elf"
monitor reset
break main

当您使用相同的 .gdbinit 文件从 CLion 执行 GDB 时会发生以下情况:

# commands from .gdbinit
target remote localhost:2331
set verbose on
file "/path_to_output_file/blinky.elf"
monitor reset
break main

# commands executed by CLion to attach
target remote localhost:2331  # <- ERROR (A program is being debugged already)

当您从 CLion 执行 GDB 并删除附加命令时,会发生以下情况:

# commands from .gdbinit
set verbose on
file "/path_to_output_file/blinky.elf"
monitor reset  # <- ERROR not attached to remote gdbserver => unknown command

# ... not executed due to the error above
break main
# commands executed by CLion to attach
target remote localhost:2331

您链接的问题完全正确,请随时投票(免责声明:我是 CLion 开发人员之一)。 恐怕我暂时想不出一个合理的解决方法来建议你。

更新:

实际上一种适用于您的用例的解决方法,适用于 CLion 和终端调试会话。您可以使用GDB hooks 来实现。

在您的 .gdbinit 文件中,将相关命令替换为以下行:

define target hookpost-remote
file "/path_to_output_file/blinky.elf"
monitor reset
break main
end

这样,每次连接远程目标时,GDB 都会执行定义的钩子中指定的命令,而不管您以何种方式启动调试器,无论是从 CLion 还是从终端。

【讨论】:

那我不明白为什么当我直接从终端运行 arm-none-eabi-gdb 时它会起作用?不是基本相同的机制吗?我可以在 CLion 的 GDB 终端中看到有一个 python 调用,我猜这只是一些漂亮的打印内容?然后我得到:/home/martin/.gdbinit:6 源命令文件中的错误:此目标不支持“monitor”命令我认为如果问题确实是顺序,我收到“不支持”消息很奇怪命令和执行。 顺便说一句;我当前的解决方法是在启动 GDB 服务器之前使用 JLink 重置和停止芯片的脚本。然后我终于从 CLion 运行调试器。不过这很麻烦,因为它需要我在每个调试会话中启动和停止脚本。 @bad_coffee 我试图解释你得到错误的原因,请查看更新的答案。 再次阅读 CPP-7322 描述和您的回答时,我想我明白了。从描述中:“所以在我的情况下,“目标远程”运行两次:第一次是我的 .gdbinit 来源,第二次是 CLion”。换句话说,.gdbinit 有点被 CLion 否决了?修复 CPP-7322 会解决问题吗? @bad_coffee 是的,当 CLion 运行 GDB 时,后者来源 ~/.gdbinit,如果有的话,并且像 target remote 这样的一些命令可能会干扰和冲突之后由 CLion 执行的命令。 CPP-7322 确实可以解决问题,您的用例似乎很常见。【参考方案2】:

四处寻找完全相同的问题,我遇到了这个GitHub project,它提供了关于在 CLion 上设置 JLink 调试器的精彩分步指南。真正帮助我的是在用户主目录中生成.gdbinit 的脚本。

无需添加file /firmware.elf 命令,因为在启动调试会话时由 CLion 负责。另一方面,load 命令是刷新目标所必需的。

【讨论】:

以上是关于CLion 中的 GDB Monitor 命令的主要内容,如果未能解决你的问题,请参考以下文章

CLion 中的 J-Link GDB 调试

Mac版Clion使用GNU-gcc与GDB

如何在按下“停止”按钮时捕获捆绑的GDB在clion中发出的信号?

lite-monitor 一款基于shell命令的监控系统

可以在运行/调试配置中使用 CLion 宏吗?

在 CLion 中编译简单程序时出错