最新消息:

定位 UNIX 上常见问题的经验总结(转)

Linux运维 大步 892浏览 0评论

Ps:unix用不起

原文连接:定位 UNIX 上常见问题的经验总结

简介: 本文主要对 UNIX 平台常见的问题进行了分类,介绍一些常见问题分析时使用的方法和命令,对以下三种常见问题的分析方法做了简单介绍:UNIX 下 Crash 问题的分析方法、UNIX 下内存泄露问题的分析方法和 UNIX 下 performance 问题的分析方法。

同时通过对下面两个例子的介绍,巩固了上面问题分析的介绍:

● 一个多线程应用的性能问题的分析

● 一个 crash 问题的分析

UNIX 程序常见问题分类

UNIX 下运行程序,经常会遇到以下几类问题 :

1. Crash

2. 内存泄露

3. 句柄泄露

4. 进程不响应

5. 性能不满足预期

6. 逻辑错误

UNIX 程序常见问题的分析方法

UNIX 下 Crash 问题的分析方法

crash 原理和 core 文件生成原因 ( 信号的介绍 )

Crash 是进程崩溃,是由于应用进程做了错误的操作 ( 例如,数组拷贝越界导致对系统内存进行了写操作,使用了错误的指针地址 ), 操作系统向应用进程发送了信号,如果应用进程没有做特殊处理,应用进程将 core dump 在进程当前的工作目录下生成一个 core 文件,core 文件复制了该进程的存储图像,是一个内存映像。

不是所有的信号默认行为都是 crash, 常见默认 crash 信号主要有:

SIGABRT

SIGBUS

SIGSEGV

SIGILL

SIGPIPE

可以通过 kill –l (适用所有 UNIX 平台)查看信号的信息。

查看针对某个进程的所有信号的默认行为(例如:在 Solaris 平台使用 psig pid 命令查看,其他平台的命令略有不同,请参考各自平台用户手册).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[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)总线错误 ( 错误的内存访问 )

core 文件分析一般思路

首先使用 file 命令(所有 UNIX 平台适用)查看 core 文件生成的源程序

1
2
bash-3.00$ file core
 core:           ELF 64-bit MSB core file SPARCV9 Version 1, from 'qatest'

从以上结果可以看出,该 core 文件是由 64 位程序 qatest 生成的。

然后使用 gdb( 或者 dbx) 对 core 文件进行分析:

1
bash-2.05$ dbx ./qatest ./core

再使用 where 命令查看 core 的位置:

1
2
3
4
t@1 (l@1) program terminated by signal BUS(invalid address alignment)
 Current function is MCXML_700::MCSetting::MCSetting
   87       fpValue = s.GetValue()->Clone();
 (dbx) where

从这个 core 文件可以看到,它收到了 BUS 信号,crash 的位置在 = s.GetValue()->Clone() 函数。

更多有关 gdb

转载请注明:大步's Blog » 定位 UNIX 上常见问题的经验总结(转)

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
SiteMap