巧用map文件查找越界問題

在基于KEIL的項目開發過程中,會遇變量值與預設的運行結果不一樣,在掛上仿真器debug了n個小時,排除了所有邏輯問題后,發現似乎這個值被意外更改了,但是要找到是誰修改了他卻不好下手?,F提出一種查找此類問題的方法——利用map文件查找越界。

Image placeholder
管理員 2021-04-01 15:49

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。


評論0