5

Android のメディア バックエンド (主に Stagefrightplayer) で問題が発生しました。エラーがスローされる理由を理解したいと思います。通常、エラーはデバイス固有であるため、エミュレーターでのデバッグでは不十分です。

例:

I/AwesomePlayer(  147): mConnectingDataSource->connect() returned -1004
V/MediaPlayerService(  147): [332] notify (0x272830, 100, 1, -1004)
E/MediaPlayer(24881): error (1, -1004)
E/MediaPlayer(24881): Error (1,-1004)
W/PlayerListener(24881): Received error: what = 1, extra = -1004

例 2:

E/MediaPlayer(  941): error (1, -2147483648)

また、プレーヤーを完全に中断させて traces.txt を吐き出させました。

Javaコードをデバッグするのと同じように、何が起こっているのかをデバッグする方法はありますか? ありがとう。

4

7 に答える 7

9

できることはたくさんあります。

エラーがフレームワーク自体にあると思われる場合は、ソースを入手してhttp://source.android.com/を調べてください。

それ以外の場合、Android に最適なデバッガーは DDMS です。エミュレーターだけでなく、実際のデバイスでも動作します。http://developer.android.com/guide/developing/tools/ddms.html

adb ( http://developer.android.com/guide/developing/tools/adb.html ) を介した dumpstate も、デバイスで何が起こっているかの完全なスナップショットを提供しますが、正確なポイントを取得することは困難です。エラーが発生したとき。

それでもGDBのようにソースレベルのデバッグはできません(または、Javaコードをデバッグする通常の方法が何を意味するのかわかりません)。

カーネルをカーネルとして本当に意味するなら、あなたはもはや Android ではなく Linux の世界にいますが、そこまで行く必要はないと思います。

特定の Android アプリケーション (オープン ソースではなく、自分のものではない) で問題が発生した場合は、運が悪いと思います。

MediaPlayer 部分の場合、Eclair のファイルは https://android.googlesource.com/platform/frameworks/base/+/eclair-release/media/java/android/media/MediaPlayer.javaにありますが、あなたがそこに置いた特定のエラーメッセージ。

于 2010-11-01T18:06:37.073 に答える
2

リモート デバッグ (ターゲット上の gdbserver + ホスト上の gdb) を使用して、実際のハードウェアで実行されている C/C++ ユーザーランド コードをステップスルーできます。ブレークポイント、バックトレース、ビュー/セット変数、トレースポイントなど、すべての「通常の」オプションを提供します。

詳細については、Android ビルド システムの「gdbclient」シェル関数を参照し、eabi gdb を事前にビルドし、DDD または別のフロントエンドを使用することもできます。エクリプスは大丈夫なはずです。

于 2011-07-07T18:46:21.390 に答える
2

これがあなたの質問に直接答えるわけではありませんが、この情報はあなたにとって役立つかもしれません.

-1004 エラー コードに基づいて、ストリーミングしようとして I/O エラーが発生しました。-2147483648 エラー コードに関する限り、あまり役に立ちません。メディア プレーヤーからのすべてのログ出力を調べて、コードが定義されていないためにそのコードを取得している理由を確認する必要があります。ビデオエンコーディングでデコーダーがチョークするのを見てきました。

借用元: /frameworks/base/include/media/stagefright/MediaErrors.h

MEDIA_ERROR_BASE = -1000、

ERROR_ALREADY_CONNECTED = MEDIA_ERROR_BASE,
ERROR_NOT_CONNECTED     = MEDIA_ERROR_BASE - 1,
ERROR_UNKNOWN_HOST      = MEDIA_ERROR_BASE - 2,
ERROR_CANNOT_CONNECT    = MEDIA_ERROR_BASE - 3,
ERROR_IO                = MEDIA_ERROR_BASE - 4,
ERROR_CONNECTION_LOST   = MEDIA_ERROR_BASE - 5,
ERROR_MALFORMED         = MEDIA_ERROR_BASE - 7,
ERROR_OUT_OF_RANGE      = MEDIA_ERROR_BASE - 8,
ERROR_BUFFER_TOO_SMALL  = MEDIA_ERROR_BASE - 9,
ERROR_UNSUPPORTED       = MEDIA_ERROR_BASE - 10,
ERROR_END_OF_STREAM     = MEDIA_ERROR_BASE - 11,
于 2011-03-04T19:40:23.413 に答える
2

カーネル レベルでデバッグできない場合でも、不可解なエラー番号を正しいヘッダー ファイル (および記述的な定義) まで追跡することは依然として有用です。

-1004 は、https://android.googlesource.com/platform/frameworks/base/+/eclair-release/include/media/stagefright/MediaErrors.h#32 を意味ERROR_IOし、MediaErrors.hの場所にあります。

-2147483648 はおそらく次UNKNOWN_ERRORの場所にありますErrors.h:
https://android.googlesource.com/platform/frameworks/base/+/eclair-release/include/utils/Errors.h#49

に示すように、カーネル レベルのエラー コード /kernel/include/asm-generic/errno.h が含まErrors.hれています。errno.h

たとえば、connect() がエラー コード -110 を返す場合、次のように定義されているため、タイムアウトが原因であることがわかります。

#define ETIMEDOUT       110     /* Connection timed out */
于 2011-07-04T14:20:57.690 に答える
1

Android はリモート GDB セッションをサポートしていますが、これはおそらくカーネル サイド コードでは機能しません。最善の策は、ストップ モード デバッグの実行に使用できるJTAG接続を使用することです。ストップ モード デバッグは CPU の実行を効果的に停止するため、ウォッチドッグ タイマーで問題が発生する場合があります。

または、カーネル コードにトレースを挿入する方が簡単な場合があります。

于 2010-09-10T13:37:49.240 に答える
0

アセンブリ レベルでデバッグする場合を除き、おそらく、デバッグ + デバッグ シンボルを有効にしてカーネルを自分でビルドする必要があります。小さなデバイスのほとんどのカーネルは、デフォルトでそれを避けると思います。カーネルがはるかに大きくなるためです。その時点で、カーネルデバッガーを有効にすることができます...

于 2010-11-02T18:39:52.787 に答える