2

Android(Java / C / C ++)で混合コードをデバッグしようとしています。私のターゲットデバイスはVizio1008です。コードはエミュレーターで実行され、GDBを使用してEclipseからデバッグできます。ただし、実際のデバイスではこれを行うことはできません。

これに何日も苦労した後、私は問題を特定しました:

GDBSERVERがデバイスで(正常に)起動すると、「不明なレジスタd0が要求されました」というメッセージが表示されてすぐに終了します。したがって、デバッグセッションはできません。ARMのDS-5デバッガも試してみました。GDBSERVERは接続されたままですが、リモートデバッガーからの接続試行で終了します。GDBSERVERデバッグ出力を試しましたが、有用な情報が提供されません。

さらに奇妙なことに、入手できるGDBSERVERのバージョンを試してみたところ、すべてがこのように動作しました。ただし、古いバージョンのGoogle NDK(3または4バージョン前)の1つからGDBSERVERを見つけました。そして、このバージョンは機能します!!! しかし、プログラムがOKであることを私が知っていても、(ホスト上の)デバッガーはすぐに停止します(セグメンテーション違反)。

GDBSERVERのソースコードを調べたところ、このエラーは、GDBSERVERがハードウェアを検査するときの起動シーケンスに関連しているように見えます。おそらく、浮動小数点コプロセッサに関連していますが、このエラーメッセージはかなり一般的であるため、わかりません。

重要な場合は、GoogleNDKを使用してWindowsで開発しています。コードは99%C / C ++で、Javaシェルといくつかの関数がJavaで実装されています(スレッド化されたHTTP呼び出し)。この場合も、アプリケーションはデバイス上で動作し、エミュレーター上でデバッグできます(JavaとC / C ++の両方)。デバイスでJava部分をデバッグすることもできます。

誰かがそれが何であるかを知っていますか?そしてそれを修正する方法は?ビジオですか?

前もって感謝します。

4

1 に答える 1

2

ネイティブデバッグをしようとして遭遇した問題に似ています。問題は、デバイスで使用されているアーム プロセッサが vfp/neon 命令セットと iwmmx 命令セットの両方をサポートしていたことで、gdbserver はこの 2 つが相互に排他的であると想定しているようです。修正するには、残念ながら gdbserver ソースをいじる必要があります。以下はリンクからの修正です。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 レジスタのレジスタ ダンプを取得することはおそらくできないでしょう。

于 2014-04-17T22:10:57.487 に答える