GDB + CLion + STM32 - 不会远程调试

时间:2017-02-10 04:35:19

标签: gdb stm32 clion gdbserver

我通过GDB Monitor commands in CLion阅读提供了很好的见解,但我的问题略有不同:

我的环境:

  • 目标:ARM Cortex M4(STM32F401RE)
  • ST-UTIL gdb服务器(https://github.com/texane/stlink
  • arm-none-eabi-gdb 7.7.1 + dfsg-5 + 8~bpo8 + 1
  • CLion 2016.3.2 Build#CL-163.10154.43
  • Debian 8

在GDB Remote Debug配置面板中,我设置了:

GDB:         /usr/bin/arm-none-eabi-gdb
Symbol file: /home/malachi/temp/mbed_test/mbed-os-program/BUILD/NUCLEO_F401RE/GCC_ARM/mbed-os-program.elf

来自CLion,无论我做什么,我都会一直为控制台获取此信息:

Cannot configure GDB defaults: No symbol table is loaded.  Use the "file" command.
Debugger connected to localhost:4242

我尝试使用.gdbinit强制'文件',但gdbinit似乎被忽略了

此外,它 表示与远程运行的st-util的连接,但我无法执行任何命令(断点,步进,暂停等)除外终止 - 似乎终止它。

如果我直接从命令行使用arm-none-eabi-gdb(/usr/bin/arm-none-eabi-gdb已验证),则可以正常工作,断点,步进等。另外.elf符号直接从命令行加载。

最后,如果我使用GDB: Default (Bundled)的配置,我不希望它运作良好,但它实际上进一步发展并允许暂停/恢复的功能非常有限(但绝对没有其他能力)并且不要抱怨符号

2 个答案:

答案 0 :(得分:3)

我有类似的设置(除了CLion),我可以通过STM32F4DISCOVERY(其上有ST-LINK v2)调试我的STM32板。也许如果你按照我的指示,也会为你效劳。

首先,在构建固件时向GCC提供下一个标志:

# Debug flags
CFLAGS  += -Os -g -fno-schedule-insns -fno-schedule-insns2

# Backtrace support
CFLAGS  += -fno-omit-frame-pointer -funwind-tables
CFLAGS  += -mapcs -mno-sched-prolog
LDFLAGS += -mapcs -mno-sched-prolog

使用下一个脚本启动GDB服务器。当然,必须安装st-util,因为该脚本使用它。

#!/bin/sh

CROSS_COMPILE=arm-none-eabi-
GDB=${CROSS_COMPILE}gdb

if [ $# -ne 1 ]; then
    echo "Please provide elf-file for debug symbols" >&2
    exit 1
fi

elf_file="$1"

echo '---> Starting GDB server...'
if [ -f gdb.pid ]; then
    kill -9 $(cat gdb.pid)
    rm -f gdb.pid
fi
st-util & echo $! >gdb.pid

echo '---> Starting GDB...'
$GDB -ex "target extended localhost:4242" $elf_file
kill -9 $(cat gdb.pid)
rm -f gdb.pid

将其另存为gdb.sh并按此操作(一旦开启电路板):

$ ./gdb.sh your-firmware.elf

您会看到(gdb)提示。现在您可以使用常用的GDB命令进行调试。就我而言,GDB向我展示(开始时):

GDB connected.

reset_handler () at ../../cm3/vector.c:68
68      for (src = &_data_loadaddr, dest = &_data;

所以我通常会这样做:

(gdb) break main
(gdb) continue
(gdb) list

然后使用常用的调试命令,例如stepnextprint varbt等。一切都按预期工作。

还应该提到我在我的固件中使用libopencm3,因此它也可能对操作成功产生一些影响。我建议你从libopencm3-examples(如this one)构建并刷新一些简单的例子,并尝试用GDB调试它。如果它有效,并且您的代码不能与GDB一起使用,那么您可以轻松查找差异并找到问题。

参考

[1] Debugging details

[2] Using ST-LINK with st-util

答案 1 :(得分:0)

升级到CLion 2016.3.3解决了这个问题。

我遇到了一些间歇性的减速/连接问题,但我无法确定这是一个CLion的事情。

感谢Sam Protsenko和Eldar Abusalimov的帮助。