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