版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rè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 的中間代碼, 最終生成在手機(jī)上使用的 .bin文件和在模擬器上使用的 mmiresource.dll 資源文件。1.3. 編譯命令命令說 明:Clean 清除所有的目標(biāo)文件、庫文件和日志文件清除并重新編譯所有
2、的文件;主要完成工作New gsm2.mak cleanall cmmgen mmi_feature_check asngen codegen asnregen operator_check_lite update 重新編譯資源文件 ,生成相應(yīng)的目標(biāo)文件;主要完成的工作: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 程序生成目標(biāo)文件。Option.mak 定義了編譯環(huán)境中用到的工具及相關(guān)的目錄,根據(jù)大的編譯開關(guān)定義了小的編譯和鏈接選項(xiàng),編XXX.lis 譯中包含文件和生成文件的路徑,定義 trace 的頭文件路徑,全局的編譯開關(guān),用戶的一些編譯選項(xiàng),最后定義
4、了編譯路徑和目錄。XXX 模塊的 .c 文件XXX.pth XXX 模塊的 .c 文件存放的路徑函數(shù)或宏時,XXX.def XXX 模塊用到的編譯開關(guān),當(dāng) XXX 模塊引用其它模塊中在編譯開關(guān)下定義的變量、就需要將這個編譯開關(guān)加進(jìn)來。XXX.inc XXX 模塊用到的頭文件路徑,需要將XXX 模塊引用的頭文件及,頭文件引用的頭文件的路徑均要包含進(jìn)來。XXX_GPRS.mak 定義了需要編譯的模塊列表、編譯中包含文件和生成文件的路徑,定義trace 的頭文件路徑,全局的編譯開關(guān),用戶的一些編譯選項(xiàng),最后定義了編譯路徑和目錄。Comp.mak 編譯和集成模塊源文件,編譯生成庫文件。構(gòu)建目標(biāo)代碼依賴
5、列表,設(shè)置每個模塊的編譯路徑及編譯選項(xiàng),設(shè)置生成目標(biāo) lib 的路徑,設(shè)置生成 obj 的路徑buildinfo.tmp 包含了在 Gsm2.mak 和 Option.mak 中用到的項(xiàng)目和平臺名稱compbld.tmp 包含了編譯每個模塊時的編譯信息。MT6218B.log 記錄了 Gsm2.mak 文件編譯過程MT6218Br 目錄 包括了每個模塊依賴的頭文件MT6218Bo 目錄 包含所有生成的 obj 文件和 lib 文件。1.5. 編譯指令1、new功能 :全新開始構(gòu)建整個工程的ARM 版,包括圖片、聲音、字符串等資源都要重做。在構(gòu)建工程過程中,清除所有的目標(biāo)文件,庫文件,日志文件等
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ā)布版本后由項(xiàng)目負(fù)責(zé)人使用示例 :C: BIRD25_GEMINI_07BReleasemake BIRD25_GEMINI_07B gprs new。2、update功能 :update 是重新更新整個工程的ARM 版,該動作會掃描工程中文件和庫的依賴關(guān)系,若依賴關(guān)系有變化會建立新的依賴關(guān)系,隨后根據(jù)新的依賴關(guān)系重新編譯鏈接有改動的部分。Update 指令不依賴cleanall 指令,所以它不會刪除目標(biāo)文件和庫文件,也不會去更新日志文件和創(chuàng)建目標(biāo)目錄,這一點(diǎn)和 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 文件編譯連接為獨(dú)立的庫。 $(BIN_FIKE) 是將各個模塊編譯連接的庫和
10、mtk_lib 目錄下的庫一起連接起來得到一個映像文件,然后使用 ADS 的工具 fromelf 將映像文件生成以變量BIN_FILE命名的二進(jìn)制文件,該文件可以下載到硬件板上運(yùn)行。用途 :remake 是耗時最短的一個動作,也是最常用的動作。使用示例 :C: BIRD25_GEMINI_07BReleasemake BIRD25_GEMINI_07B gprs remake。4、clean 功能 :清除所有的目標(biāo)文件,臨時文件,庫文件,可執(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 上運(yùn)行的 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 二進(jìn)制文件。Bootloader :生成 bootloader 二進(jìn)制文件。Ckscatter :檢查 scatter 文件 Mmi_obj_check :檢查運(yùn)行時間值,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 二進(jìn)制文件和elf,lis,sym,htm.*.log文件。實(shí)踐:一,要手動修改 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 不能正常運(yùn)行。 可能是 ResGenerator 文件夾中的某些文件有錯誤。一個原因是 在 ResGenerator 文件夾中缺少 temp.rgb 這個文件,并且不能自動生成。2、240X320 屏的 Font_res.c 文件的錯誤, 因?yàn)榇蜷_了中文字體的編譯開關(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 因?yàn)槟J(rèn)的 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 文件沒有修改,默認(rèn)只打開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 時,最重要的是能夠準(zhǔn)確快速的定位代碼,一般常用的有如下幾種方式1.在模擬器中使用斷點(diǎn) 模擬器中斷跟蹤斷點(diǎn)設(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 / 進(jìn)入一個新的 screen 都會調(diào)用的函數(shù) ExecuteCurrKeyHandler / 執(zhí)行按鍵的函數(shù) ExecuteCurrHiliteHandler ExecuteCurrHiliteHandler_Ext / 執(zhí)行當(dāng)前高亮的函數(shù) ExecuteCurrProtocolHandler /執(zhí)行當(dāng)前協(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è)置變量值改變的斷點(diǎn) 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è)置斷點(diǎn) 跟蹤屏幕每一處字串繪制:設(shè)置斷點(diǎn) UI_move_text_cursor :gui_move_text_cursor =UI_move_text_cursor 圖標(biāo)測量:設(shè)置斷點(diǎn) _measure_image:g
32、ui_measure_image = _measure_image 圖標(biāo)顯示:設(shè)置斷點(diǎn) _show_image:gui_show_image = _show_image 水平線和垂直線的繪制 : 設(shè)置斷點(diǎn) UI_draw_vertical_line和 UI_draw_horizontal_line gui_draw_vertical_line = UI_draw_vertical_line; gui_draw_horizontal_line = UI_draw_horizontal_line; 字串測量、坐標(biāo)位置、打?。涸O(shè)置斷點(diǎn) 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)試前篇文章介紹了手機(jī)調(diào)試的 TRACE 技巧 ,MTK 手機(jī)調(diào)試是比較簡單的 ,除了打 TRACE, 找 ASSERT,分析 DUMP 外,剩下的就是經(jīng)驗(yàn)了 ,有經(jīng)驗(yàn)的人看到現(xiàn)象就能猜到問題出在什么地方 ,簡單看一下 TRACE
34、只是為了確認(rèn)自己的猜測 .初涉此道的朋友往往需要時間 ,慢慢積累經(jīng)驗(yàn) .要達(dá)到熟練 ,就需要有空的時候多讀多研究代碼 .熟練的掌握了代碼 ,解決問題就會熟能生巧 . MTK 的模擬器調(diào)試說沒技巧也是對的 ,說有技巧也不錯 .因?yàn)槟M器的技術(shù)與其說是 MTK 經(jīng)驗(yàn) ,不如說是 VC 經(jīng)驗(yàn) . 由于模擬器能在沒有樣機(jī)的情況做大量的 UI 方面的開發(fā) ,同時模擬器具有快捷 ,所見即所改等優(yōu)點(diǎn) ,因此,受到很多開發(fā)老手的青睞 .熟練掌握模擬器使用技巧 ,對于提高工作效率 ,節(jié)省資源具有很積極的意義 . 工欲善其事 ,必先利其器 .欲了解模擬器調(diào)試 ,就要先了解 VC 使用 .VC 調(diào)試過程中經(jīng)常使用的
35、快捷鍵如下: vc+ 斷點(diǎn)的使用:按F9(設(shè)置斷點(diǎn)) ,F(xiàn)5 調(diào)試, F10 單步調(diào)試, shift+F5 退出調(diào)試F10 單語句執(zhí)行,F(xiàn)11 單指令執(zhí)行, Ctrl+F10 執(zhí)行至光標(biāo)處;F9 按行設(shè)置 /取消斷點(diǎn) , Alt+F9 可按行,按數(shù)據(jù)或按消息設(shè)置斷點(diǎn);調(diào)試時,按 Alt+3 打開跟蹤窗口,Alt+4 打開變量窗口, Alt+5 打開寄存器窗口,Alt+6 打開內(nèi)存窗口,Alt+7 打開堆棧窗口,Alt+8 打開匯編指令窗口;1.只要你有源代碼 ,擁有一個模擬器是一件很容易的事 .當(dāng)然 ,有些情況下 ,這對于初入 MTK 的人來說 ,也是困難的 ,特別是在一些代碼管理不善 ,公司
36、人員眾多 ,員工流動頻繁的公司 ,你永遠(yuǎn)想象不出他們的代碼會有多糟 .不過一般情況下 ,我到一個新公司 ,都會試著去使用他們的代碼編譯得到模擬器 ,不管他們的代碼多么糟 ,我總能快速的編出模擬器來 .只要三個步驟 : a.在編譯模擬器前請關(guān)掉所有 SP 的宏 ,這是很重要的 ,很多 SP 都不提供在模擬器下運(yùn)行的庫 ,所以一個項(xiàng)目 SP 越多 ,在模擬器下 ,他無法識別的函數(shù)也會越多b.在編譯過程中遇到錯誤 ,可以把所有與顯示無關(guān)的代碼全部使用 #ifdef WIN32 宏括起來 ,把所有不認(rèn)識的類型使用 typedef int xxx; 重定義 .把一些不能識別的宏定義使用 WIN32 括起
37、來重定義一下c.在生成 MODIS 時,會遇到大量不認(rèn)識的函數(shù) ,如果少于 50 個,全部建成 void xxx() 類型的空函數(shù) .如果多于一百個 ,嘗試查找這些函數(shù)的來源 ,如果是相關(guān) SP的,就再次補(bǔ)充關(guān)掉相關(guān) SP.當(dāng)然如果你不怕麻煩 ,也可以把這一百個函數(shù)建成空函數(shù) .一般來說 ,把所有第三方功能和與 MTK 無關(guān)的功能關(guān)掉的話 ,不能識別的函數(shù)一般不會超過十個 . 經(jīng)過這樣三步 ,一般情況下你都能得一個差不多可以使用的模擬器.有了模擬器 ,你就可以進(jìn)行下面的工作了 .如果你仍然無法獲得模擬器,建議咨詢你的項(xiàng)目領(lǐng)導(dǎo),如果你的領(lǐng)導(dǎo)也無法解決,說明這個軟件組是一個組員變動很快 ,或者說缺
38、乏條理性的部門 ,當(dāng)然也有可能這個部門的程序員都是一些 MTK 的頂尖層高手 ,他們的程序從來不需要調(diào)試 .總之這是會讓人瘋狂的部門 . 2.如果你順利到到一個模擬器 ,那么就可以開始調(diào)試了 .首先說一下斷點(diǎn) ,VC 中的斷點(diǎn)分三大類 ,一類是本地?cái)帱c(diǎn) ,一類是數(shù)據(jù)斷點(diǎn) (也稱之為條件斷點(diǎn) ,有人稱之為高級斷點(diǎn) ),還是一類是消息斷點(diǎn) ;這三類斷點(diǎn)分別對應(yīng)于快捷鍵 ALT+F9 打開的對話框中三個選項(xiàng)卡 .由于消息斷點(diǎn)是用于跟蹤 WIN 的消息 ,所以在 MTK 中用不著 .在模擬器中一般我們只使用本地?cái)帱c(diǎn)與數(shù)據(jù)斷點(diǎn) .本地?cái)帱c(diǎn)和數(shù)據(jù)斷點(diǎn)在 BUG 調(diào)試中舉足輕重 ,熠熠生輝。 熟練掌握斷點(diǎn)技
39、巧,可以使工作事倍功半??赡苡行┤藭褂脭帱c(diǎn) ,但卻不知道斷點(diǎn)在模擬器中有什么妙用 .斷點(diǎn)有兩個最常使用也的作用 ,一是跟蹤代碼執(zhí)行情況 ,二是觀察斷點(diǎn)處局部變量值的變化 .這兩個功能應(yīng)用最多 .但他在 MTK 模擬器中還有兩個隱含的用途 ,一就是快速定位文件 ,MTK 本身的源代碼大約有差不多上萬個文件 ,而加入 SP 后,代碼大約已經(jīng)超過了萬數(shù) .在這里面查找文章 ,查找函數(shù) ,是一件很困難的事,這時就需要使用斷點(diǎn)了 .你在代碼閱讀工具 SI 中可以很輕松的利用 CTRL+O 打開文件 ,也可以使用 F7快速定位到函數(shù) ,但在 VC 中卻沒這么方便 ,不過你可以使用斷點(diǎn) ,比如想在 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 行。這是文件斷點(diǎn),也可以打函數(shù)斷點(diǎn),比如文件wgui_categories_CM.c 的 4693 行對應(yīng)的是函數(shù) ShowCategory16Screen,也可以直接在 break at 編輯框里輸入 ShowCategory16S
41、creen,使用 F5 鍵 DEBUG 時,函數(shù)運(yùn)行到撥號界面時,就會停下來供你調(diào)試。本地?cái)帱c(diǎn)就是這樣使用的。那么本地?cái)帱c(diǎn)有什么用呢?或者說有什么特殊用途呢?簡單舉幾個例子吧 ,但斷點(diǎn)可以應(yīng)用于解決十分多的問題中 ,不要因?yàn)槲业睦邮`了你的想象力 . a.如何使用斷點(diǎn)快速定位到問題點(diǎn)呢?如果我們發(fā)現(xiàn),撥號窗口顯示出了問題,但我們對代碼不熟,不知道撥號窗口的代碼在哪個文件,哪一行, 我們就可以在 EntryNewScreen 函數(shù)上打斷點(diǎn), 當(dāng)進(jìn)入撥號時他就會停下來, 這時我們能過堆棧窗口信息就可以很輕松的找到這個窗口的實(shí)現(xiàn)函數(shù)。詳細(xì)研究代碼 ,就可以找到解決方法 . b.斷點(diǎn)可以用于快速解決
42、窗口顯示問題 ,比如我們的撥號窗口 ,有一個圖片顯示不正常 ,這時我們可以在繪圖函數(shù) gdi_image_codec_draw 上打上斷點(diǎn) ,進(jìn)入撥號窗口中 ,每一次顯示圖片 ,都會在該函數(shù)上停下來 ,結(jié)合堆棧 ,我們可以很容易找到是哪個地方代碼出來問題 ,從而找到解決方法 .有關(guān)此類的函數(shù)太多 ,不一一舉例 . C.斷點(diǎn)可以用來研究全局變量被意外修改問題 ,我們打開斷點(diǎn)對話框 ,選第二個選項(xiàng)卡 ,把需要跟蹤的變量打進(jìn)去 ,當(dāng)每次變量變化時 ,VC 都會停下來等我們調(diào)試 .也可以設(shè)置條件 ,假設(shè)某全局變量 U8 g_XXX, 其值等于 5 時會出錯 ,但你不知道這個全局變量在什么地方被什么代碼
43、賦值為 5,這時就可以設(shè)置數(shù)據(jù)斷點(diǎn) ,在第二選項(xiàng)卡上面的對話框里輸入 g_XXX = 5, 當(dāng)其值為 5 時就會停下來 . d.研究代碼也可以使用斷點(diǎn) ,比如 MTK 代碼里使用有很多函數(shù)指針封裝 ,例如 gui_print_text 指針 ,你想研究他的實(shí)現(xiàn)過程 ,但由于是指針 ,你找不到他的函數(shù)體 ,這時你就可以在數(shù)據(jù)斷點(diǎn)中 ,把指針 gui_print_text 輸入進(jìn)去 ,重啟模擬器時 ,他就會定位到 ui_print_text 函數(shù)處 . 茲舉這四個例子吧 ,斷點(diǎn)可以使用于你需要調(diào)試的任何場合 ,但過多的斷點(diǎn)會影響你查找問題的速度 ,等熟練使用時 ,就可以有針對性的對某些變量和函數(shù)打
44、斷點(diǎn)以解決問題.這是一個積累的過程3.堆棧調(diào)試 ,Alt+7打開堆棧窗口 .該窗口中我們可以看到函數(shù)之間的調(diào)用關(guān)系,這是十分有用的,一般都是結(jié)合斷點(diǎn)使用,定位 BUG 和研究代碼十分有用.由于上面有例子,這里就不舉了,閱讀代碼解決BUG4.變量窗口 ,Alt+4打開變量窗口 ,該窗口會自動顯示斷點(diǎn)代碼處使用的變量及其值時使用 ,單步執(zhí)行時經(jīng)常參考該窗口數(shù)據(jù)5.WATCH 窗口 ,按 Alt+3 打開 ,由于變量窗口自動顯示的變量有時不是我們需要的 ,這時就可以把我們需要查看的變量拖放到該窗口研究 ,結(jié)合斷點(diǎn)使用 ,并且這里也支持表達(dá)式取值 ,真是太棒了 . 6.內(nèi)存窗口 ,Alt+6 打開內(nèi)存
45、窗口 ,內(nèi)存窗口可以顯示一塊內(nèi)存的內(nèi)容 ,這是很有用的 ,比如我們要跟蹤短信內(nèi)容 ,有一個短信內(nèi)容的指針 ,把該指針輸入 WATCH 窗口 ,只能看到該指針指向的第一個值 ,要看其他的 ,會很麻煩 ,你只能輸入表達(dá)式 ,但你把該指針輸入內(nèi)存窗口 ,就不必這樣費(fèi)事了7.Alt+8 打開匯編指令窗口 ,這個窗口用處不是很大 ,學(xué)習(xí)匯編的話 ,還是有用處的 .一般情況下 ,如果第三方的庫文件出了問題 ,也就只能使用這個窗口調(diào)試了 .普通情況下 ,如果錯誤定位在 C 標(biāo)準(zhǔn)庫文件的匯編代碼上,只有一種可能 ,就是你的調(diào)用出錯了 . 調(diào)試占了研發(fā)的很大一部分時間 ,調(diào)試的基本技術(shù)就這樣 ,一般情況下是綜合
46、運(yùn)用 ,靈活掌握 ,以期快速解決問題 ,穩(wěn)定代碼 .剩下就是經(jīng)驗(yàn)積累的問題了 . TRACE 使用的技巧MTK 的調(diào)試一般來說可以分為仿真調(diào)試與手機(jī)調(diào)試 .這兩種調(diào)試對于研發(fā)新功能 ,修改 BUG,研究算法都是十分重要的 .當(dāng)然 ,這兩種調(diào)試也有差異 ,有時會出現(xiàn)在模擬器運(yùn)行正常 ,在手機(jī)卻運(yùn)行失敗 ,或者相反 ,這就突出了軟件模擬環(huán)境與硬件手機(jī)環(huán)境的差別 .原因可能是各種各樣的 ,比如可能是有些硬件軟件沒有辦法模擬 ,有些新功能對硬件依賴強(qiáng) ,不能模擬 ,新軟件的有些函數(shù)只能在手機(jī)上運(yùn)行 ,沒有寫相應(yīng)的模擬器代碼 .等等原因都會導(dǎo)致兩者差異 .這里不一一贅述 ,大家知道模擬器和手機(jī)有差異就行
47、了 . 模擬器調(diào)試具有直觀 ,快速 ,追蹤方便能優(yōu)點(diǎn) ,受到很多 MMI 開發(fā)者的喜歡 .而有關(guān)模擬器的調(diào)試 ,其他也就是 VC 調(diào)試功能的使用 .由于國內(nèi)軟件教育重編程 ,算法 ,輕調(diào)試 ,所以很少有系統(tǒng)的調(diào)試方書的書 .在開發(fā)過程中 ,我也見過許多人壓根就不使用模擬器 ,他們認(rèn)為模擬器也就是在沒有手機(jī)的時候使用 .詳細(xì)講解模擬器的調(diào)試就放到以后 ,因?yàn)槟M器斷點(diǎn) ,內(nèi)存 ,堆棧 ,變量各個方面的調(diào)試 ,詳細(xì)寫來都可以成一篇文章 .這里先講一個手機(jī)調(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)過這樣的改進(jìn),我的 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)一款手機(jī) ,由于 ROM 過于緊張 ,添加幾條 TR
51、ACE 就會出現(xiàn)編譯錯誤 ,去掉 TRACE就編譯通過了 ,導(dǎo)致出了 BUG 調(diào)試十分的麻煩 .如何寫一種使用時可以 TRACE 錯誤 ,不使用時又不占用系統(tǒng)資源的 TRACE 呢 ,我見許多人這樣處理 ,因?yàn)?NULL 會被編譯器優(yōu)化點(diǎn) ,后面括號變成一個表達(dá)式了 .表達(dá)式對系統(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)認(rèn)為這樣寫可以在不使用時 ,把宏函數(shù)變?yōu)樽⑨尫?,但我的一個朋友認(rèn)為這樣寫 ,并不能把我的函數(shù)變成注釋符 ,他的道理是雙斜線會被編譯器外忽略掉 ,我認(rèn)為是有道理的 ,后來我的朋友經(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)有一段費(fèi)了我很大 功夫的 TRACE 代碼 : #define DBG_PRINTF(_x_) do printf(%s(%d)-:,_FILE_,_LINE_); printf _x_; while(0); 當(dāng)時怎么想都不明白
54、為什么會有這么古怪的使用printf _x_;后來才發(fā)現(xiàn)使用時要加雙層括號才能正常使用。6.在手機(jī)與網(wǎng)絡(luò),手機(jī)與電腦的交互過程中,有時我們需要TRACE 數(shù)據(jù)包的內(nèi)容,特別在顯示不正確或者不精確的情況下,需要研究數(shù)據(jù)包的數(shù)據(jù)是使用 UTF 編碼,還 UCS2 編碼,還是 ASC 編碼,這時 我們就需要 TRACE 數(shù)據(jù)的字節(jié)內(nèi)容,從而便于分析。我一般使用下面這個自己隨手寫的函數(shù)來實(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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 調(diào)解會統(tǒng)計(jì)報送制度
- 行政處罰告知結(jié)果反饋時效制度
- 2026上半年黑龍江省海員總醫(yī)院(黑龍江省第六醫(yī)院)事業(yè)單位招聘8人參考考試題庫附答案解析
- 河南輔警考試試題及答案
- 2026福建福州經(jīng)濟(jì)技術(shù)開發(fā)區(qū)機(jī)關(guān)事務(wù)服務(wù)中心招聘編外聘用人員1人備考考試試題附答案解析
- 2026新疆北京銀行烏魯木齊分行招聘備考考試試題附答案解析
- 2026廣東警官學(xué)院保衛(wèi)工作部校衛(wèi)隊(duì)隊(duì)員招聘備考考試題庫附答案解析
- 2026春季夢想靠岸招商銀行佛山分行校園招聘參考考試題庫附答案解析
- 2026陜西西安交通大學(xué)第一附屬醫(yī)院肝膽外科招聘派遣制助理醫(yī)生參考考試題庫附答案解析
- 2026廣西梧州市面向社會公開考試招聘中小學(xué)(幼兒園)教師260人參考考試題庫附答案解析
- 2025年社工社區(qū)招聘筆試題庫及答案
- 學(xué)堂在線 雨課堂 學(xué)堂云 生活英語聽說 期末復(fù)習(xí)題答案
- 倉庫貨物擺放標(biāo)準(zhǔn)培訓(xùn)課件
- 2023年運(yùn)動控制工程師年度總結(jié)及下一年展望
- 江蘇省高級人民法院勞動爭議案件審理指南
- 低蛋白血癥的護(hù)理查房知識ppt
- 眼科常見疾病診療規(guī)范診療指南2022版
- 30以內(nèi)加法運(yùn)算有進(jìn)位1000題1
- 戰(zhàn)略成本1-6章toc經(jīng)典案例
- 新藥臨床使用觀察表
- GB/T 34202-2017球墨鑄鐵管、管件及附件環(huán)氧涂層(重防腐)
評論
0/150
提交評論