2022年入門相關(guān)知識總結(jié)_第1頁
2022年入門相關(guān)知識總結(jié)_第2頁
2022年入門相關(guān)知識總結(jié)_第3頁
2022年入門相關(guān)知識總結(jié)_第4頁
2022年入門相關(guān)知識總結(jié)_第5頁
已閱讀5頁,還剩28頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、MTK 編譯過程 1.1. 編寫目的本文編寫的目的主要是為了從整體上理解 同時為以后可能的優(yōu)化編譯過程提供參考。1.2. 簡介MTK 的編譯過程, 以便能夠較快的處理編譯中遇到的問題,MTK 的編譯過程主要是在 windows 命令行下通過 MakeFile 文件來執(zhí)行相應(yīng)的 perl 腳本或 c 程序,將資源包生成 c 源程序, 并與相應(yīng)模塊的 c 程序生成 .o,.lib 或.obj 的中間代碼, 最終生成在手機上使用的 .bin文件和在模擬器上使用的 mmiresource.dll 資源文件。1.3. 編譯命令命令說 明:Clean 清除所有的目標文件、庫文件和日志文件清除并重新編譯所有

2、的文件;主要完成工作New gsm2.mak cleanall cmmgen mmi_feature_check asngen codegen asnregen operator_check_lite update 重新編譯資源文件 ,生成相應(yīng)的目標文件;主要完成的工作:Update gsm2.mak cleanlog cleanbin mcddll_update codegen resgen cksysdrv remake 僅僅編譯依賴修改過的文件生成的模塊;主要完成的工作 : Remake gsm2.mak mcp_check cleanlog cleanbin genverno libs

3、 $(BIN_FILE) done 1.4. 編譯相關(guān)的文件編譯用到的文件主要放在 make 文件夾中。各個文件的簡要說明如下:文件名 說 明Gsm2.mak 編譯過程中主要執(zhí)行的 make 文件,這個文件從命令行獲得編譯參數(shù),做出相應(yīng)的處理。它定義了各個參數(shù)的執(zhí)行過程,包括:new 、remake 、update 等。以及調(diào)用其它 perl 或 c 程序生成目標文件。Option.mak 定義了編譯環(huán)境中用到的工具及相關(guān)的目錄,根據(jù)大的編譯開關(guān)定義了小的編譯和鏈接選項,編XXX.lis 譯中包含文件和生成文件的路徑,定義 trace 的頭文件路徑,全局的編譯開關(guān),用戶的一些編譯選項,最后定義

4、了編譯路徑和目錄。XXX 模塊的 .c 文件XXX.pth XXX 模塊的 .c 文件存放的路徑函數(shù)或宏時,XXX.def XXX 模塊用到的編譯開關(guān),當 XXX 模塊引用其它模塊中在編譯開關(guān)下定義的變量、就需要將這個編譯開關(guān)加進來。XXX.inc XXX 模塊用到的頭文件路徑,需要將XXX 模塊引用的頭文件及,頭文件引用的頭文件的路徑均要包含進來。XXX_GPRS.mak 定義了需要編譯的模塊列表、編譯中包含文件和生成文件的路徑,定義trace 的頭文件路徑,全局的編譯開關(guān),用戶的一些編譯選項,最后定義了編譯路徑和目錄。Comp.mak 編譯和集成模塊源文件,編譯生成庫文件。構(gòu)建目標代碼依賴

5、列表,設(shè)置每個模塊的編譯路徑及編譯選項,設(shè)置生成目標 lib 的路徑,設(shè)置生成 obj 的路徑buildinfo.tmp 包含了在 Gsm2.mak 和 Option.mak 中用到的項目和平臺名稱compbld.tmp 包含了編譯每個模塊時的編譯信息。MT6218B.log 記錄了 Gsm2.mak 文件編譯過程MT6218Br 目錄 包括了每個模塊依賴的頭文件MT6218Bo 目錄 包含所有生成的 obj 文件和 lib 文件。1.5. 編譯指令1、new功能 :全新開始構(gòu)建整個工程的ARM 版,包括圖片、聲音、字符串等資源都要重做。在構(gòu)建工程過程中,清除所有的目標文件,庫文件,日志文件等

6、。New 指令還會自動創(chuàng)建必要的目錄、移除臨時文件和 中間腳本、更新日志文件。過程簡要說明 :new-cleanall-sysgen-ckscatter-mmi_feature_check-asngen-codegen-asnregen-operator_check_lit-$(B TLD_BIN_FILE)-update。依賴指令 :new 依賴的其他指令最多,其中包括cleanall,sysgen,ckscatter,mmi_feature_check,asngen,codegen,asnregen,operator_check_lite,update. 用途 : new 指令是最徹底也是

7、耗時最長的一個動作,一般得到一個新的 要做一次。MTK 發(fā)布版本后由項目負責人使用示例 :C: BIRD25_GEMINI_07BReleasemake BIRD25_GEMINI_07B gprs new。2、update功能 :update 是重新更新整個工程的ARM 版,該動作會掃描工程中文件和庫的依賴關(guān)系,若依賴關(guān)系有變化會建立新的依賴關(guān)系,隨后根據(jù)新的依賴關(guān)系重新編譯鏈接有改動的部分。Update 指令不依賴cleanall 指令,所以它不會刪除目標文件和庫文件,也不會去更新日志文件和創(chuàng)建目標目錄,這一點和 remake相像,這也是為什么執(zhí)行時間比 new 短的原因。過程簡要說明 :

