2012-09-07 94 views
2

我試圖在Android(Java/C/C++)上調試混合代碼。我的目標設備是Vizio 1008.代碼在仿真器上運行,我可以使用GDB從Eclipse進行調試。但是,我不能在真實設備上做到這一點。GDBSERVER在啓動時退出

後這個奮鬥的日子裏,我本地化問題:

當GDBSERVER設備(成功)上啓動時,它會立即與消息退出: 「未知的寄存器D0要求」。因此,沒有調試會話是可能的。我也嘗試了ARM的DS-5調試器。 GDBSERVER保持連接狀態,但退出遠程調試器的連接嘗試。我嘗試了GDBSERVER調試輸出,但它沒有提供任何有用的信息。

更奇怪的是,我嘗試了任何版本的GDBSERVER,我可以得到它們,並且它們都表現得像這樣。但是,我從Google NDK的舊版本中找到了GDBSERVER(3或4個版本)。而這個版本工作!但是,調試器(在主機上)很快就會死掉(分段故障),即使我知道該程序是OK的。

我查看了GDBSERVER源代碼,看起來像這個錯誤與GDBSERVER檢查硬件時的啓動順序有關。可能它涉及到浮點協處理器,但我不確定,因爲這個錯誤信息非常通用。

如果有問題,我使用Google NDK在Windows上進行設置。代碼是99%C/C++,帶有Java shell和一些用Java實現的函數(線程HTTP調用)。再次,應用程序在設備上工作,並且可以在仿真器上進行調試(包括Java和C/C++)。我也可以在設備上調試Java部分。

是否anybogy知道它可能是什麼?以及如何解決這個問題?它是Vizio嗎?

預先感謝您。

回答

2

聽起來類似於我嘗試進行本機調試時遇到的問題。問題是設備中使用的arm處理器同時支持vfp/neon指令集和iwmmx指令集,而外觀上gdbserver假定兩者是互斥的。 爲了解決您的問題,不幸的是需要弄亂gdbserver源代碼。以下是來自link的修復。你需要在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寄存器的寄存器轉儲。

相關問題