CLion 中的 GDB 监视器命令
GDB Monitor commands in CLion
我正在尝试使用远程 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" 此目标不支持命令。
我的理论是终端接受 "monitor reset" 命令(至少它不会抱怨)。另一方面,CLion 会打印错误,但之后似乎继续前进而没有进行重置。结果似乎是,当我在 CLion 中开始新的调试会话时,我并没有从 main() 的开头开始。
CLion 是否阻止了监控命令?如果是这样,那么为什么以及是否有解决方法?
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 还是从终端。
四处寻找完全相同的问题,我遇到了这个 GitHub project,它有一个关于在 CLion 上设置 JLink 调试器的很好的分步指南。真正帮助我的是在用户主目录中生成 .gdbinit
的脚本。
无需添加 file /firmware.elf
命令,因为启动调试会话时 CLion 会处理此问题。另一方面,load
命令是闪烁目标所必需的。
我正在尝试使用远程 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" 此目标不支持命令。
我的理论是终端接受 "monitor reset" 命令(至少它不会抱怨)。另一方面,CLion 会打印错误,但之后似乎继续前进而没有进行重置。结果似乎是,当我在 CLion 中开始新的调试会话时,我并没有从 main() 的开头开始。
CLion 是否阻止了监控命令?如果是这样,那么为什么以及是否有解决方法?
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 还是从终端。
四处寻找完全相同的问题,我遇到了这个 GitHub project,它有一个关于在 CLion 上设置 JLink 调试器的很好的分步指南。真正帮助我的是在用户主目录中生成 .gdbinit
的脚本。
无需添加 file /firmware.elf
命令,因为启动调试会话时 CLion 会处理此问题。另一方面,load
命令是闪烁目标所必需的。