2012-03-02 111 views
1

我有一臺運行在VMWare上的linux,並且在主機上使用gdb在調試時連接到它。運行時,我的內核會導致一些進程掛起,我想調查更多。在內核調試中訪問進程的內核堆棧給定進程ID

內核給我的是掛起進程的進程ID以及堆棧跟蹤。但是,如果沒有傳遞參數,堆棧跟蹤並不是非常有用。所以我想收集更多信息。所以我有兩個問題:

  1. 鑑於pid,我怎樣才能得到task_struct對應的過程?我試圖在gdb下執行「p find_task_by_pid_ns(2533,& init_pid_ns)」,但它掛起。

  2. 一旦我得到了task_struct和堆棧指針。我的最終目標是重現堆棧跟蹤(每個函數調用的參數)。有沒有一種工具可以做到這一點? gdb是否需要一個堆棧指針併爲我打印堆棧跟蹤?

謝謝。

+0

但您只需要您的進程(用戶空間)堆棧。或者你正在調試一個內核模塊,或者只是你的應用程序? – 2012-03-02 06:11:49

+0

我需要內核堆棧,因爲我正在調試內核 – yangsuli 2012-03-02 06:13:45

回答

1

KDB在這種情況下會很有幫助。我不知道你正在使用的內核版本,但如果你正在使用或Linux 2.6.35內核後,您可以使用下面的命令從GDB切換到KDB:

 maintenance packet 3 

一旦你在kdb中,您可以使用ps命令來了解進程描述符地址,並可以使用bt命令來跟蹤堆棧。或者,您可以使用gdb'monitor'命令從gdb運行kdb命令。例如,要使用kdb的'ps'命令,您可以在gdb中鍵入以下命令。

 (gdb) monitor ps 

您可以使用以下命令獲取kdb命令的列表。

 (gdb) monitor help 

一旦知道了進程描述符,就可以使用以下文檔來跟蹤任何進程的堆棧。

 http://www.emntech.com/documentation/debugging/kdb.pdf