前篇文章介紹了手機除錯的trace技巧,mtk手機除錯是比較簡單的,除了打trace,找assert,分析dump外,剩下的就是經驗了,有經驗的人看到現象就能猜到問題出在什麼地方,簡單看一下trace只是為了確認自己的猜測.初涉此道的朋友往往需要時間,慢慢積累經驗.要達到熟練,就需要有空的時候多讀多研究**.熟練的掌握了**,解決問題就會熟能生巧.
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 ***;重定義.把一些不能識別的巨集定義使用win32括起來重定義一下
c.在生成modis時,會遇到大量不認識的函式,如果少於50個,全部建成void ***(){}型別的空函式.如果多於一百個,嘗試查詢這些函式的**,如果是相關sp的,就再次補充關掉相關sp.當然如果你不怕麻煩,也可以把這一百個函式建成空函式.一般來說,把所有第三方功能和與mtk無關的功能關掉的話,不能識別的函式一般不會超過十個.
經過這樣三步,一般情況下你都能得乙個差不多可以使用的模擬器.有了模擬器,你就可以進行下面的工作了.如果你仍然無法獲得模擬器,建議諮詢你的專案領導,如果你的領導也無法解決,說明這個軟體組是乙個組員變動很快,或者說缺乏條理性的部門,當然也有可能這個部門的程式設計師都是一些mtk的頂尖層高手,他們的程式從來不需要除錯.總之這是會讓人瘋狂的部門.
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編輯框裡輸入.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_***, 其值等於5時會出錯,但你不知道這個全域性變數在什麼地方被什麼**賦值為5,這時就可以設定資料斷點,在第二選項卡上面的對話方塊裡輸入g_***,靠下的對話方塊裡輸入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標準庫檔案的彙編**上,只有一種可能,就是你的呼叫出錯了.
除錯佔了研發的很大一部分時間,除錯的基本技術就這樣,一般情況下是綜合運用,靈活掌握,以期快速解決問題,穩定**.剩下就是經驗積累的問題了.
模擬器除錯
懶書生 發表於 2009 10 29 20 13 00 52rd上曾有朋友讓我寫一些除錯技巧方面的文章.除錯對於軟體是十分重要的,但卻不是一篇二篇文章能講清楚的.有很多除錯技巧都是零零碎碎的東西,用的時候能很容易使用,但要寫出來時,卻還是比較麻煩的.mtk的除錯一般來說可以分為 除錯與手機除錯.這兩...
mtk模擬器及編譯命令
編譯命令 make custom gprs gsm new remake update clean module name 編譯時進入dos下工程所在的目錄,然後輸入上面的命令語句即可開始編譯。引數 custom 是不同的軟體版本,編譯時可忽略引數 custom 系統會自動判斷。gprs gsm是說...
如何編譯 MTK 的模擬器 android
1.可以使用編譯命令 build 出乙個 zip 檔案,命令為.makemtk banyan addon 2.編譯好後,會生成乙個 zip 檔案,位置是在 out host linux x86 add on 下 4.進入 android sdk windows add ons banyan addo...