我尝试使用远程GDB调试嵌入式项目。我的系统:
我的.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我收到错误:
"监测"该目标不支持该命令。
我的理论是终端接受"监视器重置"命令(至少它没有抱怨)。另一方面,CLion会打印错误,但之后会显示继续执行而不进行重置。结果似乎是当我在CLion中开始一个新的调试会话时,我不会在main()的开头开始。
CLion是否阻止了监视器命令?如果是这样,那么为什么并且有解决方法?
答案 0 :(得分:7)
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)
以及在删除attach命令后从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还是从终端启动调试器的方式。
答案 1 :(得分:0)
寻找完全相同的问题,我遇到了这个GitHub project,它提供了有关在CLion上设置JLink调试器的出色分步指南。真正帮助了我的是在用户主目录中生成.gdbinit
的脚本。
不需要添加file /firmware.elf
命令,因为CLion在启动调试会话时会处理此命令。另一方面,必须使用load
命令来刷新目标。