GDBSERVER在启动时退出

时间:2012-09-07 02:06:22

标签: android android-ndk remote-debugging gdbserver

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

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

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

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

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

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

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

提前谢谢。

1 个答案:

答案 0 :(得分:2)

听起来类似于我尝试进行本机调试时遇到的问题。问题是设备中使用的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(服务器)版本。我知道在gdb 7.7的情况下它略有不同。你以这种方式改变之后你应该用ndk中的gcc构建它,所以它与仿生和东西相关联。我没有确切的指示,因为我自己没有这样做。 我应该强调,这最终更像是一种解决方法而不是正确的解决方法。我不知道gdbserver如何修补这种方式在运行实际包含iwmmx指令的代码时的行为。至少你可能无法获得iwmmx寄存器的寄存器转储。