CLion中的GDB监视器命令

7
我正在尝试使用远程GDB调试嵌入式项目。我的系统如下:
  • 目标:ARM Cortex M0。
  • SEGGER J-Link GDB服务器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中使用调试器时就会出错:
“monitor”命令不支持此目标。
我的理论是,终端接受了“monitor reset”命令(至少没有抱怨)。另一方面,CLion则打印一个错误,但似乎之后继续执行而没有进行重置。结果似乎是,在CLion中开始新的调试会话时,我不会从main()函数的开头开始。
CLion是否阻止了监视器命令?如果是这样,那么为什么呢?有没有解决方法?
我觉得我的问题可能与CPP-7322CPP-7256有关。
2个回答

10

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
    
  • 当你在CLion中执行GDB并使用相同的.gdbinit文件时会发生什么:

  • # 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中删除attach命令,执行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 Error in sourced command file: "monitor" command not supported by this target如果问题真的是命令和执行顺序的问题,我认为收到“不支持”的消息很奇怪。 - bad_coffee
非常感谢。您的编辑非常合理。我已经投票表决了这些问题。 - bad_coffee
我尝试了你的建议,它让我向前迈进了一步。显然,.gdbinit在适当的时间被执行了。但现在我的问题是,“monitor reset”既重置又停止了我的目标CPU。我卡在那里了。我可以在重置后使用“continue”命令,我的应用程序会运行到第一个断点。然而,它只是在那里徘徊约3秒钟,而CLion中的“Variable”窗口显示“正在收集数据...”。然后GDB服务器关闭连接,调试会话结束。 - bad_coffee
@bad_coffee end 只是终止了 define 命令,请参考 https://sourceware.org/gdb/onlinedocs/gdb/Hooks.html。 - Eldar Abusalimov
@bad_coffee,恐怕我无法解释正在发生的事情。不幸的是,我手头没有板子来复制你的情况。不知道,在“file”之后是否缺少“load”命令? - Eldar Abusalimov
显示剩余8条评论

1

寻找相同问题的解决方法时,我发现这个GitHub项目提供了一个非常好的逐步指南,介绍了如何在CLion上设置JLink调试器。真正帮助我的是生成用户主目录下.gdbinit脚本。

不需要添加file /firmware.elf命令,因为当启动调试会话时,CLion会自动处理它。另一方面,为了烧录目标设备,需要使用load命令。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接