MTK入门相关知识总结.docx
精品名师归纳总结1.1. 编写目的MTK 编译过程可编辑资料 - - - 欢迎下载精品名师归纳总结本文编写的目的主要是为了从整体上懂得MTK 的编译过程, 以便能够较快的处理编译中遇到的问题, 同时为以后可能的优化编译过程供应参考。1.2. 简介MTK 的编译过程主要是在windows 命令行下通过MakeFile 文件来执行相应的perl 脚本或 c 程序,将资源包生成c 源程序, 并与相应模块的c 程序生成 .o,.lib 或.obj 的中间代码, 最终生成在手机上使用的.bin 文件和在模拟器上使用的mmiresource.dll 资源文件。1.3. 编译命令命令说 明Clean清除全部的目标文件、库文件和日志文件清除并重新编译全部的文件。主要完成工作:可编辑资料 - - - 欢迎下载精品名师归纳总结NewUpdateRemakegsm2.mak cleanall cmmgen mmi_feature_check asngen codegen asnregen operator_check_lite update重新编译资源文件,生成相应的目标文件。主要完成的工作:gsm2.mak cleanlog cleanbin mcddll_update codegen resgen cksysdrv remake仅仅编译依靠修改过的文件生成的模块。主要完成的工作:gsm2.mak mcp_check cleanlog cleanbin genverno libs $BIN_FILE done可编辑资料 - - - 欢迎下载精品名师归纳总结1.4. 编译相关的文件编译用到的文件主要放在make 文件夹中。各个文件的简要说明如下:文件名说 明Gsm2.mak编译过程中主要执行的make 文件,这个文件从命令行获得编译参数,做出相应的处理。它定义了各个参数的执行过程,包括:new 、remake 、update等。以及调用其它perl 或 c 程序生成目标文件。Option.mak定义了编译环境中用到的工具及相关的目录,依据大的编译开关定义了小的编译和链接选项,编译中包含文件和生成文件的路径,定义trace 的头文件路径,全局的编译开关,用户的一些编译选项,最终定义了编译路径和目录。XXX.lisXXX 模块的 .c 文件XXX.pthXXX 模块的 .c 文件存放的路径XXX.defXXX 模块用到的编译开关,当 XXX 模块引用其它模块中在编译开关下定义的变量、函数或宏时, 就需要将这个编译开关加进来。XXX.incXXX 模块用到的头文件路径,需要将XXX 模块引用的头文件及,头文件引用的头文件的路径均要包含进来。XXX_GPRS.mak定义了需要编译的模块列表、编译中包含文件和生成文件的路径,定义trace 的头文件路径,全局的编译开关,用户的一些编译选项,最终定义了编译路径和目录。Comp.mak编译和集成模块源文件,编译生成库文件。构建目标代码依靠列表,设置每个模块的编译路径及编译选项,设置生成目标lib 的路径,设置生成obj 的路径可编辑资料 - - - 欢迎下载精品名师归纳总结buildinfo.tmpcompbld.tmp MT6218B.log包含了在 Gsm2.mak和 Option.mak中用到的项目和平台名称包含了编译每个模块时的编译信息。记录了 Gsm2.mak文件编译过程MT6218Br目录MT6218Bo目录包括了每个模块依靠的头文件包含全部生成的obj 文件和 lib 文件。1.5. 编译指令1、new功能 :全新开头构建整个工程的ARM 版,包括图片、声音、字符串等资源都要重做。在构建工程过程中,清除全部的目标文件,库文件,日志文件等。New 指令仍会自动创建必要的目录、移除暂时文件和中间脚本、更新日志文件。过程简要说明:new->cleanall->sysgen->ckscatter->mmi_feature_check->asngen->codegen->asnregen->operator_check_lit->$BTLD_BIN_FILE->update。依靠指令 : new 依靠的其他指令最多,其中包括cleanall,sysgen,ckscatter,mmi_feature_check,asngen,codegen,asnregen,operator_check_lite,update.用途 : new 指令是最完全也是耗时最长的一个动作,一般得到一个新的MTK 发布版本后由项目负责人要做一次。使用示例 : C: BIRD25_GEMINI_07BRelease>make BIRD25_GEMINI_07B gprs new。2、update功能 : update 是重新更新整个工程的ARM 版,该动作会扫描工程中文件和库的依靠关系,如依靠关系有变化会建立新的依靠关系,随后依据新的依靠关系重新编译链接有改动的部分。Update 指令不依靠cleanall 指令,所以它不会删除目标文件和库文件,也不会去更新日志文件和创建目标目录,这一点和 remake相像,这也是为什么执行时间比new 短的缘由。过程简要说明: update->cleanlog->cleanbin->mcddll_update->codegen->resgen->cksydrv->remake。依靠指令 : cleanlog,cleanbin,mcddll_updata,codegen,resgen,cksydrv,remake 。用途 : update 是耗时较长的一个指令,一般在增加或删除一些驱动或应用情形下使用。使用示例 : C: BIRD25_GEMINI_07BRelease>make BIRD25_GEMINI_07B gprs update。3、remake功能 :remake 是重新编译整个工程的ARM 版,该动作只是简洁的重新编译链接有改动的部分。它不检查依靠关系.不扫描资源,只扫描代码的转变,有转变的重编,资源和无转变的代码不编。过程简要说明: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 调用编译器和连接器将各个模块目录下的C 文件编译连接为独立的库。 $BIN_FIKE 是将各个模块编译连接的库和mtk_lib 目录下的库一起连接起来得到一个映像文件, 然后使用ADS 的工具 fromelf 将映像文件生成以变量BIN_FILE命名的二进制文件,该文件可以下载到硬 件板上运行。用途 : remake 是耗时最短的一个动作,也是最常用的动作。使用示例 : C: BIRD25_GEMINI_07BRelease>make BIRD25_GEMINI_07B gprs remake。4、clean功能 :清除全部的目标文件,暂时文件,库文件,可执行文件,更新日志文件。仍可以用于某个模块相关的清除工作。过程简要说明: check build root 、target folder 、comp、 lib 、comp log folder->clean bin folder 、 elf 、lis、htm、 log files 、tst database files、obj,lib files 。依靠指令 : cleanlog,cleanbin,cleanmod,cleancodegen 等。用途 :作为其它命令所依靠的指令,仍有就是清除工程或者指定模块对象的类库。使用示例 : C: BIRD25_GEMINI_07BRelease>make BIRD25_GEMINI_07B gprs clean,C: BIRD25_GEMINI_07BRelease>make BIRD25_GEMINI_07B gprs clean Init。5、其他命令介绍new_modis :是全新构建整个工程的PC 模拟版,其调用 VC 的编译器和链接器得到一个可以在windows 上运行的PC 模拟版。 MMI应用软件工程师可以在没有硬件板的情形下在PC 上检查和调试自己写好的应用。codegen_modis: 产生 modis 需要的 trace 文件的 datebase。gen_modis :产生 vc 工程文件。remake_modis :重新编译整个工程的PC 版。Codegen :创建 TST 数据库。它依靠的指令有:cleancodegen,asngen,umts_gen,codegen,asnregen,cleanbin,mcddll_update,done。Cleancodegen :删除 codegen.lis。Resgen:生成 MMI 资源。它依靠的指令有:code_generate,cleancodegen,asngen,codegen,asnregen,cleanbin,mcddll_update,done。 Cmmgen :生成 CMM 文件。Sysgen:生成内存映射文件,并放在CUSTOMER 文件夹里面。Emigen :生成 flash_opt.h,custom_EMI.h,custom_EMI.c和 custom_switchclock.c 文件。可编辑资料 - - - 欢迎下载精品名师归纳总结Emiclean :清除 EMI 设置。Mmi_feature_check:依据 MMI_features.h 和 MMI_features_switch.h中宏定义的不同来产生info.log 文件。Operator_check : 检查 customer 的宏是否被修改,假如修改产生相应log 文件。Fota :生成 FOTA 二进制文件。Bootloader :生成 bootloader 二进制文件。Ckscatter :检查 scatter 文件Mmi_obj_check: 检查运行时间值,e.g,联合体元素的大小等。Med_mem_check :检查 media memory 。该指令依靠gencustominfo gen_infolog nvram_auto_gen 。Dummy_data_check: 检查虚拟数据。Viewlog :查看日志文件。Cksysdrv :检查系统驱动是否为满。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 -> emigen -> r( 2)打开了USB_DOWNLOADemiclean -> emigen -> bootloader -> c,r custom init drv -> raction= newcodegen, resgen, clean, update default= update or uscan, compile, link= slim_updatescan, compile, link without generating mcddll= remake or rcompile, link= clean or cclean= cci or clean_codegen clean codegen intermedia files= resgenresgen= c,uclean then update= c,rclean then remake可编辑资料 - - - 欢迎下载精品名师归纳总结= codegencodegen= slim_codegencodegen without generating mcddll= update_mcddllcodegen and generate mcddll= slim_mcddllgenerate mcddll without codegen= viewlogopen edit to view build log= emigenemigen= emicleanemiclean= check_depcheck dependency modules after sources/headers changed= remake_depcheck_dep, remake= update_depcheck_dep, updateExample:make gsm newMT6205B EVB newmake gprs codegenMT6218B EVB codegen make mt6219 gprs updateMT6219 EVB update make firefly17_demo gprs newmake milan_demo gprs c,u init custom make mt6219 gprs r init custom drvmake 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.c1.6. 常见编译错误1、mtk_resgenerator.exe 不能正常运行。可能是 ResGenerator 文件夹中的某些文件有错误。一个缘由是在 ResGenerator 文件夹中缺少temp.rgb 这个文件,并且不能自动生成。2、240X320 屏的 Font_res.c 文件的错误, 由于打开了中文字体的编译开关,只需要将mmi_featurespluto.h文件中 MMI_LANG_SM_CHINESE的编译开关关闭即可。3、显现以下错误,"plutommi/mmi/FunAndGames/FunAndGamesSrc/Game.c", line 349: Error: C2455E: array 0 found "plutommi/mmi/FunAndGames/FunAndGamesSrc/Game.c", line 350: Error: C2455E: array 0 found由于默认的240X320 屏幕打开的关于嬉戏的编译开关下没有嬉戏,所以需要打开mmi_featurespluto.h文件中的 MMI_GAME_VSMJ_240x320编译开关。4、现象: mmiresource 模块生成错误:可编辑资料 - - - 欢迎下载精品名师归纳总结"plutommi/Customer/custresource/custimgmapext.c", line 31: Error: C2456E: undeclared name, inventing 'extern int MAX_IMAGE_IDS'"plutommi/Customer/custresource/custimgmapext.c", line 31: Serious error: C2958E: illegal in constantexpression: non constant 'MAX_IMAGE_IDS' plutommi/Customer/custresource/custimgmapext.c: 0 warnings, 1 error, 1 serious error缘由:转变了屏幕大小后,128X160 目录下的图片资源有问题。解决方法:更换128X160 目录下的图片资源,重新编译此模块。5、现象: 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、现象:在新加模块的.c 文件中引用一个b.h,产生 b.h 中的 aaa变量没有定义的错误,具体错误如下:缘由:没有包含定义aaa变量的头文件a.h。解决方法:在include b.h 之前 include a.h7、现象: "plutommi/Customer/custresource/CustImgDataHW.h", line 19361: Serious error: C2934E: duplicate definition of 'CUSTOMERIMAGESEMPTYIMAGE_BMP'缘由:解决方法:删掉CustImgDataHW.h 这个文件重新编译8、现象:在链接bin 文件时,显现以下错误:Error: L6218E: Undefined symbol custom_setAdvEMI referred from bootarm.obj.缘由: custominfo.pl 文件没有修改,默认只打开CCDH26_05C_GPRS.mak 一个文件,并不打开其它定义编译开关的文件,导致custom 模块中的有些文件没有编译,所以一些变量在最终链接时显示未定义。解决方法:修改custominfo.pl 文件。8、现象:编译某个模块,显现错误:Error: L6218E: Error: C2933E: type disagreement for 'mmi_phb_info_entry_list'缘由:调用mmi_phb_info_entry_list函数时传递的参数不正确,或者是函数mmi_phb_info_entry_list在调用时仍未定义。解决方法:修改custominfo.pl 文件。9、现象:编译时显现字符串未定义的错误,enum_list.h:2046: error: STR_ENTERTAINMENT_EXPLAIN_WOMANKNOWLEDGE' undeclareere可编辑资料 - - - 欢迎下载精品名师归纳总结not in a function缘由:可能是编译开关没打开,或者是正在使用excel 表, readexcel.c 中没有添加相关的头文件。仍有一种可能是在使用这个字符串ID 的模块的make 底下的 .inc 文件中没有将定义这个字符串的头文件路径加上。仍要留意防止头文件引用的宏定义是不是重复。MTK 快速调试定位的几种方法在 debug 调试时你或许常常发觉有思路如何改,但就苦于找不到要改的的方。所以快速的定位代码是至关重要。在debug 时,最重要的是能够精确快速的定位代码,一般常用的有如下几种方式1.在模拟器中使用断点模拟器中断跟踪断点设置函数:/ 触屏相关wgui_touch_screen.c wgui_general_pen_down_hdlr /触摸屏按下函数wgui_general_pen_move_hdlr /触摸屏移动函数wgui_general_pen_down_hdlr /触摸屏松开函数wgui_general_pen_repeat_hdlr /重复wgui_general_pen_abort_hdlr /舍弃操作在 wingui.c此函数中setup_UI_wrappers 有相关全局变量的初始赋值和定义EntryNewScreen/ 进入一个新的screen 都会调用的函数ExecuteCurrKeyHandler /执行按键的函数ExecuteCurrHiliteHandlerExecuteCurrHiliteHandler_Ext /执行当前高亮的函数ExecuteCurrProtocolHandler/ 执行当前协议栈的函数execute_softkey_function/执行 softkey 的函数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 个字符的带边框色字符串可编辑资料 - - - 欢迎下载精品名师归纳总结UI_print_bordered_character / 画一个的带边框色字符UI_print_character/ 画一个字符gdi_image_draw/ 从绘图大事开头跟踪的函数_show_image/ 画一个 gif_show_transparent_image/画有设透亮色的图片_show_animation_frame/ 画设置祯数的图片gdi_layer_blt_previous/ 同一个 layer 刷新某一区域的函数gdi_layer_blt_ext/ 几个 layer 叠加显示时刷新某一区域的函数UI_BLT_double_buffer/刷新一块区域UI_set_font/ 设置字体3。在模拟器中设置变量值转变的断点4。搜寻菜单ID如 MAIN_MENU_ENTERTAINMENT_MENU_ID5。搜寻字符串ID 如 MAIN_MENU_MENU_TEXT6。搜寻图片ID如 MAIN_MENU_PHONEBOOK_ICON7. 超级终端调试:8. Catcher 调试2. MMI绘制设置断点跟踪屏幕每一处字串绘制:设置断点UI_move_text_cursor : gui_move_text_cursor =UI_move_text_cursor图标测量:设置断点 _measure_image: gui_measure_image = _measure_image图标显示:设置断点 _show_image: gui_show_image = _show_image水平线和垂直线的绘制:设置断点UI_draw_vertical_line和 UI_draw_horizontal_line gui_draw_vertical_line = UI_draw_vertical_line;gui_draw_horizontal_line = UI_draw_horizontal_line;字串测量、坐标位置、打印:设置断点UI_print_text 、UI_measure_string、 UI_move_text_cursor gui_measure_string = UI_measure_stringgui_move_text_cursor =UI_move_text_cursor可编辑资料 - - - 欢迎下载精品名师归纳总结gui_print_text =UI_print_text绘制图片的函数:gdi_image_draw->gdi_image_codec_drawMODIS 调试前篇文章介绍了手机调试的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. 在编译过程中遇到错误,可以把全部与显示无关的代码全部使用#ifdefWIN32宏括起来 ,把全部不熟悉的类型使用typedef int xxx; 重定义 .把一些不能识别的宏定义使用WIN32 括起来重定义一下c. 在生成 MODIS 时,会遇到大量不熟悉的函数,假如少于 50 个,全部建成 void xxx类型的空函数.假如多于一百个 ,尝试查找这些函数的来源,假如是相关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 编辑框里输入,E:JMT_1120plutommimmiGUIGUI_SRCwgui_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 标准库文件的汇编代码上,只有一种可能,就是你的调用出错了.调试占了研发的很大一部分时间,调试的基本技术就这样,一般情形下是综合运用,敏捷把握 , 以期快速解决问题 ,稳固代码 .剩下就是体会积存的问题了.TRACE 使用的技巧MTK 的调试一般来说可以分为仿真调试与手机调试.这两种调试对于研发新功能 ,修改 BUG,争论算法都是非常重要的 .当然 ,这两种调试也有差异 ,有时会显