使用addr2line調試hardfaut_handle問題

1.簡介
新手總是會遇到hardfaut的問題,比如我這樣的菜鳥,總是會遇到這種問題,根據以往的調試經驗,如果出現這個問題,很大部分是指針或者數組越界,現在的問題是怎麼在一個工程裏面找到發生越界的具體地址。遇到這樣的問題,無外乎是通過uart打印log,分析log再看看問題出在哪裏。這樣的很大問題就是有時候log來不及打印或者不知道在什麼地方打印。如果使用jlink調試,通過斷點一步步逼近發生錯誤的地方,當然這也是個好方法,但是要定位到出錯的具體位置,可能就需要addr2line,可以定位出錯在哪一行。

2.使用步驟和方法
需要添加一個文件到工程中,如下

這裏寫圖片描述

需要添加這個文件夾到工程,然後添加這個目錄下面的cm_backtrace.c到工程,加入頭文件,再添加fault_handler這文件下面的.s文件到工程中。需要注意的是,將工程本來的hardfaut給去除。

總的來說,
(1)添加這個文件夾的源文件和頭文件保證編譯能夠通過
(2)添加.s文件到工程,位於fault_handler這個文件下面
(3)將本來工程裏面hardfaut給去除掉
(4)將tools文件夾下面的addr2line放入到編譯生成的文件裏面去
(5)在mian函數初始化的地方初始化這個檢測程序。初始化函數如下 cm_backtrace_init(“CmBacktrace”, “1.0”, “0.1”);

完成上面五步,就可以將編譯的文件燒進板子裏面
怎麼使用?
(1)完成上述問題正常跑板子,然後復現log,就會在屏幕上主動打印出如下這樣一句話。如下圖:
這裏寫圖片描述

如果打印出了類似的東西,就表示你的dubug成功了,前提是你能復現你出現的hardfaut。

(2)將上面的這段話其中的.out替換爲自己的生成文件,這個生成文件在哪裏?在上述怎麼添加文件到工程的地四步裏面的地方,會自己生成.out文件,然後將上圖中紅色線框出來的.out的前綴替換爲自己的即可,如下圖
這裏寫圖片描述

上面的兩個文件是不是特別的眼熟?如果按照步驟肯定會出現類似的文件。

(2)
接着在圖出按住shift再右擊的菜單欄單擊在此處打開命令行如下這裏寫圖片描述
在這裏將上上圖的紅框的內容粘貼過來,記得修改紅框中的內容,.如out前面的名字,改成自己的,後面的數據都是自己生成的,怎麼生成?在你發送hardfaut的時候不是有嗎?在仔細看看前面的筆記,上述在抓這個log的地方。

(3)回車之後的信息就能看到了,裏面會記錄在哪個函數發生的hardfaut和在哪一行發生的問題,是不是特別的簡單?

問題:當然肯定會有小夥伴覺得,怎麼在hardfaut的地方沒有截圖中的一大堆數據產生?這個當然是正常的,首先要檢查自己的配置,修改配置的地方,就在一開始添加進工程的文件裏。
這裏寫圖片描述
打開上述文件,
這裏寫圖片描述

主要配置上面五句話
(1)第一句,配置打log的方式,不管是rtt還是uart,將打印log的地方映射進來
(2)第二句,選擇芯片中跑的系統的平臺是什麼樣的?rtos?或者?
(3)第三句,配置芯片的內核是什麼種類的m0?
(4)第四句,允許使用棧內存
(5)第五句,輸出信息的語言

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章