2016-06-30 46 views
0

我完全是在開發一個使用「小」Linux的電路板上開發驅動程序的工作。每當我做出所有事情並在PC上獲得「.bin」文件,然後將「.bin」文件傳送到電路板上時,系統就會正常工作。在沒有GDB的電路板上調試Linux內核

現在問題來了。我檢查了系統,它不能使用gdb。所以當系統崩潰時,它只會提供一個核心轉儲文件,這會給出凌亂的地址信息(似乎沒有幫助,或者至少我不知道如何使用它)。

任何有經驗的嵌入式開發人員都可以提供一些建議嗎?你如何在工作中進行調試?順便說一句,如果控制檯打印崩潰信息包括堆棧信息和呼叫跟蹤,沒有epc和ra(我剛剛瞭解到)。 epc(崩潰的地址)能被發現嗎?

+0

你有什麼調試輸出方法?你有一個可用於printf輸出的UART嗎?用於單步和/或內存檢查的JTAG接口? – Throwback1986

+0

@ Throwback1986我有UART打印東西到PC控制檯,看起來很原始。我不能打印太多會降低系統速度 –

+0

僅使用printk進行調試可能看起來很原始,但如果代碼或情況不能容忍斷點,則它很有效。它有助於瞭解C(和程序/系統),以便檢查代碼可以捕獲99.9%的錯誤。你必須有條不紊地編寫代碼(例如,閱讀手冊頁並測試所有重要的返回代碼)和防禦性(例如自由使用assert())。修復編譯器警告。使用debug_flag變量來控制詳細程度,以及哪些打印文件處於活動狀態而不處於非活動狀態(即,始終沒有每個打印文件都處於活動狀態)。對於恐慌,請啓用詳細恐慌並且不要去掉符號。 – sawdust

回答

2

許多內核開發人員(包括我自己)在開發設備驅動程序時不使用調試器。多年來,Linux不支持內核調試。即使是現在,並非所有的CPU架構都支持內核調試。

您可以做的最簡單的事情之一是使用printk將事件記錄到控制檯。另外,增加控制檯UART的速度。我經常使用115200波特。

對於某些CPU體系結構,Linux內核現在確實支持kgdb。

我也強烈建議Linux內核開發者閱讀這兩本書:

+0

謝謝你!這是否意味着,如果有任何內存相關的錯誤,那麼將很難找到哪一行代碼實際上會導致崩潰?你可能推薦的任何工具? –