8、update-cleanlog-cleanbin-mcddll_update-codegen-resgen-cksydrv-remake。依賴指令 :cleanlog,cleanbin,mcddll_updata,codegen,resgen,cksydrv,remake 。用途 :update是耗時較長的一個指令,一般在增加或刪除一些驅(qū)動或應(yīng)用情況下使用。使用示例 :C: BIRD25_GEMINI_07BReleasemake BIRD25_GEMINI_07B gprs update。3、remake功能 : remake 是重新編譯整個工程的ARM 版,該動作只是簡單的重新編譯鏈接有改

9、動的部分。它不檢查依賴關(guān)系 .不掃描資源,只掃描代碼的改變,有改變的重編,資源和無改變的代碼不編。過程簡要說明 :remake-mcp_check-cleanlog-cleanbin-genverno-libs-$(BTLD_BIN_FIKE)-cmmgen-done。依賴指令 :mcp_check,cleanlog,cleanbin,genverno,libs,$(BIN_FIKE) ,cmmgen,done。其中最重要的兩個指令是libs,$(BIN_FIKE) 。Libs 調(diào)用編譯器和連接器將各個模塊目錄下的C 文件編譯連接為獨立的庫。 $(BIN_FIKE) 是將各個模塊編譯連接的庫和

10、mtk_lib 目錄下的庫一起連接起來得到一個映像文件,然后使用 ADS 的工具 fromelf 將映像文件生成以變量BIN_FILE命名的二進制文件,該文件可以下載到硬件板上運行。用途 :remake 是耗時最短的一個動作,也是最常用的動作。使用示例 :C: BIRD25_GEMINI_07BReleasemake BIRD25_GEMINI_07B gprs remake。4、clean 功能 :清除所有的目標文件,臨時文件,庫文件,可執(zhí)行文件,更新日志文件。還可以用于某個模塊相 關(guān)的清除工作。過程簡要說明 :check build root 、target folder 、comp、 l

11、ib、comp log folder-clean bin folder 、 elf、lis、htm、 log files 、tst database files、obj,lib files 。依賴指令 :cleanlog,cleanbin,cleanmod,cleancodegen 等。用途 :作為其它命令所依賴的指令,還有就是清除工程或者指定模塊對象的類庫。使用示例 :C: BIRD25_GEMINI_07BReleasemake BIRD25_GEMINI_07B gprs clean,C: BIRD25_GEMINI_07BReleasemake BIRD25_GEMINI_07B gp

12、rs clean Init。5、其他命令介紹 new_modis :是全新構(gòu)建整個工程的 PC模擬版,其調(diào)用 VC 的編譯器和鏈接器得到一個可以在 windows 上運行的 PC 模擬版。 MMI 應(yīng)用軟件工程師可以在沒有硬件板的情況下在 PC 上檢查和調(diào)試自己寫好的應(yīng) 用。codegen_modis: 產(chǎn)生 modis 需要的 trace 文件的 datebase。gen_modis :產(chǎn)生 vc 工程文件。remake_modis :重新編譯整個工程的 PC 版。Codegen:創(chuàng)建 TST 數(shù)據(jù)庫。它依賴的指令有:cleancodegen,asngen,umts_gen,codegen,

13、asnregen,cleanbin,mcddll_update,done。Cleancodegen :刪除 codegen.lis。Resgen:生成 MMI 資源。它依賴的指令有:code_generate,cleancodegen,asngen,codegen,asnregen,cleanbin,mcddll_update,done。Cmmgen :生成 CMM 文件。Sysgen:生成內(nèi)存映射文件,并放在CUSTOMER 文件夾里面。Emigen :生成 flash_opt.h,custom_EMI.h,custom_EMI.c 和 custom_switchclock.c 文件。Emi

14、clean :清除 EMI 設(shè)置。Mmi_feature_che ck:根據(jù) MMI_features.h 和 MMI_features_switch.h 中宏定義的不同來產(chǎn)生 info.log 文件。Operator_check :檢查 customer 的宏是否被修改,如果修改產(chǎn)生相應(yīng) log 文件。Fota :生成 FOTA 二進制文件。Bootloader :生成 bootloader 二進制文件。Ckscatter :檢查 scatter 文件 Mmi_obj_check :檢查運行時間值,e.g,聯(lián)合體元素的大小等。Med_mem_check :檢查 media memory 。該

15、指令依賴 gencustominfo gen_infolog nvram_auto_gen 。Dummy_data_check :檢查虛擬數(shù)據(jù)。Viewlog :查看日志文件。Cksysdrv :檢查系統(tǒng)驅(qū)動是否為滿。Genverno :生成 verno.c/h。Mcddll_update:生成和更新tst mcddll.dll 文件。Gen_bl_verno :生成 bootloader 版本號。Del_fota :刪除 fota 二進制文件和elf,lis,sym,htm.*.log文件。實踐:一,要手動修改 flash 類型時: (1)沒有打開 USB_DOWNLOAD emiclean

