調試zSeries上的Linux應用程序類似於調試其他體系結構上的Linux應用程序。對於有經驗的Linux開發人員,最大的挑戰是理解新的系統體系結構。對於剛接觸Linux的大型機開發人員,掌握新的調試工具似乎是一項令人畏懼的任務。不要害怕。本文將提供一些有用的提示來幫助您入門。
學問來自實踐,但是對於調試工具,在沒有出現問題而迫使您去修復它們之前,“實踐”是不會發生的。考慮到這點,下面將提供讓您入門的“速成”指南。
User Debug 日志記錄
調試一個崩潰的程序的第一步是弄清哪裡出了錯。zSeries 上的Linux內核具有這樣一個內置特性,它在用戶進程崩潰時記錄一些基本的調試信息。要啟用這個特性,請以 root 用戶身份執行如下命令:
echo 1 >> /proc/sys/kernel/userprocess_debug
當某個進程崩潰時,日志文件(/var/log/messages)中就會給出附加的信息,包括程序終止原因、故障地址,以及包含程序狀態字(PSW)、通用寄存器和訪問寄存器的簡要寄存器轉儲。
Mar 31 11:34:28 l02 kernel: User process fault: interruption code 0x10 Mar 31 11:34:28 l02 kernel: failing address: 0 Mar 31 11:34:28 l02 kernel: CPU: 1 Mar 31 11:34:28 l02 kernel: Process simple (pid: 30122, stackpage=05889000) Mar 31 11:34:28 l02 kernel: Mar 31 11:34:28 l02 kernel: User PSW: 070dc000 c00ab738 Mar 31 11:34:28 l02 kernel: task: 05888000 ksp: 05889f08 pt_regs: 05889f68 Mar 31 11:34:28 l02 kernel: User GPRS: Mar 31 11:34:28 l02 kernel: 00000000 004019a0 004019a0 00000000 Mar 31 11:34:28 l02 kernel: 00000003 c00ab732 004008f8 00400338 Mar 31 11:34:28 l02 kernel: 40018ffc 0040061c 40018e34 7ffff800 Mar 31 11:34:28 l02 kernel: 00400434 80400624 8040066e 7ffff800 Mar 31 11:34:28 l02 kernel: User ACRS: Mar 31 11:34:28 l02 kernel: 00000000 00000000 00000000 00000000 Mar 31 11:34:28 l02 kernel: 00000001 00000000 00000000 00000000 Mar 31 11:34:28 l02 kernel: 00000000 00000000 00000000 00000000 Mar 31 11:34:28 l02 kernel: 00000000 00000000 00000000 00000000 Mar 31 11:34:28 l02 kernel: User Code: Mar 31 11:34:28 l02 kernel: 44 40 50 00 07 fe a7 4a 00 01 18 54 18 43 18 35 a8 24 00 00
圖 1 表明程序(名為“simple”)以一個程序中斷代碼 0x10 終止(操作系統原理表明這是一個段轉換錯誤),而故障地址為 0。毫無疑問,有人使用了空指針。現在我們知道發生了什麼,下面需要弄清它發生在何處。