單片機(jī)開發(fā)過程中的調(diào)試絕招-直播課件_第1頁(yè)
單片機(jī)開發(fā)過程中的調(diào)試絕招-直播課件_第2頁(yè)
單片機(jī)開發(fā)過程中的調(diào)試絕招-直播課件_第3頁(yè)
單片機(jī)開發(fā)過程中的調(diào)試絕招-直播課件_第4頁(yè)
單片機(jī)開發(fā)過程中的調(diào)試絕招-直播課件_第5頁(yè)
已閱讀5頁(yè),還剩30頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、單片機(jī)開發(fā)過程中的韋東山調(diào)試絕招韋東山從業(yè)20年,15年嵌入式培訓(xùn)經(jīng)驗(yàn),涉及Linux、FreeRTOS、RT-Thread等,專注于嵌入式操作系統(tǒng)。主題絕招1:?;厮菰砑笆纠^招2:修改bin文件自己實(shí)現(xiàn)斷點(diǎn)直播對(duì)應(yīng)的源碼,請(qǐng)加微信索取一、?;厮輧?nèi)容:棧回溯的原理修改異常處理函數(shù)打印棧內(nèi)容示例:手工分析棧,找出函數(shù)調(diào)用關(guān)系?;厮莸脑碚{(diào)試程序時(shí),經(jīng)常發(fā)生這類錯(cuò)誤:讀寫某個(gè)地址,導(dǎo)致程序崩潰調(diào)用某個(gè)空函數(shù),導(dǎo)致程序崩潰在異常處理函數(shù)中,可以打印出”發(fā)生錯(cuò)誤瞬間”的所有寄存器我們調(diào)試時(shí),可以根據(jù)這些寄存器,知道發(fā)生錯(cuò)誤的位置。但是,光知道發(fā)生錯(cuò)誤的位置還不夠!比如,根據(jù)打印信息知道在C函數(shù)里發(fā)

2、生錯(cuò)誤,但是你無法確定是在哪個(gè)調(diào)用鏈上出錯(cuò):A B C時(shí)出錯(cuò)? D C時(shí)出錯(cuò)?我們希望得到:出錯(cuò)時(shí)的函數(shù)調(diào)用關(guān)系怎么辦?分析棧!C語言函數(shù)的返回地址,保存在棧里棧內(nèi)容示例2. 修改異常處理函數(shù)打印棧內(nèi)容發(fā)生錯(cuò)誤時(shí),異常函數(shù)如何處理?太浪費(fèi)!我們可以打印更多信息!發(fā)生錯(cuò)誤時(shí),棧的使用情況修改HardFault_HandlerIMPORT rt_hw_hard_fault_exception EXPORT HardFault_HandlerHardFault_Handler PROC ; get current context TST lr, #0 x04 ; if(!EXC_RETURN2) I

3、TE EQ MRSEQ r0, msp ; 2=0 = Z=1, get fault context from handler. MRSNE r0, psp ; 2=1 = Z=0, get fault context from thread. STMFD r0!, r4 - r11 ; push r4 - r11 register STMFD r0!, lr ; push exec_return register TST lr, #0 x04 ; if(!EXC_RETURN2) ITE EQ MSREQ msp, r0 ; 2=0 = Z=1, update stack pointer t

4、o MSP. MSRNE psp, r0 ; 2=1 = Z=0, update stack pointer to PSP. PUSH lr BL rt_hw_hard_fault_exception POP lr ORR lr, lr, #0 x04 BX lr ENDP打印寄存器和棧3.示例:手工分析棧,找出函數(shù)調(diào)用關(guān)系要分析棧,需要得到程序的反匯編碼fromelf -text -a -c -output=all.dis F103_ModuelF103_Moduel.axf 3.1 根據(jù)PC值在反匯編文件中找到發(fā)生錯(cuò)誤的位置3.2 發(fā)現(xiàn)函數(shù)C太簡(jiǎn)單,它根本沒有使用棧, 函數(shù)C執(zhí)行完,直接返

5、回到LR。 在打印的信息中,LR=0 x08000383,去掉bit0,就是:0 x08000382 根據(jù)這個(gè)值,在反匯編文件中找到函數(shù)C的調(diào)用者,是函數(shù)B3.3 在函數(shù)B的入口處,發(fā)現(xiàn)使用了8字節(jié)的棧,并且保存了LR3.4 分析函數(shù)B的棧:確定返回地址LR=0 x08000355,bit0清零后就是0 x080003543.5 在反匯編中搜0 x08000354 ,確定函數(shù)B的返回地址是函數(shù)A3.6 在函數(shù)A的入口處,發(fā)現(xiàn)使用了8字節(jié)的棧,并且保存了LR3.7 分析函數(shù)A的棧:確定返回地址LR=0 x08001d99,bit0清零后就是0 x08001d98 這是TestDebug函數(shù)3.8 最終,調(diào)用鏈為:TestDebugABC主題內(nèi)容二、修改bin文件實(shí)現(xiàn)斷點(diǎn)內(nèi)容:什么情況下需要打斷點(diǎn)怎樣人為觸發(fā)斷點(diǎn)修改異常處理函數(shù)打印寄存器和棧內(nèi)容修改bin文件觸發(fā)異常什么情況下需要打斷點(diǎn) 沒有調(diào)試器 不方便使用調(diào)試器 想查看代碼任意位置的狀態(tài)2. 怎樣人為觸發(fā)斷點(diǎn) 修改原來的代碼 改為swi指令,F(xiàn)reeRTOS已經(jīng)使用它 改為未定義指令3. 修改異常處理函數(shù)打印寄存器和棧內(nèi)容4. 修改bin文件要修改bin文件,需要先得到bin文件:fromelf -bin -output=test.bin F103_Mod

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論