同时通过对下面两个例子的介绍,巩固了上面问题分析的介绍:
一个多线程应用的性能问题的分析 一个 crash 问题的分析
UNIX 程序">常见问题分类
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 default BUS default SEGV default SYS default PIPE ignored ALRM default TERM caught 0x100029580 0 USR1 default USR2 default CLD 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)总线错误 ( 错误的内存访问 )