arm-none-eabi-gdb 和 openocd:对偏移量查询、qOffsets 的错误响应?

Posted

技术标签:

【中文标题】arm-none-eabi-gdb 和 openocd:对偏移量查询、qOffsets 的错误响应?【英文标题】:arm-none-eabi-gdb and openocd: Malformed response to offset query, qOffsets? 【发布时间】:2011-10-26 13:17:30 【问题描述】:

我正在尝试使用 GDB 使用 OpenOCD 和 GNU ARM 工具链(随 MacPorts 安装)调试 Stellaris LM3S8962 评估板,每当我在 GDB 中设置远程目标时,它总是返回“Malfomred 对偏移查询的响应,qOffsets”。关于可能出现问题的任何想法?我有什么遗漏的吗?

[bcochran@narada arm]$ arm-none-eabi-gdb
GNU gdb (GDB) 7.3
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "--host=x86_64-apple-darwin10.7.0 --target=arm-none-eabi".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
(gdb) set remotebaud 115200
(gdb) set debug remote 1
(gdb) file ~/dev/eclipse_workspace/hello_world_arm/bin/main.axf
Reading symbols from /Users/bcochran/dev/eclipse_workspace/hello_world_arm/bin/main.axf...(no debugging symbols found)...done.
(gdb) target remote localhost:4444
Remote debugging using localhost:4444
Sending packet: $qSupported:qRelocInsn+#9a...putpkt: Junk: ~Open On
Nak
Sending packet: $qSupported:qRelocInsn+#9a...putpkt: Junk: Chip Debugger
> 
Ack
Packet received: qSupported:qRelocInsn+
Packet qSupported (supported-packets) is supported
...
Packet qAttached (query-attached) is supported
Sending packet: $qOffsets#4b...Ack
Packet received: qOffsets
Malformed response to offset query, qOffsets

这是 openocd 输出...一旦遇到格式错误的响应,openocd 就会断开 telnet 连接...

[bcochran@narada bin]$ openocd -f ../openocd/luminary.cfg -f ../openocd/stellaris.cfg
Open On-Chip Debugger 0.6.0-dev-00014-g827057f (2011-08-09-22:02)
Licensed under GNU GPL v2
For bug reports, read
    http://openocd.berlios.de/doc/doxygen/bugs.html
Info : only one transport option; autoselect 'jtag'
500 kHz
Info : clock speed 500 kHz
Info : JTAG tap: lm3s.cpu tap/device found: 0x3ba00477 (mfg: 0x23b, part: 0xba00, ver: 0x3)
Info : lm3s.cpu: hardware has 6 breakpoints, 4 watchpoints
Info : accepting 'telnet' connection from 4444
Error: error during read: Connection reset by peer
Info : dropped 'telnet' connection

这是我的 arm-none-eabi-* 工具链的版本输出...

[bcochran@narada tcl]$ arm-none-eabi-gcc -v
Using built-in specs.
COLLECT_GCC=arm-none-eabi-gcc
COLLECT_LTO_WRAPPER=/opt/local/libexec/gcc/arm-none-eabi/4.6.1/lto-wrapper
Target: arm-none-eabi
Configured with: ../gcc-4.6.1/configure --prefix=/opt/local --target=arm-none-eabi --enable-languages=c,objc,c++,obj-c++ --infodir=/opt/local/share/info --mandir=/opt/local/share/man --datarootdir=/opt/local/share/arm-none-eabi-gcc --with-system-zlib --disable-nls --with-gmp=/opt/local --with-mpfr=/opt/local --with-mpc=/opt/local --enable-stage1-checking --enable-multilib --with-newlib --enable-interwork
Thread model: single
gcc version 4.6.1 (GCC)

[bcochran@narada tcl]$ arm-none-eabi-gdb -v
GNU gdb (GDB) 7.3
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "--host=x86_64-apple-darwin10.7.0 --target=arm-none-eabi".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.

我能够使用工具链进行编译,并使用 OpenOCD 刷新生成的 .bin 文件。我一直无法通过搜索网络找到“格式错误的响应”问题的解决方案。

提前感谢您的任何建议或帮助!

更新

感谢 @turbo-j 和 @guy-sirton 的回答,我能够更进一步......到目前为止最有帮助的是我确实使用了错误的端口(4444 而不是 3333)但现在无论是否将 -c "init" -c "halt" -c "reset halt" 添加到我的 openocd 命令字符串,我都会收到以下信息:

(gdb) target remote localhost:3333
Remote debugging using localhost:3333
Remote 'g' packet reply is too long:     0080004000000000040000220f0000002833405451332abc009600a4d2b86092c0c118c03040d6f0284dbb93204b40c2000000000c010020ffffffff550400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000001

