Linux機器在引導和運行軟件(包括自定義驅動程序)幾個小時後凍結。我正在尋找調試此類問題的方法。最近,Linux內核調試技術已經取得重大進展,不是嗎?當前的Linux內核調試技術
我懇請分享一些關於這個話題的經驗。
Linux機器在引導和運行軟件(包括自定義驅動程序)幾個小時後凍結。我正在尋找調試此類問題的方法。最近,Linux內核調試技術已經取得重大進展,不是嗎?當前的Linux內核調試技術
我懇請分享一些關於這個話題的經驗。
根據您想要調試的問題類型,有很多種不同的技術。在你的情況下,第一個問題是「系統真的凍結了嗎?」。您可以啓用magic sysrq鍵並檢查凍結時的系統狀態並從那裏開始。
也許最直接強大的方法是啓用內核調試程序並通過串行電纜連接到它。
如果您可以在虛擬機內重現問題,確實有一個相當新的(AFAIK)技術可能很有用:從運行它的主機調試虛擬機。
例如見這樣的: Debugging Linux Kernel in VMWare with Windows host
的VMware Workstation 7還實現了強大的技術,確定性讓你記錄制度執行,然後重播,並根據需要,甚至倒退。所以一旦系統崩潰,你可以倒退,看看發生了什麼(甚至嘗試改變一些東西,看看它是否仍然崩潰)。 IIRC我在某處讀不到,無法同時使用VMware/gdb調試內核。
顯然,您需要一個VMM。我不知道VMware的VMM系列支持VMM是什麼,我不知道是否有免費的VMware版本支持這個功能。不可能;人們無法真正期望一家商業公司免費贈送所有東西。試用版是30天。
如果您的自定義驅動程序是針對機器內部的硬件,那麼我想這可能無法正常工作。
注意,這並不要求在虛擬機內啓用任何類型的調試支持; VM本身不受干擾,理論上完全不知道它正在被調試。相反,工作站有一個直接構建在其中的gdb存根控制虛擬CPU。 – Paul 2010-02-12 23:07:30
我如何調試這種類型的bug,是在VirtualBox中運行我的操作系統,然後用kgdb內建編譯內核。然後我在VirtualBox上設置一個串行控制檯,這樣我就可以通過串行控制檯將gdb連接到VirtualBox操作系統內的內核。任何時候操作系統掛起,就像神奇的sysrq鍵一樣,我可以在gdb上輸入ctrl-c來停止並理解當時的內核。
通常情況下,內核堆棧跟蹤太難以查明罪魁禍首進程了,所以我認爲最好的方法仍然是通用的「top」命令,只需查看應用程序日誌以查看掛起的原因 - 這將需要重新啓動以查看當然的日誌。
一種選擇是使用Kprobes。在Google上快速搜索會顯示您需要的所有信息。這不是特別難使用。 Kprobes由IBM創建,我相信它是內核調試的解決方案。它本質上是一個精心製作的printk()形式,但它允許您處理使用處理程序插入的任何「斷點」。這可能是你正在尋找的。你所需要做的就是編寫和insmod一個模塊到內核中,它將處理你在模塊中指定的任何「斷點」命中。
希望可以成爲一個有用的選擇...
@tinkertim:你的意思是它是不夠的? :) – leppie 2009-11-20 19:46:25