GDBSERVER 在启动时退出

Posted

技术标签:

【中文标题】GDBSERVER 在启动时退出【英文标题】:GDBSERVER exits on start-up 【发布时间】:2012-08-31 21:45:03 【问题描述】:

我正在尝试在 android (Java/C/C++) 上调试混合代码。我的目标设备是 Vizio 1008。代码在模拟器上运行,我可以使用 GDB 从 Eclipse 调试它。但是,我无法在真实设备上执行此操作。

经过几天的努力,我解决了这个问题:

当 GDBSERVER 在设备上启动(成功)时,它会立即退出并显示以下消息: “请求的未知寄存器 d0”。因此,不可能进行调试会话。我还尝试了 ARM 的 DS-5 调试器。 GDBSERVER 保持连接状态,但在远程调试器尝试连接时退出。我尝试了 GDBSERVER 调试输出,但它没有提供任何有用的信息。

更奇怪的是,我尝试了任何我能得到的 GDBSERVER 版本,它们的行为都是这样的。但是,我从 Google NDK 的旧版本之一(3 或 4 个版本)中找到了 GDBSERVER。这个版本可以工作!!!但是,调试器(在主机上)很快就死掉了(分段错误),即使我知道程序没问题。

我查看了 GDBSERVER 源代码,看起来,这个错误与 GDBSERVER 检查硬件时的启动顺序有关。可能,它与浮点协处理器有关,但我不确定,因为此错误消息非常笼统。

如果重要的话,我正在使用 Google NDK 在 Windows 上进行开发。代码是 99% 的 C/C++,带有 Java shell 和一些用 Java 实现的函数(线程 HTTP 调用)。同样,应用程序可以在设备上运行,并且可以在模拟器上进行调试(Java 和 C/C++)。我还可以在设备上调试 Java 部分。

有人知道它可能是什么吗?以及如何解决这个问题?是 Vizio 吗?

提前谢谢你。

【问题讨论】:

【参考方案1】:

听起来类似于我在尝试进行本机调试时遇到的问题。问题是设备中使用的 arm 处理器同时支持 vfp/neon 指令集和 iwmmx 指令集,并且 gdbserver 显然假设这两者是互斥的。 不幸的是,要修复你需要弄乱 gdbserver 源。以下是来自link 的修复。您需要在 gdbserver 源代码树中编辑文件 linux-arm-low.c:

static void
arm_arch_setup (void)

  arm_hwcap = 0;
  if (arm_get_hwcap (&arm_hwcap) == 0)
  
    init_registers_arm ();
    return;
  

/* gdbserver assumes that only one of VFP or IWMMXT is available, which may
 not be true.  In that case, gdbserver fails at run-time with "Unknown
 register d0 requested".  For now, pretend IWMMXT is missing when both are
 available. */
if ((arm_hwcap & HWCAP_VFP) && (arm_hwcap & HWCAP_IWMMXT))
  arm_hwcap &= ~HWCAP_IWMMXT;

您必须更改代码的确切位置取决于 gdb(server) 版本。我知道在 gdb 7.7 的情况下它略有不同。以这种方式更改后,您应该使用 ndk 中的 gcc 构建它,因此它与仿生和其他东西相关联。我没有确切的说明,因为我自己没有这样做。 我应该强调的是,这最终更像是一种解决方法,而不是适当的修复。我不知道以这种方式修补的 gdbserver 在运行实际包含 iwmmx 指令的代码时如何表现。至少您可能无法获得 iwmmx 寄存器的寄存器转储。

【讨论】:

以上是关于GDBSERVER 在启动时退出的主要内容,如果未能解决你的问题,请参考以下文章

使用gdbserver从clion调试jni库

在 Qt Creator 中使用 GDB 时如何终止 gdbserver?

使用gdb+gdbserver调试应用程序

使用 Eclipse 远程调试 gdbserver

core dumped问题查找以及使用gdbQT下gdbserver使用

gdbserver无法中断“SOME”进程,gdbserver调用kill(pid,2)没有发送SIGINT进程,发生了什么事?