(这是在 qOffsets req/resp 之后,现在通过了)

在 OpenOCD 方面:

Info : accepting 'gdb' connection from 3333
Warn : acknowledgment received, but no packet pending
Info : dropped 'gdb' connection

OpenOCD 控制台上有时会出现undefined debug reason 6 - target needs reset...不确定现在发生了什么,但它似乎更接近正常运行

更新 2

如果我不加载文件“main.axf”或“main.o”,我似乎不会遇到Remote 'g' packet reply is too long,但我没有收到任何符号...我注意到其他网站主要处理.elf 扩展名。有什么区别?我正在使用来自 StellarisWare 的“Hello World”示例,它通过make 命令生成 main.axf、main.bin(闪存写入和运行良好)、main.d、main.o。我的 Makefile 有什么奇怪的地方吗?

【问题讨论】:

好问题。 Makefile 长什么样子? Gist of Makefile and makedefs 我将把这个问题标记为已解决,再进行一次调试,并针对当前问题(如果仍然存在)制定一个更清晰的问题。感谢所有帮助! 【参考方案1】:

这是一个类似于@athquad 提到的补丁。有关更多信息,请参阅他的答案。感谢他有效地将我指向正确的位置,并且非常遗憾地提供了补丁但没有提供它。 :-P

http://pastebin.com/rdFF2eZd

针对 openocd 提交 631b80fd0835055bb385314f569f589b99d7441d 制作了补丁

使用方法:(./configure 选项取决于 jtag 硬件)

git clone git://git.code.sf.net/p/openocd/code openocd
cd openocd
patch -p1 < /path/to/patch/file
./bootstrap
./configure --enable-maintainer-mode --enable-ft2232_libftdi
nice make && sudo make install

【讨论】:

哇。实际工作!这对我来说是黑魔法,但帽子提示。干杯!【参考方案2】:

您使用了错误的端口。使用 target remote localhost 3333 进行 GDB 到 OpenOCD 的连接。端口 4444 旨在通过终端进行人机交互,并且可以与 GDB 连接一起使用。

【讨论】:

感谢@turbo-j,这帮助我克服了一个障碍,但我似乎仍然有一个并发症(附加到原始问题)......有什么想法吗? 只有.bin 文件进入闪存AFAIK。 用 openocd rlink 和 STM32F4 解决了我的问题【参考方案3】:

如果您不想编译 OpenOCD,作为 tacos 和 atquad 的回答,您可以使用较旧版本的 GNU ARM 工具链(例如 7.2.5 很好)。 (预编译的 0.4.0 和 0.5.0 windows 都出现了这个问题)。

【讨论】:

【参考方案4】:

我刚刚遇到了同样的“'g'数据包回复太长”的错误并追踪它的原因。

似乎很长一段时间以来,GNU ARM 工具一直在使用具有 9 个过时浮点寄存器的 ARM 模型。 OpenOCD 对此很明智,并响应 GDB 的寄存器请求提供虚拟值。但是,包括 GDB 在内的最新 eabi 工具链已经更新,因此您的 GDB 不再需要这些寄存器 - 因此会出现消息。

在 OpenOCD 源代码中,我在 armv7m.c 中修补了 armv7m_get_gdb_reg_list() 以使其工作,但我的补丁不够聪明,无法知道正在使用哪个 GDB 版本 - 它只是使用 #ifdef 开关 - 所以它会需要更多的工作来与 OpenOCD 源代码集成。

任何人都可以使用补丁。

【讨论】:

我很感兴趣 :) 从来没有完全弄清楚那个。【参考方案5】:

我在 ARM 上进行了很多远程调试,但使用不同的处理器、操作系统和工具链 :-) 不过,这里有一些想法。

这个建议:

openocd -f openocd.cfg -c "init" -c "halt" -c "reset halt"

来自这里: http://michaldemin.wordpress.com/2010/02/22/part-2-debugging-with-gdb-and-openocd/

否则:

远程和您的 gdb 之间的远程 gdb 协议不匹配。您可以尝试使用不同版本的工具链。谷歌并找到对其他人有用的方法。

通信问题。尝试降低波特率?确保串口参数正确。

【讨论】:

谢谢@guy-sirton,我会记住-c "reset halt",那篇文章说Cortex M3需要它,这就是我所拥有的......

以上是关于arm-none-eabi-gdb 和 openocd:对偏移量查询、qOffsets 的错误响应?的主要内容,如果未能解决你的问题,请参考以下文章

Golang 之 文件

CLion 中的 GDB Monitor 命令

离线 Javascript Ran 自动更新计算器和电子表格

POJ 2965 The Pilots Brothers' refrigerator

Android Database(SQLite)参数绑定问题初探

Oracle,如何打开游标并将其中的一列选择为变量