MTK模擬器調試指南

前篇文章介紹了手機調試的TRACE技巧,MTK手機調試是比較簡單的,除了打TRACE,找ASSERT,分析DUMP外,剩下的就是經驗了,有經驗的人看到現象就能猜到問題出在什麼地方,簡單看一下TRACE只是爲了確認本身的猜想.初涉此道的朋友每每須要時間,慢慢積累經驗.要達到熟練,就須要有空的時候多讀多研究代碼.熟練的掌握了代碼,解決問題就會熟能生巧.c++

MTK的模擬器調試說沒技巧也是對的,說有技巧也不錯.由於模擬器的技術與其說是MTK經驗,不如說是VC經驗.程序員

因爲模擬器能在沒有樣機的狀況作大量的UI方面的開發,同時模擬器具備快捷,所見即所改等優勢,所以,受到不少開發老手的青睞.熟練掌握模擬器使用技巧,對於提升工做效率,節省資源具備很積極的意義.函數

工欲善其事,必先利其器.欲瞭解模擬器調試,就要先了解VC使用.VC調試過程當中常用的快捷鍵以下:工具

vc++斷點的使用:按F9(設置斷點),F5調試,F10單步調試,shift+F5退出調試F10單語句執行,F11單指令執行,Ctrl+F10執行至光標處;F9按行設置/取消斷點, Alt+F9可按行,按數據或按消息設置斷點;調試時,按Alt+3打開跟蹤窗口,Alt+4打開變量窗口,Alt+5打開寄存器窗口,Alt+6打開內存窗口,Alt+7打開堆棧窗口,Alt+8打開彙編指令窗口;學習

1.只要你有源代碼,擁有一個模擬器是一件很容易的事.固然,有些狀況下,這對於初入MTK的人來講,也是困難的,特別是在一些代碼管理不善,公司人員衆多,員工流動頻繁的公司,你永遠想象不出他們的代碼會有多糟.不過通常狀況下,我到一個新公司,都會試着去使用他們的代碼編譯獲得模擬器,無論他們的代碼多麼糟,我總能快速的編出模擬器來.只要三個步驟:
a.在編譯模擬器前請關掉全部SP的宏,這是很重要的,不少SP都不提供在模擬器下運行的庫,因此一個項目SP越多,在模擬器下,他沒法識別的函數也會越多
b.在編譯過程當中遇到錯誤,能夠把全部與顯示無關的代碼所有使用#ifdef WIN32宏括起來,把全部不認識的類型使用typedef int xxx;重定義.把一些不能識別的宏定義使用WIN32括起來重定義一下
c.在生成MODIS時,會遇到大量不認識的函數,若是少於50個,所有建成void xxx(){}類型的空函數.若是多於一百個,嘗試查找這些函數的來源,若是是相關SP的,就再次補充關掉相關SP.固然若是你不怕麻煩,也能夠把這一百個函數建成空函數.通常來講,把全部第三方功能和與MTK無關的功能關掉的話,不能識別的函數通常不會超過十個.
通過這樣三步,通常狀況下你都能得一個差很少可使用的模擬器.有了模擬器,你就能夠進行下面的工做了.若是你仍然沒法得到模擬器,建議諮詢你的項目領導,若是你的領導也沒法解決,說明這個軟件組是一個組員變更很快,或者說缺少條理性的部門,固然也有可能這個部門的程序員都是一些MTK的頂尖層高手,他們的程序歷來不須要調試.總之這是會讓人瘋狂的部門.ui

