我在Android中的媒体后端(主要是StageFrayplayer)遇到了一些麻烦,我想了解为什么它会引发它的错误。这些错误通常是设备Spesific,因此在模拟器上调试是不够的。

例子:

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)

我还得到了播放器的bork,并吐出traces.txt。

有没有办法调试发生的事情,就像我调试Java代码一样?谢谢。

有帮助吗?

解决方案

您可以做很多事情。

如果您认为错误在框架本身中,请获取源并挖掘 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)还将为您提供设备上发生的事情的完整快照,但是当发生错误时,您将很难获得确切的点。

尽管这仍然不会像GDB那样给您源级别的调试(或者我不确定您通常通过调试Java代码的方法是什么意思)。

如果您真的将内核作为内核,那么您不再真正进入Android,而是在Linux World中,但我认为您不需要走那么远。

如果您在特定的Android应用程序上遇到了麻烦(这是不含开源的,不是您自己的),恐怕您不幸。

对于媒体播放器部分,Eclair的文件位于https://android.googlesource.com/platform/frameworks/base/+/eclair-release/media/java/java/android/media/mediaplayer.java, ,但找不到您输入的特定错误消息。

其他提示

并不是直接回答您的问题,但是此信息可能对您有用。

因此,基于您的-1004错误代码,您有一个I/O错误试图流式传输。至于-2147483648错误代码,无法为您提供太大帮助。您将必须查看媒体播放器的所有日志输出,以了解为什么您会获得该代码,因为它没有定义。我从视频编码上将解码器的choke放置了。

从:/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,

远程调试(target+ GDB上的GDBSERVER在主机上)可用于在实际硬件上运行的C/C ++用户领域代码。它提供了所有“常规”选项,例如断点,回溯,查看/设置变量,跟踪点。

有关详细信息,请查看Android Build System,Pre-Build EABI GDB的“ GDBClient”外壳功能,也许是DDD或其他前端。日食应该可以。

即使您无法在内核级别进行调试,也仍然可以将隐秘错误编号跟踪到正确的标头文件(和描述性定义)仍然很有用。

-1004表示 ERROR_IO 可以找到 MediaErrors.h:
https://android.googlesource.com/platform/frameworks/base/+/eclair-release/include/media/stagefright/mediaerrors.h#32

-2147483648可能是 UNKNOWN_ERROR 可以在 Errors.h:
https://android.googlesource.com/platform/frameworks/base/+/eclair-release/include/include/utils/errors.h#49

如您所见 Errors.h, , 这包括 errno.h 其中包括内核级别错误代码,/kernel/include/asm-generic/errno.h。

例如,如果connect()返回错误代码-110您会知道这是因为超时,因为它被定义为:

#define ETIMEDOUT       110     /* Connection timed out */

尽管Android确实支持远程GDB会话,但这可能对内核侧代码不起作用。最好的选择是使用 JTAG 可用于执行停止模式调试的连接。由于停止模式调试有效停止执行您的CPU,因此您可能会发现这会导致看门狗计时器的问题。

另外,将跟踪插入内核代码可能会更容易。

您可以以几种不同的方式进行此操作。首先,您需要找出要调试的服务是在Java Framework服务中,例如System_server或SurfaceFlinger(例如SurfaceFlinger)。

如果是纯粹的本地服务,请检查 调试Android平台本机应用程序 文章。

如果服务是java代码在system_server流程中托管的,请检查 调试Android Java框架服务 文章。

如果您要调试的代码是由JAVA服务通过JNI隐式加载的本地库,请检查 调试Android框架本地库 文章。

除非您想在集会级别进行调试,否则您可能必须通过启用调试 +调试符号来构建内核。我认为,默认情况下,大多数小设备中的大多数内核都会避免这样做,因为它会使内核更大。那时您可以启用内核调试器...

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top