同時通過對下面兩個例子的介紹,鞏固了上面問題分析的介紹:
一個多執行緒應用的性能問題的分析 一個 crash 問題的分析
UNIX 程式HTTP://www.aliyun.com/zixun/aggregation/17253.html">常見問題分類
UNIX 下運行程式,經常會遇到以下幾類問題 :
Crash 記憶體洩露 控制碼洩露 進程不回應 性能不滿足預期 邏輯錯誤
UNIX 程式常見問題的分析方法
UNIX 下 Crash 問題的分析方法
crash 原理和 core 檔生成原因 ( 信號的介紹 )
Crash 是進程崩潰,是由於應用進程做了錯誤的操作 ( 例如,陣列拷貝越界導致對系統記憶體進行了寫操作,使用了錯誤的指標位址 ), 作業系統向應用進程發送了信號,如果應用進程沒有做特殊處理,應用進程將 core dump 在進程當前的工作目錄下生成一個 core 檔,core 檔案複製了該進程的存儲圖像,是一個記憶體映射。
不是所有的信號預設行為都是 crash, 常見預設 crash 信號主要有:
SIGABRT SIGBUS SIGSEGV SIGILL SIGPIPE
可以通過 kill –l (適用所有 UNIX 平臺)查看信號的資訊。
查看針對某個進程的所有信號的預設行為(例如:在 Solaris 平臺使用 psig pid 命令查看,其他平臺的命令略有不同,請參考各自平臺使用者手冊).
[root@svs4qa09 SunOS a]# psig 25040 25040: /qatest/ModelerServer/5.0.0.0.64/modelersrv_15_0 -server HUP caught 0x10002958c 0 INT caught 0x100029580 0 QUIT default ILL default TRAP default ABRT default EMT default FPE default KILL def ault BUS default SEGV default SYS default PIPE ignored ALRM default TERM caught 0x100029580 0 USR1 default USR2 default CL D caught 0x100067f44 NOCLDSTOP
下面列舉一些常見信號的預設操作以及可能產生的原因:
例如:Solaris 平臺如下。 下面的資訊參考 Solaris 內核結構第 2 版第二章(Solaris 進程模型) 第 75 頁,其他平臺基本相同,請參考各自平臺使用者手冊:
信號 值 處理動作 發出信號的原因
SIGHUP 缺省的動作是終止進程 終端掛起或者控制進程終止
SIGINT 缺省的動作是終止進程 鍵盤中斷(如 break 鍵被按下)
SIGQUIT 缺省的動作是終止進程並進行內核映射轉儲(dump core)鍵盤的逸出鍵被按下
SIGILL 缺省的動作是終止進程並進行內核映射轉儲(dump core)非法指令
SIGABRT 缺省的動作是終止進程並進行內核映射轉儲(dump core)由 abort(3) 發出的退出指令
SIGFPE 缺省的動作是終止進程並進行內核映射轉儲(dump core)浮點異常
SIGKILL 9 AEF Kill 信號 終止信號
SIGSEGV 缺省的動作是終止進程並進行內核映射轉儲(dump core)不正確記憶體引用
SIGPIPE 缺省的動作是終止進程 管道破裂 : 寫一個沒有讀埠的管道
SIGALRM 缺省的動作是終止進程 由 alarm(2) 發出的信號
SIGTERM 缺省的動作是終止進程 終止信號
SIGUSR1 缺省的動作是終止進程 使用者自訂信號 1
SIGUSR2 缺省的動作是終止進程 使用者自訂信號 2
SIGCHLD 缺省的動作是忽略此信號 子進程結束信號
SIGSTOP DEF 終止進程
SIGBUS 缺省的動作是終止進程並進行內核映射轉儲(dump core)匯流排錯誤 ( 錯誤的記憶體訪問 )