16、 - emigen - r (2)打開了 USB_DOWNLOAD emiclean - emigen - bootloader - c,r custom init drv - r action = new (codegen, resgen, clean, update) (default) = update or u (scan, compile, link) = slim_update (scan, compile, link without generating mcddll) = remake or r (compile, link) = clean or c (clean) = cc

17、i or clean_codegen (clean codegen intermedia files) = resgen (resgen) = c,u (clean then update) = c,r (clean then remake) = codegen (codegen) = slim_codegen (codegen without generating mcddll) = update_mcddll (codegen and generate mcddll) = slim_mcddll (generate mcddll without codegen) = viewlog (op

18、en edit to view build log) = emigen (emigen) = emiclean (emiclean) = check_dep (check dependency module(s) after source(s)/header(s) changed) = remake_dep (check_dep, remake) = update_dep (check_dep, update) Example: make gsm new (MT6205B EVB new) make gprs codegen (MT6218B EVB codegen) make mt6219

19、gprs update (MT6219 EVB update) make firefly17_demo gprs new make milan_demo gprs c,u init custom make mt6219 gprs r init custom drv make mt6229 gprs check_dep init/include/init.h make mt6229 gprs remake_dep make/init/init.lis make mt6229 gprs update_dep init/src/init.c 1.6. 常見編譯錯誤 1、mtk_resgenerato

20、r.exe 不能正常運行。 可能是 ResGenerator 文件夾中的某些文件有錯誤。一個原因是 在 ResGenerator 文件夾中缺少 temp.rgb 這個文件,并且不能自動生成。2、240X320 屏的 Font_res.c 文件的錯誤, 因為打開了中文字體的編譯開關(guān),只需要將 mmi_featurespluto.h 文件中 _MMI_LANG_SM_CHINESE_ 的編譯開關(guān)關(guān)閉即可。3、出現(xiàn)以下錯誤,plutommi/mmi/FunAndGames/FunAndGamesSrc/Game.c, line 349: Error: C2455E: array 0 found pl

21、utommi/mmi/FunAndGames/FunAndGamesSrc/Game.c, line 350: Error: C2455E: array 0 found 因為默認的 240X320 屏幕打開的關(guān)于游戲的編譯開關(guān)下沒有游戲,所以需要打開 mmi_featurespluto.h 文件中的 _MMI_GAME_VSMJ_240 x320_ 編譯開關(guān)。4、現(xiàn)象: mmiresource 模塊生成錯誤:plutommi/Customer/custresource/custimgmapext.c, line 31: Error: C2456E: undeclared name, inven

22、ting extern int MAX_IMAGE_IDS plutommi/Customer/custresource/custimgmapext.c, line 31: Serious error: C2958E: illegal in constant expression: non constant MAX_IMAGE_IDS plutommi/Customer/custresource/custimgmapext.c: 0 warnings, 1 error, 1 serious error 原因:改變了屏幕大小后,128X160 目錄下的圖片資源有問題。解決辦法:更換 128X16

23、0 目錄下的圖片資源,重新編譯此模塊。5、現(xiàn)象: Free clusters are NOT enough . Check ckSysDrv.log for detail ! Tools/make.exe: * cksysdrv Error 1 解決辦法:刪除掉 /custom/system/CCDH26_05C_BB 目錄下的 custom_EMI.c 、custom_EMI.h 、flash_opt.h三個文件。6、現(xiàn)象:在新加模塊的.c 文件中引用一個b.h,產(chǎn)生 b.h 中的 aaa變量沒有定義的錯誤,具體錯誤如下:原因:沒有包含定義 aaa變量的頭文件 a.h。解決辦法:在 incl

24、ude b.h 之前 include a.h 7、現(xiàn)象: plutommi/Customer/custresource/CustImgDataHW.h, line 19361: Serious error: C2934E: duplicate definition of _CUSTOMER_IMAGES_EMPTYIMAGE_BMP 原因:解決辦法:刪掉 CustImgDataHW.h 這個文件重新編譯8、現(xiàn)象:在鏈接 bin 文件時,出現(xiàn)以下錯誤:Error: L6218E: Undefined symbol custom_setAdvEMI (referred from bootarm.o

25、bj). 原因: custominfo.pl 文件沒有修改,默認只打開CCDH26_05C_GPRS.mak 一個文件,并不打開其它定義編譯開關(guān)的文件,導(dǎo)致 custom 模塊中的有些文件沒有編譯,所以一些變量在最后鏈接時顯示未定義。解決辦法:修改 custominfo.pl 文件。8、現(xiàn)象:編譯某個模塊,出現(xiàn)錯誤:Error: L6218E: Error: C2933E: type disagreement for mmi_phb_info_entry_list 原因:調(diào)用mmi_phb_info_entry_list函數(shù)時傳遞的參數(shù)不正確,或者是函數(shù)mmi_phb_info_entry_l

26、ist在調(diào)用時還未定義。解決辦法:修改 custominfo.pl 文件。9、現(xiàn)象:編譯時出現(xiàn)字符串未定義的錯誤,enum_list.h:2046: error: STR_ENTERTAINMENT_EXPLAIN_WOMANKNOWLEDGE undeclareere (not in a function) 原因:可能是編譯開關(guān)沒打開,或者是正在使用excel 表, readexcel.c 中沒有添加相關(guān)的頭文件。還有一種可能是在使用這個字符串 ID 的模塊的 make 底下的 .inc 文件中沒有將定義這個字符串的頭文 件路徑加上。還要注意防止頭文件引用的宏定義是不是重復(fù)。MTK 快速調(diào)試

