01
前言
在基于KEIL的項目開發(fā)過程中,會遇變量值與預(yù)設(shè)的運(yùn)行結(jié)果不一樣,在掛上仿真器debug了n個小時,排除了所有邏輯問題后,發(fā)現(xiàn)似乎這個值被意外更改了,但是要找到是誰修改了他卻不好下手?,F(xiàn)提出一種查找此類問題的方法——利用map文件查找越界。
02
MAP文件輸出
首先需要設(shè)置map的輸出,在MDK-ARM的Option for Target—Output Listing的標(biāo)簽頁中設(shè)置需要輸出的map文件內(nèi)容,如圖:
03
MAP文件分析
在工程編譯完成后在設(shè)置的目錄下會生成項目名.map的文件。大致來說map到可以分為如下幾個部分:
-
Section Cross References:模塊、段的交叉引用關(guān)系;
-
Removing Unused input sections from the image:移除未使用的段;
-
Image Symbol Table:映射符號表,列出了各個段所存儲的對應(yīng)地址;
-
Memory Map of the image:映像的內(nèi)存分布;
-
Image component sizes:映像組組件大小。
解決越界數(shù)據(jù)修改問題我們主要關(guān)注的是Image Symbol Table部分。例如:
含義為:
-
Symbol Name:符號名稱
-
Value:存儲對應(yīng)的地址;
0x0800xxxx指存儲在FLASH里面的代碼、變量等。
0x2000xxxx指存儲在內(nèi)存RAM中的變量Data等。
-
Ov Type:符號對應(yīng)的類型
符號類型大概有幾種:Number、Section、Thumb Code、Data等;
-
Size:存儲大小
-
Object(Section):當(dāng)前符號所在段名
現(xiàn)假設(shè)在調(diào)試中的一個全局變量u8 g_testFlag數(shù)值與邏輯總是不符,那么就可以懷疑被意外修改了,在map文件中搜索g_testFlag,看到在g_testFlag所在地址前是一個u8 upgradeFileName[15]。那么問題就很可能是upgradeFileName操作是越界了。
查找代碼中發(fā)現(xiàn)存在如下操作,
memcpy(upgradeFileName,"MyUpgradeFile001.bin",21);
upgradeFileName被memcpy后,越過了它的size范圍,而修改了鄰近地址的g_testFlag。
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!