我看到两个(也许三个)选项
- 使用备用 GDB 服务器(见下文)
- 从 STMCubeIDE 单独运行 GDB 服务器(请参阅 OP 的 Windows 答案,Linux 答案)
- GDB 串行(目前还不是真正的选择,但我会分享我目前的经验)
我已经使用第二个选项成功调试了我的目标,使用任意 GDB,例如 gdb-multiarch 命令行和(非 STMCube-ified)Eclipse CDT
替代 GDB 服务器
你可以试试STLink open source。我做到了。问题是,您的设备可能未得到正确支持。我从 Github 构建了 1.6.1 以启用对 STM32G03x 设备的支持。迁移到此版本时,它可以检测设备,我可以使用st-flash 对设备进行编程,但调试器无法使用(尝试更改寄存器,它会更改错误的寄存器,尝试单步执行程序,它会崩溃立即)。
请尝试一下。它的安装(或构建)简单快捷,因此值得检查您的设备是否可以正常使用它。
Openocd 是另一种选择,但似乎不支持 SWD 连接。我尝试了一个据称对此有补丁但没有运气的构建。
如果您可以使用这些开源替代方案之一,它们还有另一个优势,您可以在 Raspberry PI 之类的设备上运行它们,这意味着您不必让 PC 物理上靠近您的目标.
从 STMCubeIDE 单独运行 GDB 服务器
对于 Windows,请参阅 OP 的答案。对于 Linux,我这样做更改路径名以适合您的安装
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/user/apps/st/stm32cubeide_1.5.1/plugins/com.st.stm32cube.ide.mcu.externaltools.stlink-gdb-server.linux64_1.5.0.202011040924/tools/bin/native/linux_x64/ /home/user/apps/st/stm32cubeide_1.5.1/plugins/com.st.stm32cube.ide.mcu.externaltools.stlink-gdb-server.linux64_1.5.0.202011040924/tools/bin/ST-LINK_gdbserver -p 61234 -l 1 -d -s -cp /home/user/apps/st/stm32cubeide_1.5.1/plugins/com.st.stm32cube.ide.mcu.externaltools.cubeprogrammer.linux64_1.5.0.202011040924/tools/bin -m 0 -k
我是怎么做到的?首先从 STMCubeIDE 启动调试会话,然后运行
ps aux | grep gdbserver
然后我们可以看到 Eclipse (STMCube) 是如何启动 gdbserver 并从那里开始工作的。
如果您发现它抱怨 .so 文件,请从 STMCube 安装中找到该文件,并确保包含它的目录的路径在 LD_LIBRARY_PATH 中(根据我的示例)
您还可以使用 --help 启动程序以显示更多选项。
如果添加 -e(持久),您可以在不重置目标的情况下断开并重新连接 GDB 客户端(尽管它会在 gdb 服务器的初始调用时重置,即使没有 -k)。
GDB 序列号
这是目标实现协议的 GDB 服务器端的地方。 GDB 存根通常在异常处理程序中运行。这通常是您的断点处理程序,但您也可以将其设置为未处理异常的默认处理程序,或者例如 ctrl-c 中断。
我最近在谷歌上搜索了很多关于这个的内容,基本上当人们在论坛上询问它时,他们通常会得到类似“这里是龙”或“你为什么不使用 JTAG?”的回答。
因此,您可能想知道的驱动程序位于 GDB 源代码 git://sourceware.org/git/binutils-gdb.git 下 gdb/stubs。文档是here。 那里没有针对 arm 的存根实现。 真的很可悲,我曾经在我工作的地方经常使用 GDB 远程串行,其中一些目标确实是 ARM .操作系统是 ecos。
那么可以将 ecos GDB 存根移植到裸机吗?给它一个很好的外观,我相信是的,他们可以。存根基于 GDB 源中的存根,但它们受到 Ecos 和 Redboot 构建宏和版权的严重污染(原始文件由 HP 编写并在没有版权的情况下发布)。我们不知道 Ecos 存根可能包含哪些错误(我在当天至少修复了一个,我不记得我是否提交了补丁)。我们不知道他们是否真的正确支持最新的架构。而且,我们不知道在那之后它们是否会占用太多内存——我的 STM32 有 8K 的 SRAM,我已经看到默认大小为 2K 的缓冲区(不是说这是必要的,但你会看到工作需要在这里完成..)
所以这第三个选项,我有一天会重新审视这个选项,但现在,对我来说,这是一个不行的。