27、定位的幾種方法 在 debug 調(diào)試時你也許常常發(fā)現(xiàn)有思路如何改,但就苦于找不到要改的地方。所以快速的定位代碼是 至關(guān)重要。在 debug 時,最重要的是能夠準確快速的定位代碼,一般常用的有如下幾種方式1.在模擬器中使用斷點 模擬器中斷跟蹤斷點設(shè)置函數(shù):/ 觸屏相關(guān) wgui_touch_screen.c wgui_general_pen_down_hdlr / 觸摸屏按下函數(shù) wgui_general_pen_move_hdlr / 觸摸屏移動函數(shù) wgui_general_pen_down_hdlr / 觸摸屏松開函數(shù) wgui_general_pen_repeat_hdlr / 重復(fù) w

28、gui_general_pen_abort_hdlr / 放棄操作 在 wingui.c 此函數(shù)中 setup_UI_wrappers 有相關(guān)全局變量的初始賦值和定義 EntryNewScreen / 進入一個新的 screen 都會調(diào)用的函數(shù) ExecuteCurrKeyHandler / 執(zhí)行按鍵的函數(shù) ExecuteCurrHiliteHandler ExecuteCurrHiliteHandler_Ext / 執(zhí)行當前高亮的函數(shù) ExecuteCurrProtocolHandler /執(zhí)行當前協(xié)議棧的函數(shù) execute_softkey_function /執(zhí)行 softkey 的函數(shù)

29、 UI_fill_rectangle / 填充一個矩形框 UI_draw_vertical_line / 畫一條垂直線 UI_draw_horizontal_line / 畫一條水平線 UI_draw_dotted_horizontal_line / 水平虛線UI_draw_dotted_vertical_line / 垂直虛線 UI_print_text / 畫一個字符串 UI_print_bordered_text / 畫一個有邊色字符串 UI_print_text_n / 畫一個有 n 個字符的字符串 UI_print_bordered_text_n / 畫一個有 n 個字符的帶邊框色字

30、符串UI_print_bordered_character / 畫一個的帶邊框色字符 UI_print_character /畫一個字符 gdi_image_draw /從繪圖事件開始跟蹤的函數(shù) _show_image / 畫一個 gif _show_transparent_image /畫有設(shè)透明色的圖片 _show_animation_frame / 畫設(shè)置禎數(shù)的圖片 gdi_layer_blt_previous / 同一個 layer 刷新某一區(qū)域的函數(shù) gdi_layer_blt_ext / 幾個 layer 疊加顯示時刷新某一區(qū)域的函數(shù) UI_BLT_double_buffer /刷

31、新一塊區(qū)域 UI_set_font /設(shè)置字體 3。在模擬器中設(shè)置變量值改變的斷點 4。搜索菜單 ID 如 MAIN_MENU_ENTERTAINMENT_MENU_ID 5。搜索字符串 ID 如 MAIN_MENU_MENU_TEXT 6。搜索圖片 ID 如 MAIN_MENU_PHONEBOOK_ICON 7. 超級終端調(diào)試 : 8.Catcher 調(diào)試 2.MMI 繪制設(shè)置斷點 跟蹤屏幕每一處字串繪制:設(shè)置斷點 UI_move_text_cursor :gui_move_text_cursor =UI_move_text_cursor 圖標測量:設(shè)置斷點 _measure_image:g

32、ui_measure_image = _measure_image 圖標顯示:設(shè)置斷點 _show_image:gui_show_image = _show_image 水平線和垂直線的繪制 : 設(shè)置斷點 UI_draw_vertical_line和 UI_draw_horizontal_line gui_draw_vertical_line = UI_draw_vertical_line; gui_draw_horizontal_line = UI_draw_horizontal_line; 字串測量、坐標位置、打?。涸O(shè)置斷點 UI_print_text 、UI_measure_string

33、 、 UI_move_text_cursor gui_measure_string = UI_measure_string gui_move_text_cursor =UI_move_text_cursor gui_print_text =UI_print_text 繪制圖片的函數(shù):gdi_image_draw-gdi_image_codec_draw MODIS 調(diào)試前篇文章介紹了手機調(diào)試的 TRACE 技巧 ,MTK 手機調(diào)試是比較簡單的 ,除了打 TRACE, 找 ASSERT,分析 DUMP 外,剩下的就是經(jīng)驗了 ,有經(jīng)驗的人看到現(xiàn)象就能猜到問題出在什么地方 ,簡單看一下 TRACE

34、只是為了確認自己的猜測 .初涉此道的朋友往往需要時間 ,慢慢積累經(jīng)驗 .要達到熟練 ,就需要有空的時候多讀多研究代碼 .熟練的掌握了代碼 ,解決問題就會熟能生巧 . MTK 的模擬器調(diào)試說沒技巧也是對的 ,說有技巧也不錯 .因為模擬器的技術(shù)與其說是 MTK 經(jīng)驗 ,不如說是 VC 經(jīng)驗 . 由于模擬器能在沒有樣機的情況做大量的 UI 方面的開發(fā) ,同時模擬器具有快捷 ,所見即所改等優(yōu)點 ,因此,受到很多開發(fā)老手的青睞 .熟練掌握模擬器使用技巧 ,對于提高工作效率 ,節(jié)省資源具有很積極的意義 . 工欲善其事 ,必先利其器 .欲了解模擬器調(diào)試 ,就要先了解 VC 使用 .VC 調(diào)試過程中經(jīng)常使用的

