GDB远程调试:无法停止线程
Posted
技术标签:
【中文标题】GDB远程调试:无法停止线程【英文标题】:GDB remote debug: can't stop the thread 【发布时间】:2014-08-31 10:25:14 【问题描述】:我在一个目标上有一个 gdbserver,我像 gdbserver :2345 /bin/ls
一样启动它。接下来我从主机连接一个 gdb,并尝试发出下一个命令:
(gdb) target remote 192.168.1.2:2345
Remote debugging using 192.168.1.2:2345
warning: Architecture rejected target-supplied description
[New Thread 686]
(gdb) Remote 'g' packet reply is too long: 00000000c10ed6be0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d00dd6be0000000030fe0d40100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
(gdb) i thr
Id Target Id Frame
* 1 Thread 686 (running)
(gdb) interrupt
(gdb) interrupt 1
(gdb) interrupt 2
(gdb) i thr
Id Target Id Frame
* 1 Thread 686 (running)
(gdb) bt
Target is executing.
(gdb) c
Continuing.
Cannot execute this command while the selected thread is running.
我认为可能是 gdb 损坏的原因是奇怪的消息,试图谷歌。发现了两个假设。 Here's a man 假设 gdb(尽管恕我直言,目标上正在运行应该发送抽象独立于架构的命令的 gdbserver)需要它正在调试的架构被设置。但它不起作用:
(gdb) set architecture armv7-a
Undefined item: "armv7-a".
(gdb) set architecture armv7
Undefined item: "armv7".
(gdb) set architecture armv5te
Undefined item: "armv5te".
我没有找到任何可以列出支持的架构的命令。 second assumption 是 gdbserver 本身需要配置一个神话选项--with-expat
。但是……configure: WARNING: unrecognized options: --with-expat
我没有更多的想法。那么,有谁知道:如何中断目标上的线程?(顺便说一句,断点可以设置得很好,但它根本没有帮助,因为似乎 gdb 正在运行线程。如果线程会运行中,被调试的ls
马上就消失了。)
【问题讨论】:
你的主机上运行的是什么版本的 GDB? @dbrank0,GNU gdb (GDB) 7.6.1-ubuntu
.
所以它是用于您的主机 PC 的 gdb。您需要为您的目标进行适当的构建。你应该用你的工具链得到它,但如果没有,从源代码构建并不难(参见sourceware.org/gdb/wiki/BuildingCrossGDBandGDBserver)。
@dbrank0 那么,这是否意味着 gdb 和 gdbserver 应该是相同的版本?或者为什么我也需要构建 gdb?现在目标的 gdbserver 是从源构建的,而主机上的 gdb 是来自 Ubuntu 存储库的。
是的,虽然可以构建“多架构”gdb,但默认的 Ubuntu gdb(仅称为 gdb)是为支持单一架构 - 主机 PC 而构建的。您需要可以调试 ARM 并且与目标上使用的 ABI 兼容的 gdb。
【参考方案1】:
虽然可以构建“多架构”gdb,但默认的 Ubuntu GDB(称为 gdb)是为支持单一架构 - 主机 PC 而构建的。尽管它确实连接到任何 gdbserver,但您无法使用它调试其他 CPU。
您需要可以调试目标 (ARM) 并且与目标上使用的 ABI 兼容的 gdb。
您应该使用您的工具链来获得它,但如果没有,从源代码构建并不难。有关简要说明,请参阅 sourceware.org/gdb/wiki/BuildingCrossGDBandGDBserver。
【讨论】:
【参考方案2】:为了检查您的 GDB 当前支持哪种架构(您可以在 set architecture
命令中拥有这些架构),只需输入:
(gdb) set architecture
没有任何参数...就这么简单。 否则,您可能需要一个跨 GDB,如 @drbank0 所述。
【讨论】:
是的,远程 gdb 只支持特定架构有点不合理——因为所有与机器相关的命令都由 gdbserver 执行,而不是 gdb 本身。以上是关于GDB远程调试:无法停止线程的主要内容,如果未能解决你的问题,请参考以下文章
无法从 Visual Studio 启动 gdb 以在 Windows 上的 Linux 子系统中远程调试 Linux C++ 项目