我正在尝试在Android(Java / C / C ++)上调试混合代码。我的目标设备是Vizio1008。代码在模拟器上运行,我可以使用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部分。

有人知道这可能是什么吗?以及如何解决?是维齐奥吗?

先感谢您。

最佳答案

听起来类似于我在尝试进行本机调试时遇到的问题。问题在于设备中使用的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来构建它,这样它就可以与仿生和东西联系起来。我没有确切的说明,因为我自己没有这样做。
我应该强调,这最终是一种替代方法,而不是适当的修复方法。我不知道运行实际包含iwmmx指令的代码时,gdbserver如何通过这种方式打补丁。至少您可能无法获得iwmmx寄存器的寄存器转储。

10-07 16:31