2.若是你順利到到一個模擬器,那麼就能夠開始調試了.首先說一下斷點,VC中的斷點分三大類,一類是本地斷點,一類是數據斷點(也稱之爲條件斷點,有人稱之爲高級斷點),仍是一類是消息斷點;這三類斷點分別對應於快捷鍵"ALT+F9"打開的對話框中三個選項卡.因爲消息斷點是用於跟蹤WIN的消息,因此在MTK中用不着.在模擬器中通常咱們只使用本地斷點與數據斷點.本地斷點和數據斷點在BUG調試中舉足輕重,熠熠生輝。熟練掌握斷點技巧,可使工做事倍功半。可能有些人會使用斷點,但殊不知道斷點在模擬器中有什麼妙用.斷點有兩個最常使用也的做用,一是跟蹤代碼執行狀況,二是觀察斷點處局部變量值的變化.這兩個功能應用最多.但他在MTK模擬器中還有兩個隱含的用途,一就是快速定位文件,MTK自己的源代碼大約有差很少上萬個文件,而加入SP後,代碼大約已經超過了萬數.在這裏面查找文章,查找函數,是一件很困難的事,這時就須要使用斷點了.你在代碼閱讀工具SI中能夠很輕鬆的利用"CTRL+O"打開文件,也可使用"F7"快速定位到函數,但在VC中卻沒這麼方便,不過你可使用斷點,好比想在VC中打開某個文件wgui_categories_CM.c,只要VC中使用"ALT+F9",在break at編輯框裏輸入{,E:\JMT_1120\plutommi\mmi\GUI\GUI_SRC\wgui_categories_CM.c,} .4693,按F5執行DEBUG後VC就能本身定位到這個文件wgui_categories_CM.c的4693行。這是文件斷點,也能夠打函數斷點,好比文件wgui_categories_CM.c的4693行對應的是函數ShowCategory16Screen,也能夠直接在break at編輯框裏輸入ShowCategory16Screen,使用F5鍵DEBUG時,函數運行到撥號界面時,就會停下來供你調試。本地斷點就是這樣使用的。那麼本地斷點有什麼用呢?或者說有什麼特殊用途呢?簡單舉幾個例子吧,但斷點能夠應用於解決十分多的問題中,不要由於個人例子束縛了你的想象力.
a.如何使用斷點快速定位到問題點呢?若是咱們發現,撥號窗口顯示出了問題,但咱們對代碼不熟,不知道撥號窗口的代碼在哪一個文件,哪一行,咱們就能夠在EntryNewScreen函數上打斷點,當進入撥號時他就會停下來,這時咱們能過堆棧窗口信息就能夠很輕鬆的找到這個窗口的實現函數。詳細研究代碼,就能夠找到解決方法.
b.斷點能夠用於快速解決窗口顯示問題,好比咱們的撥號窗口,有一個圖片顯示不正常,這時咱們能夠在繪圖函數gdi_image_codec_draw上打上斷點,進入撥號窗口中,每一次顯示圖片,都會在該函數上停下來,結合堆棧,咱們能夠很容易找到是哪一個地方代碼出來問題,從而找到解決方法.有關此類的函數太多,不一一舉例.
C.斷點能夠用來研究全局變量被意外修改問題,咱們打開斷點對話框,選第二個選項卡,把須要跟蹤的變量打進去,當每次變量變化時,VC都會停下來等咱們調試.也能夠設置條件,假設某全局變量U8 g_XXX, 其值等於5時會出錯,但你不知道這個全局變量在什麼地方被什麼代碼賦值爲5,這時就能夠設置數據斷點,在第二選項卡上面的對話框裏輸入g_XXX,靠下的對話框裏輸入5,當其值爲5時就會停下來.
d.研究代碼也可使用斷點,好比MTK代碼裏使用有不少函數指針封裝,例如gui_print_text指針,你想研究他的實現過程,但因爲是指針,你找不到他的函數體,這時你就能夠在數據斷點中,把指針gui_print_text輸入進去,重啓模擬器時,他就會定位到ui_print_text函數處.
茲舉這四個例子吧,斷點可使用於你須要調試的任何場合,但過多的斷點會影響你查找問題的速度,等熟練使用時,就能夠有針對性的對某些變量和函數打斷點以解決問題.這是一個積累的過程
3.堆棧調試,Alt+7打開堆棧窗口.該窗口中咱們能夠看到函數之間的調用關係,這是十分有用的,通常都是結合斷點使用,定位BUG和研究代碼十分有用.因爲上面有例子,這裏就不舉了
4.變量窗口,Alt+4打開變量窗口,該窗口會自動顯示斷點代碼處使用的變量及其值,閱讀代碼解決BUG時使用,單步執行時常常參考該窗口數據
5.WATCH窗口,按Alt+3打開,因爲變量窗口自動顯示的變量有時不是咱們須要的,這時就能夠把咱們須要查看的變量拖放到該窗口研究,結合斷點使用,而且這裏也支持表達式取值,真是太棒了.
6.內存窗口,Alt+6打開內存窗口,內存窗口能夠顯示一塊內存的內容,這是頗有用的,好比咱們要跟蹤短信內容,有一個短信內容的指針,把該指針輸入WATCH窗口,只能看到該指針指向的第一個值,要看其餘的,會很麻煩,你只能輸入表達式,但你把該指針輸入內存窗口,就沒必要這樣費事了
7.Alt+8打開彙編指令窗口,這個窗口用處不是很大,學習彙編的話,仍是有用處的.通常狀況下,若是第三方的庫文件出了問題,也就只能使用這個窗口調試了.普通狀況下,若是錯誤定位在C標準庫文件的彙編代碼上,只有一種可能,就是你的調用出錯了.指針

 

 

調試佔了研發的很大一部分時間,調試的基本技術就這樣,通常狀況下是綜合運用,靈活掌握,以期快速解決問題,穩定代碼.剩下就是經驗積累的問題了.調試

相關文章
相關標籤/搜索