CLion中的GDB Monitor命令



我正在尝试使用远程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命令来闪现目标。

相关内容

  • 没有找到相关文章

最新更新