35、快捷鍵如下: vc+ 斷點的使用:按F9(設(shè)置斷點) ,F(xiàn)5 調(diào)試, F10 單步調(diào)試, shift+F5 退出調(diào)試F10 單語句執(zhí)行,F(xiàn)11 單指令執(zhí)行, Ctrl+F10 執(zhí)行至光標處;F9 按行設(shè)置 /取消斷點 , Alt+F9 可按行,按數(shù)據(jù)或按消息設(shè)置斷點;調(diào)試時,按 Alt+3 打開跟蹤窗口,Alt+4 打開變量窗口, Alt+5 打開寄存器窗口,Alt+6 打開內(nèi)存窗口,Alt+7 打開堆棧窗口,Alt+8 打開匯編指令窗口;1.只要你有源代碼 ,擁有一個模擬器是一件很容易的事 .當然 ,有些情況下 ,這對于初入 MTK 的人來說 ,也是困難的 ,特別是在一些代碼管理不善 ,公司

36、人員眾多 ,員工流動頻繁的公司 ,你永遠想象不出他們的代碼會有多糟 .不過一般情況下 ,我到一個新公司 ,都會試著去使用他們的代碼編譯得到模擬器 ,不管他們的代碼多么糟 ,我總能快速的編出模擬器來 .只要三個步驟 : a.在編譯模擬器前請關(guān)掉所有 SP 的宏 ,這是很重要的 ,很多 SP 都不提供在模擬器下運行的庫 ,所以一個項目 SP 越多 ,在模擬器下 ,他無法識別的函數(shù)也會越多b.在編譯過程中遇到錯誤 ,可以把所有與顯示無關(guān)的代碼全部使用 #ifdef WIN32 宏括起來 ,把所有不認識的類型使用 typedef int xxx; 重定義 .把一些不能識別的宏定義使用 WIN32 括起

37、來重定義一下c.在生成 MODIS 時,會遇到大量不認識的函數(shù) ,如果少于 50 個,全部建成 void xxx() 類型的空函數(shù) .如果多于一百個 ,嘗試查找這些函數(shù)的來源 ,如果是相關(guān) SP的,就再次補充關(guān)掉相關(guān) SP.當然如果你不怕麻煩 ,也可以把這一百個函數(shù)建成空函數(shù) .一般來說 ,把所有第三方功能和與 MTK 無關(guān)的功能關(guān)掉的話 ,不能識別的函數(shù)一般不會超過十個 . 經(jīng)過這樣三步 ,一般情況下你都能得一個差不多可以使用的模擬器.有了模擬器 ,你就可以進行下面的工作了 .如果你仍然無法獲得模擬器,建議咨詢你的項目領(lǐng)導(dǎo),如果你的領(lǐng)導(dǎo)也無法解決,說明這個軟件組是一個組員變動很快 ,或者說缺

38、乏條理性的部門 ,當然也有可能這個部門的程序員都是一些 MTK 的頂尖層高手 ,他們的程序從來不需要調(diào)試 .總之這是會讓人瘋狂的部門 . 2.如果你順利到到一個模擬器 ,那么就可以開始調(diào)試了 .首先說一下斷點 ,VC 中的斷點分三大類 ,一類是本地斷點 ,一類是數(shù)據(jù)斷點 (也稱之為條件斷點 ,有人稱之為高級斷點 ),還是一類是消息斷點 ;這三類斷點分別對應(yīng)于快捷鍵 ALT+F9 打開的對話框中三個選項卡 .由于消息斷點是用于跟蹤 WIN 的消息 ,所以在 MTK 中用不著 .在模擬器中一般我們只使用本地斷點與數(shù)據(jù)斷點 .本地斷點和數(shù)據(jù)斷點在 BUG 調(diào)試中舉足輕重 ,熠熠生輝。 熟練掌握斷點技

39、巧,可以使工作事倍功半。可能有些人會使用斷點 ,但卻不知道斷點在模擬器中有什么妙用 .斷點有兩個最常使用也的作用 ,一是跟蹤代碼執(zhí)行情況 ,二是觀察斷點處局部變量值的變化 .這兩個功能應(yīng)用最多 .但他在 MTK 模擬器中還有兩個隱含的用途 ,一就是快速定位文件 ,MTK 本身的源代碼大約有差不多上萬個文件 ,而加入 SP 后,代碼大約已經(jīng)超過了萬數(shù) .在這里面查找文章 ,查找函數(shù) ,是一件很困難的事,這時就需要使用斷點了 .你在代碼閱讀工具 SI 中可以很輕松的利用 CTRL+O 打開文件 ,也可以使用 F7快速定位到函數(shù) ,但在 VC 中卻沒這么方便 ,不過你可以使用斷點 ,比如想在 VC

