在進行嵌入式多任務系統軟件開發,可能會出現堆棧溢出的問題,並且該問題可能是隨機出現,因此調查較麻煩。藉助keil 的數據斷點功能,可以輕鬆找到產生堆棧溢出的位置。
在程序調試時,常規使用的斷點是程序斷點,本文提到的則是一種數據斷點。以下將列出具體的調試方法。
1、任務的堆棧溢出一般是棧底溢出,在編譯完成之後。如果堆棧通過固定地址分配,則通過查詢keil 生成的.map獲取棧底地址;否則需要在任務創建過程中分配的堆棧時獲取棧底地址,將堆棧地址變量“pxNewTCB->pxStack”添加到變量監視區。
2、在獲取到堆棧地址之後,在該變量上單擊右鍵選擇“數據訪問斷點”
3、在彈出的對話框中,選中“Write”選項,根據需要設置Count的值。如果stack堆棧在系統初始化時有初始化過程,則需要將該值Count值設置爲2,否則一般設置爲1即可以捕獲程序意外設置該堆棧的位置。
4、斷點設置好之後,就等着堆棧溢出發生了,如果程序意外設置了該數據內容,則程序會停下來,此時即可得到發生堆棧溢出的程序位置,進行展開調查了。
在上述操作中,如果堆棧地址通過固定分配。則通過map文件中的變量查詢來獲取該地址。在命令輸入窗口輸入命令即可以設置該數據訪問斷點。
bs write 0x20002000,1
更多斷點的高級應用可以參考另外一篇博文