Q:在
AIX系統中,經常會看到文件名為core的文件,這個文件有用處嗎?如果有用,怎么使用?
A:當進程在異常終止運行時,系統會把該進程對應的地址空間中的數據寫到core文件中(這個過程被稱為dump),以便程序員對其進行分析,找出進程異常終止的原因。缺省情況下,異常終止的進程在啟動它的當前目錄下產生core文件。
在AIX 4.3.3中,所有的core文件的文件名都是core,如果不只一個程序產生dump或者相同的程序dump多次,它們都會產生相同文件名的core文件,那么就會丟失比較早的core文件。從AIX 5.1開始,改變了core文件的命名方法,使得每一個core文件擁有惟一的文件名,從而避免了新的core文件覆蓋舊的core文件,這個特色更加有助于程序員調試和跟蹤運行失敗的程序。
默認情況下,一個core文件的文件名是core。要使用AIX 5L中core文件命名的新方法,就要把CORE_NAMING環境變量的值設置為yes。
在AIX 5L中,把當前用戶的CORE_NAMING環境變量的值設置成yes之后,隨后啟動的進程產生的core文件名才能惟一的。新的core文件名的格式是core.pid.ddhhmmss。其中pid是進程號,dd是當前月份中的日子,hh表示小時,mm表示分,ss表示秒。
對于一個占用內存資源很大的進程產生的core文件也非常大,因此如果經常有進程產生core文件,而core文件名都不相同,那么產生的core就會占用非常多的文件系統空間,所以系統管理員要定期為程序員收集這些core文件,并刪除這些文件。在AIX 5.3中,用戶可以設置產生壓縮的core文件和指定一個目錄來保存core文件,用lscore命令查看當前用戶或指定用戶的core設置,例如:
$ lscore compression: off path specification: off corefile location: not set naming specification: off $
要查看peter用戶的core設置,命令是lscore peter。查看整個系統的core設置,命令是lscore –d 用chcore命令修改當前用戶的core設置,例如: $ chcore –c on –p on –l /tmp/coredir –n on
上面的命令修改當前用戶的core設置,-c on參數的作用是打開壓縮core文件功能,用戶可以用uncompress命令來解壓縮,-p on參數的作用是打開指定的core文件位置,保存core文件的目錄是由-l參數指定為/tmp/coredir目錄,-n on參數的作用相當于把CORE_NAMING環境變量值設置為yes。其中on表示打開這些功能,將on換成off表示關閉這些功能。
如果要修改指定用戶的core設置,在上面的命令最后加上用戶名,要修改整個系統的core設置,在上面的命令最后加上-d即可。其實每個用戶的core設置保存在/etc/security/user文件中,chcore和lscore命令存取user文件的內容,讀者可以參考user文件的內容用vi來設置某個用戶的core設置。
每一個core dump會產生一個新的錯誤日志記錄。用errpt命令查看這樣的錯誤日志記錄可以幫助程序員識別導致core dump的應用程序。程序員可以用dbx命令來調試產生core文件的程序,要用dbx命令調試有問題的程序時,必須保證core文件和產生core文件的程序都在當前目錄下,調試程序的最簡單的命令格式如下:
$ dbx ProgramFile CoreFile
ProgramFile是程序文件名,CoreFile是core文件名。在dbx中用where子命令可以查看程序在異常終止時正在執行的函數名,也就是說能夠查看程序在執行哪個函數時而異常終止的,然后在源程序中找這個函數,再進一步定位異常語句。dbx命令的詳細用法讀者可以參考dbx命令的手冊。
當一個進程正在運行時,如果程序員想獲得這個進程所占內存空間中的內容,可以用gencore命令把這個進程對應的地址空間中的數據寫到一個指定的文件中,gencore命令并不會終止進程的運行。例如要把進程號為3682983的進程的內存鏡像寫到文件名為/tmp/core. 3682983的文件中,命令如下:
$ gencore 3682983 /tmp/core.3682983
如果gencore命令指定的core文件名帶有路徑,那么用chcore命令所修改的core設置中core文件名和core文件保存目錄就無效了。