40、中打開某個文件wgui_categories_CM.c ,只要 VC 中使用 ALT+F9 ,在 break at 編輯框里輸入,E:JMT_1120plutommimmiGUIGUI_SRCwgui_categories_CM.c, .4693,按 F5 執(zhí)行 DEBUG 后 VC 就能自己定位到這個文件 wgui_categories_CM.c 的 4693 行。這是文件斷點,也可以打函數(shù)斷點,比如文件wgui_categories_CM.c 的 4693 行對應(yīng)的是函數(shù) ShowCategory16Screen,也可以直接在 break at 編輯框里輸入 ShowCategory16S

41、creen,使用 F5 鍵 DEBUG 時,函數(shù)運行到撥號界面時,就會停下來供你調(diào)試。本地斷點就是這樣使用的。那么本地斷點有什么用呢?或者說有什么特殊用途呢?簡單舉幾個例子吧 ,但斷點可以應(yīng)用于解決十分多的問題中 ,不要因為我的例子束縛了你的想象力 . a.如何使用斷點快速定位到問題點呢?如果我們發(fā)現(xiàn),撥號窗口顯示出了問題,但我們對代碼不熟,不知道撥號窗口的代碼在哪個文件,哪一行, 我們就可以在 EntryNewScreen 函數(shù)上打斷點, 當進入撥號時他就會停下來, 這時我們能過堆棧窗口信息就可以很輕松的找到這個窗口的實現(xiàn)函數(shù)。詳細研究代碼 ,就可以找到解決方法 . b.斷點可以用于快速解決

42、窗口顯示問題 ,比如我們的撥號窗口 ,有一個圖片顯示不正常 ,這時我們可以在繪圖函數(shù) gdi_image_codec_draw 上打上斷點 ,進入撥號窗口中 ,每一次顯示圖片 ,都會在該函數(shù)上停下來 ,結(jié)合堆棧 ,我們可以很容易找到是哪個地方代碼出來問題 ,從而找到解決方法 .有關(guān)此類的函數(shù)太多 ,不一一舉例 . C.斷點可以用來研究全局變量被意外修改問題 ,我們打開斷點對話框 ,選第二個選項卡 ,把需要跟蹤的變量打進去 ,當每次變量變化時 ,VC 都會停下來等我們調(diào)試 .也可以設(shè)置條件 ,假設(shè)某全局變量 U8 g_XXX, 其值等于 5 時會出錯 ,但你不知道這個全局變量在什么地方被什么代碼

43、賦值為 5,這時就可以設(shè)置數(shù)據(jù)斷點 ,在第二選項卡上面的對話框里輸入 g_XXX = 5, 當其值為 5 時就會停下來 . d.研究代碼也可以使用斷點 ,比如 MTK 代碼里使用有很多函數(shù)指針封裝 ,例如 gui_print_text 指針 ,你想研究他的實現(xiàn)過程 ,但由于是指針 ,你找不到他的函數(shù)體 ,這時你就可以在數(shù)據(jù)斷點中 ,把指針 gui_print_text 輸入進去 ,重啟模擬器時 ,他就會定位到 ui_print_text 函數(shù)處 . 茲舉這四個例子吧 ,斷點可以使用于你需要調(diào)試的任何場合 ,但過多的斷點會影響你查找問題的速度 ,等熟練使用時 ,就可以有針對性的對某些變量和函數(shù)打

44、斷點以解決問題.這是一個積累的過程3.堆棧調(diào)試 ,Alt+7打開堆棧窗口 .該窗口中我們可以看到函數(shù)之間的調(diào)用關(guān)系,這是十分有用的,一般都是結(jié)合斷點使用,定位 BUG 和研究代碼十分有用.由于上面有例子,這里就不舉了,閱讀代碼解決BUG4.變量窗口 ,Alt+4打開變量窗口 ,該窗口會自動顯示斷點代碼處使用的變量及其值時使用 ,單步執(zhí)行時經(jīng)常參考該窗口數(shù)據(jù)5.WATCH 窗口 ,按 Alt+3 打開 ,由于變量窗口自動顯示的變量有時不是我們需要的 ,這時就可以把我們需要查看的變量拖放到該窗口研究 ,結(jié)合斷點使用 ,并且這里也支持表達式取值 ,真是太棒了 . 6.內(nèi)存窗口 ,Alt+6 打開內(nèi)存

45、窗口 ,內(nèi)存窗口可以顯示一塊內(nèi)存的內(nèi)容 ,這是很有用的 ,比如我們要跟蹤短信內(nèi)容 ,有一個短信內(nèi)容的指針 ,把該指針輸入 WATCH 窗口 ,只能看到該指針指向的第一個值 ,要看其他的 ,會很麻煩 ,你只能輸入表達式 ,但你把該指針輸入內(nèi)存窗口 ,就不必這樣費事了7.Alt+8 打開匯編指令窗口 ,這個窗口用處不是很大 ,學(xué)習匯編的話 ,還是有用處的 .一般情況下 ,如果第三方的庫文件出了問題 ,也就只能使用這個窗口調(diào)試了 .普通情況下 ,如果錯誤定位在 C 標準庫文件的匯編代碼上,只有一種可能 ,就是你的調(diào)用出錯了 . 調(diào)試占了研發(fā)的很大一部分時間 ,調(diào)試的基本技術(shù)就這樣 ,一般情況下是綜合

