簡體   English   中英

如何在真實設備上調試Android本機代碼

[英]How to debug Android native code on a real device

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

我也讓玩家完全開玩笑並吐出了痕跡.txt。

有沒有辦法調試正在發生的事情,就像我調試Java代碼一樣? 謝謝。

你可以做很多事情。

如果你認為錯誤是在框架本身,那么獲取源代碼並挖掘http://source.android.com/

否則,Android的最佳調試器是DDMS,它可以與仿真器一起使用,也可以與真實設備一起使用。 http://developer.android.com/guide/developing/tools/ddms.html

dumpstate通過adb( http://developer.android.com/guide/developing/tools/adb.html )也會為您提供設備上發生的事情的完整快照,但是您很難獲得准確的點當錯誤發生時。

雖然這仍然不會像GDB那樣為您提供源代碼級調試(或者我不確定您通常的調試Java代碼的方式是什么意思)。

如果你真的把內核稱為內核,那么你不再是Android了,而是更多的Linux世界,但我不認為你需要走得那么遠。

如果您在使用特定的Android應用程序時遇到問題(這不是您自己的應用程序),我擔心您運氣不好。

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

這不是直接回答您的問題,但這些信息可能對您有用。

因此,根據您的-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,

即使您無法在內核級別進行調試,將隱藏的錯誤號跟蹤到正確的頭文件(以及描述性定義)仍然很有用。

-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

正如您在Errors.h中看到的Errors.h ,它包含errno.h ,其中包含內核級錯誤代碼/kernel/include/asm-generic/errno.h。

例如,如果connect()返回錯誤代碼-110,您將知道它是因為超時,因為它被定義為:

#define ETIMEDOUT       110     /* Connection timed out */

遠程調試(目標上的gdbserver +主機上的gdb)可用於逐步執行在真實硬件上運行的C / C ++用戶態代碼。 它提供所有“常用”選項,如斷點,回溯,視圖/設置變量,跟蹤點。

有關詳細信息,請查看Android構建系統的'gdbclient'shell函數,預構建eabi gdb以及DDD或其他前端。 Eclipse應該沒問題。

您可以通過幾種不同的方式完成此操作。 首先,您需要找到要調試的服務,如Java框架服務,如system_server或純本機應用程序,如surfaceflinger。

如果是純本機服務,請查看調試android平台本機應用程序文章。

如果服務是在system_server進程中托管的Java代碼,請查看調試Android Java框架服務文章。

如果要調試的代碼是由Java服務通過JNI隱式加載的本機庫,請檢查調試Android框架本機庫文章。

雖然Android確實支持遠程GDB會話,但這可能不適用於內核端代碼。 最好的辦法是使用JTAG連接,該連接可用於執行停止模式調試。 由於停止模式調試有效地停止了CPU的執行,您可能會發現這會導致看門狗定時器出現問題。

或者,將跟蹤插入內核代碼可能更容易。

除非您想在程序集級別進行調試,否則您可能必須自己構建內核並啟用調試+調試符號。 我認為小型設備中的大多數內核都會在默認情況下避免這樣做,因為它會使內核變得更大。 那時你可以啟用內核調試器......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM