代码之家  ›  专栏  ›  技术社区  ›  neu242

如何在真实设备上调试Android本机代码

  •  5
  • neu242  · 技术社区  · 14 年前

    我在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
    

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

    我还让球员彻底地抽搐,吐出了一句话痕迹.txt.

    有没有一种方法可以调试正在发生的事情,就像我调试Java代码一样?谢谢。

    7 回复  |  直到 13 年前
        1
  •  9
  •   Vadim Kotov First Zero    7 年前

    如果您认为错误在框架本身,那么获取源代码并进行挖掘 http://source.android.com/

    http://developer.android.com/guide/developing/tools/ddms.html

    通过adb转储状态( http://developer.android.com/guide/developing/tools/adb.html )它还将为您提供设备上正在发生的事情的完整快照,但您很难获得错误发生时的确切点。

    如果你真的把内核当作内核,那么你就不再是真正的安卓系统了,而是Linux世界,但我认为你不需要走那么远。

    如果你在使用一个特定的Android应用程序时遇到了问题(这个应用程序是开源的,不是你自己的),恐怕你就走运了。

    对于MediaPlayer部分,Eclair的文件位于 https://android.googlesource.com/platform/frameworks/base/+/eclair-release/media/java/android/media/MediaPlayer.java ,但找不到放在那里的特定错误消息。

        2
  •  2
  •   stewbv    13 年前

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

    因此,根据您的-1004错误代码,您在尝试流式传输时出现了I/O错误。至于-2147483648的错误代码,帮不了你多少。您必须查看媒体播放器的所有日志输出,以了解为什么会得到这些代码,因为它没有定义。我从解码器对视频编码的干扰中看到的。

    媒体错误基数=-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,
    
        3
  •  2
  •   vf_    13 年前

    在实际硬件上运行C/C++用户代码。 它提供了所有“常用”选项,如断点、回溯、查看/设置变量、跟踪点。

    预建eabi gdb和DDD或其他前端。Eclipse应该可以。

        4
  •  2
  •   Vadim Kotov First Zero    7 年前

    -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/utils/Errors.h#49

    正如你在书中看到的 错误.h ,它包括 errno.h

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

    #define ETIMEDOUT       110     /* Connection timed out */
    
        5
  •  1
  •   doron    14 年前

    尽管Android确实支持远程GDB会话,但这可能不适用于内核端代码。你最好的办法是使用 JTAG 可用于执行停止模式调试的连接。由于停止模式调试有效地停止了CPU的执行,您可能会发现这会导致看门狗计时器出现问题。

        6
  •  1
  •   videoguy    10 年前

    你可以用几种不同的方法来做。首先,您需要找出要调试的服务是在Java框架服务(如system\u server)中,还是在纯本机应用程序(如surfaceflinger)中。

    如果是纯本机服务,请检查 Debugging android platform native applications 文章。

    如果服务是在system\ server进程中托管的Java代码,请检查 Debugging Android Java framework services

    如果要调试的代码是Java服务通过JNI隐式加载的本机库,请检查 Debugging Android framework native libraries

        7
  •  0
  •   JimR    14 年前