46、運用 ,靈活掌握 ,以期快速解決問題 ,穩(wěn)定代碼 .剩下就是經(jīng)驗積累的問題了 . TRACE 使用的技巧MTK 的調(diào)試一般來說可以分為仿真調(diào)試與手機調(diào)試 .這兩種調(diào)試對于研發(fā)新功能 ,修改 BUG,研究算法都是十分重要的 .當然 ,這兩種調(diào)試也有差異 ,有時會出現(xiàn)在模擬器運行正常 ,在手機卻運行失敗 ,或者相反 ,這就突出了軟件模擬環(huán)境與硬件手機環(huán)境的差別 .原因可能是各種各樣的 ,比如可能是有些硬件軟件沒有辦法模擬 ,有些新功能對硬件依賴強 ,不能模擬 ,新軟件的有些函數(shù)只能在手機上運行 ,沒有寫相應(yīng)的模擬器代碼 .等等原因都會導(dǎo)致兩者差異 .這里不一一贅述 ,大家知道模擬器和手機有差異就行

47、了 . 模擬器調(diào)試具有直觀 ,快速 ,追蹤方便能優(yōu)點 ,受到很多 MMI 開發(fā)者的喜歡 .而有關(guān)模擬器的調(diào)試 ,其他也就是 VC 調(diào)試功能的使用 .由于國內(nèi)軟件教育重編程 ,算法 ,輕調(diào)試 ,所以很少有系統(tǒng)的調(diào)試方書的書 .在開發(fā)過程中 ,我也見過許多人壓根就不使用模擬器 ,他們認為模擬器也就是在沒有手機的時候使用 .詳細講解模擬器的調(diào)試就放到以后 ,因為模擬器斷點 ,內(nèi)存 ,堆棧 ,變量各個方面的調(diào)試 ,詳細寫來都可以成一篇文章 .這里先講一個手機調(diào)試的 TRACE 使用 . 1.在 MTK 平臺 ,我們最常使用的TRACE 函數(shù)是 kal_prompt_trace 函數(shù) ,這個函數(shù)是系統(tǒng)提

48、供給我們的用于在 catcher 里調(diào)試錯誤的 .在這個函數(shù)不能使用的場合,有時我們會使用函數(shù)system_print 或者 dbg_printf,這兩個函數(shù)可以不使用 catcher 的情況 ,使用 WIN 自帶的工具超級終端來調(diào)試程序 .有時驅(qū)動的朋友會自己用 函數(shù) PutUARTBytes 寫自已 TRACE 函數(shù) ,這些函數(shù)可以使用超級終端調(diào)試 ,如下 ,就是別人寫的一個 TRACE 函數(shù) .打印某一塊數(shù)據(jù)的內(nèi)容 ,常常 TRACE 內(nèi)存數(shù)據(jù) ,指定地址 ,指定大小void perun_dump(void *buf, prn_int16 size) #ifdef PRN_TRACE_O

49、PEN #ifdef MMI_ON_HARDWARE_P char str2048; char *ptr = (char*)str; char *ptr1 = buf; int i = 0; memset(str, 0, sizeof(str); strcpy(ptr, Perun_dump: ); ptr += strlen(Perun_dump: ); while (i 或者我自己的拼音名字 ,我會如下修改我的 MYTRACE: #ifdef WIN32 #define MYTRACE printf #else #define STR(s) #s #define MYTRACE(.) ka

