我正在尝试使用远程GDB调试嵌入式项目。我的系统:
- 目标:ARM Cortex M0。
- SEGGER J-Link GDB Server V6.10命令行版本
- arm-none-eabi-gdb 7.10.1.20160616-cvs CLion 2016.2.2, Build #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是否阻塞了monitor命令?如果是这样,为什么?有没有解决办法?
我觉得我的问题可能与CPP-7322和CPP-7256有关。
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时删除attach命令的情况:
# 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钩子来实现。
在您的.gdbinit
文件中用以下行替换有问题的命令:
define target hookpost-remote
file "/path_to_output_file/blinky.elf"
monitor reset
break main
end
这样,每次远程目标连接时,GDB将执行在定义的钩子中指定的命令,无论您从CLion还是从终端启动调试器。
寻找完全相同的问题,我遇到了这个GitHub项目,它有一个关于在CLion上设置JLink调试器的很好的分步指南。真正帮助我的是在用户主目录中生成.gdbinit
的脚本。
不需要添加file /firmware.elf
命令,因为这是由CLion在调试会话启动时负责的。另一方面,需要load
命令来闪现目标。