50、l_prompt_trace(MOD_WAP, STR()#_V A_ARGS_) #endif 經(jīng)過這樣的改進,我的 TRACE 在輸出信息時 ,信息頭就是我的名字,我可以使用查找全部功能把我需要的 TRACE 全抓出來 .如果你對 #號的使用 ,有疑問 ,請自己查找相關(guān)資料4.種種跡象和從理論上看來 ,TRACE 和 MMI_ASSERT 是調(diào)試的好幫手 ,但在發(fā)布軟件時 ,帶上了這個會引來不必要的麻煩 .MMI_ASSERT 增加了系統(tǒng)重啟的頻率 .TRACE 增加了系統(tǒng)的 ROM,RAM 和 CPU 的開銷 .在工作中 ,我們曾經(jīng)發(fā)現(xiàn)一款手機 ,由于 ROM 過于緊張 ,添加幾條 TR

51、ACE 就會出現(xiàn)編譯錯誤 ,去掉 TRACE就編譯通過了 ,導(dǎo)致出了 BUG 調(diào)試十分的麻煩 .如何寫一種使用時可以 TRACE 錯誤 ,不使用時又不占用系統(tǒng)資源的 TRACE 呢 ,我見許多人這樣處理 ,因為 NULL 會被編譯器優(yōu)化點 ,后面括號變成一個表達式了 .表達式對系統(tǒng)的開銷自然小于函數(shù)了 . #ifdef DEBUG_KAL #define MYTRACE(.) kal_prompt_trace(MOD_WAP, _V A_ARGS_) #else #define MYTRACE NULL #endif 我一般這樣操作 . #ifdef DEBUG_KAL #define MYT

52、RACE(.) kal_prompt_trace(MOD_WAP, _V A_ARGS_) #else #define MYTRACE / #endif 我曾經(jīng)認為這樣寫可以在不使用時 ,把宏函數(shù)變?yōu)樽⑨尫?,但我的一個朋友認為這樣寫 ,并不能把我的函數(shù)變成注釋符 ,他的道理是雙斜線會被編譯器外忽略掉 ,我認為是有道理的 ,后來我的朋友經(jīng)過思考 ,寫出如下的 TRACE, 通過一個反斜杠的連接符 ,哄編譯器在展開宏時把兩個斜杠連起來組成注釋符 ,這個寫法有些古怪 ,下面的單個斜杠必須頂格寫 ,以保證經(jīng)過連接合 ,兩斜杠之間沒有空格從而在被編譯時與后面的代碼組成注釋行 .但這樣寫的一個致命的缺陷

53、是會讓許多人看不明白#ifdef DEBUG_KAL #define MYTRACE printf #else #define MYTRACE / / .另一個缺陷時不美觀#endif 5.有關(guān) C 語言的古怪用法 ,據(jù)的作者曾說 ,世界上有一個古怪的大賽叫” 國際 C 語言混亂 代碼大賽”,每年舉辦一次 .獲獎的都功能齊全而代碼慘不忍睹的典型 .在 MTK 上,也曾經(jīng)有一段費了我很大 功夫的 TRACE 代碼 : #define DBG_PRINTF(_x_) do printf(%s(%d)-:,_FILE_,_LINE_); printf _x_; while(0); 當時怎么想都不明白

54、為什么會有這么古怪的使用printf _x_;后來才發(fā)現(xiàn)使用時要加雙層括號才能正常使用。6.在手機與網(wǎng)絡(luò),手機與電腦的交互過程中,有時我們需要TRACE 數(shù)據(jù)包的內(nèi)容,特別在顯示不正確或者不精確的情況下,需要研究數(shù)據(jù)包的數(shù)據(jù)是使用 UTF 編碼,還 UCS2 編碼,還是 ASC 編碼,這時 我們就需要 TRACE 數(shù)據(jù)的字節(jié)內(nèi)容,從而便于分析。我一般使用下面這個自己隨手寫的函數(shù)來實現(xiàn) . static U8 TraceUni(U8 *str, U8 len) U8 *tempstr,*tempascstr; U8 i; tempstr = str; kal_prompt_trace(MOD_M

55、MI, XXXXXXXXXXXXXXXXXXXXXXXX Trace mmi_msg_handle_new_msg_ind is start XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX); if (*(tempstr + 1) = 0 x00) UnicodeNToAnsii(S8*)tempascstr,(S8*)tempstr,len ); kal_prompt_trace(MOD_MMI, jone trace, the string = %s, tempascstr); else for (i = 0; (*tempstr != NULL) | (*(

56、tempstr+1) != NULL) & (len- != 0); i+) kal_prompt_trace(MOD_MMI, jone trace, the string%d = %x, i, *(tempstr+); kal_prompt_trace(MOD_MMI, XXXXXXXXXXXXXXXXXXXXXXXX Trace string is end XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX); return 0; DUMP 調(diào)試MTK 通過 TRACE 的棧信息尋找 BUG 原因與解決方法 (2009-5-14 20:02)前幾天去一個公司幫他

57、們解決 BUG 。BUG 的描述是這樣的,在使用在線 QQ 時,如果來電話,就會重啟。沒有發(fā)現(xiàn) ASSERT 信息,只有 stack dump 信息。起初聽他們描述,感覺像是 QQ 或者通話的問題。抓了 TRACE 之后,發(fā)現(xiàn)是 MED模塊的問題,由于 MED 主要是一些媒體文件的解碼。由于觀察現(xiàn)象時發(fā)現(xiàn),通話時,還沒有來得及響鈴,就開始重啟,因此可以大概推知是來電振鈴出了問題,具體出在什么地方,需要查找 TRACE 信息。從別人那里獲取的 TRACE 信息如下:Trace 1745424 150706 MOD_NIL TRACE_ERROR 1 fatal error (4): Data_a

58、bort - MED Trace 1745424 150706 MOD_NIL TRACE_ERROR Exception type: data abort Trace 1745424 150706 MOD_NIL TRACE_ERROR software version: E500_A.1.4 Trace 1745424 150706 MOD_NIL TRACE_ERROR boot mode: normal mode Trace 1745424 150706 MOD_NIL TRACE_ERROR rtc sec = 16, rtc min = 33, rtc hour = 1 Trace

59、 1745424 150706 MOD_NIL TRACE_ERROR rtc day = 1, rtc mon = 1, rtc wday = 1, rtc year = 9 Trace 1745424 150706 MOD_NIL TRACE_ERROR execution unit: MEDMED Trace 1745424 150706 MOD_NIL TRACE_ERROR status: 0 x00000000 Trace 1745424 150706 MOD_NIL TRACE_ERROR stack pointer: 0 x00169380 Trace 1745424 1507

60、06 MOD_NIL TRACE_ERROR stack dump: Trace 1745424 150706 MOD_NIL TRACE_ERROR 0 x085569C9 Trace 1745424 150706 MOD_NIL TRACE_ERROR 0 xA0001BED Trace 1745424 150706 MOD_NIL TRACE_ERROR 0 x085569C9 Trace 1745424 150706 MOD_NIL TRACE_ERROR 0 x085569C9 Trace 1745424 150706 MOD_NIL TRACE_ERROR 0 x08480FD5

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論