본문 바로가기

Solaris/기술과 팁

core dump 분석

출처 : http://www.readysystem.co.kr/new/?doc=bbs/gnuboard.php&bo_table=data01_2&page=4&wr_id=140
 

# 시스템 운영중 어떠한 문제로 인하여 갑작스런 패닉 현상이 나타나게 되면 보통 crash 디렉토리를 지정 하지 않았다면 /var/crash/[hostname]/ 밑에 unix 파일과 core 파일을 생성 합니다.


#### core 파일 과 unix 파일을 이용하여 시스템의 문제 발생 원인을 분석 할수 있습니다.


### core 분석 도구.

 1. strings 
 2. arp
 3. ipcs
 4. crash


### core dump 설정 여부 확인.

(readytop>root)/etc/init.d# dumpadm ( solaris 7 이상 OS 부터 지원 )
       Dump content: kernel pages
       Dump device: /dev/dsk/c0t0d0s1 (swap)
  Savecore directory: /var/crash/test  ---> coredump 생성 경로.
  Savecore enabled: 예
(readytop>root)/etc/init.d#


### sunOS 5.7 이하 버젼 core dump 설정.

  Solaris 1 에서 덤프 활성화: 다음과 같이 /etc/rc.local 에서 주석을 지운다:
#
# Enable savecore (default is disabled)
#
mkdir -p /var/crash/´hostname´
echo -n 'checking for crash dump... '
intr savecore /var/crash/´hostname´
echo ''


Solaris 2 덤프 활성화: 다음과 같이 /etc/init.d/sysetup 에서 주석을 지운다:
##
## Enable savecore (default is disabled)
##
if [ ! -d /var/crash/´uname -n´ ] then mkdir -p /var/crash/´uname -n´ fi echo 'checking for crash dump...\c ' savecore /var/crash/´uname -n´ echo ' '

Solaris 2.6 이하는 core 파일은 자동으로 생성되지 않는다.
Solaris 7 부터는 default로 생성되게 설정되어 있다.

/etc/init.d/sysetup 파일의 내용중 아래와 같은 부분이
있는데 이 부분의 # 상태로 막혀 있는 부분을 열어 줘야
생성이 된다.
## Default is to not do a savecore
##
#if [ ! -d /home/crash/`uname -n` ]
#then mkdir -m 0700 -p /home/crash/`uname -n`
#fi
#                echo 'checking for crash dump...c '
#savecore /home/crash/`uname -n`
#                echo ''                            


====================================================

## Default is to not do a savecore
##
if [ ! -d /home/crash/`uname -n` ]
then mkdir -m 0700 -p /home/crash/`uname -n`
fi
               echo 'checking for crash dump...c '
savecore /home/crash/`uname -n`
               echo ''  


### 분석 명령어

설명     Solaris 1 (SunOS 4)     Solaris 2.x 


어떤 OS인가?    strings vmcore.0 | grep SunOS   strings vmcore.0 | grep SunOS


어떤 호스트인가?   strings vmcore.0 | grep machine  strings vmcore.0 | grep machine
    strings vmcore.0 | more    strings vmcore.0 | more  
어떤 프로세스가   ps -laxk vmunix.0 vmcore.0  crash 사용
실행중이었나?  


시스템 테이블 보기    pstat -T vmunix.0 vmcore.0  


네트웍 통계 보기   netstat vmunix.0 vmcore.0   netstat -d unix.0 vmcore.0


NFS 통계 보기    nfsstat -n vmunix.0 vmcore.0   nfsstat -n unix.0 vmcore.0


arp 테이블 보기    arp -c vmunix.0 vmcore.0   arp -a unix.0 vmcore.0  


IPC 보기   ipcs -a -N vmunix.0 -C vmcore.0  ipcs -a -N unix.0 -C vmcore.0
 
CRASH 사용하기:   /etc/crash -d vmcore.0 -n vmunix.0   /usr/sbin/crash -d vmcore.0 -n vmunix.0


crash 도움말    > help     > help


"p" 명령어 도움말   > help p     > help p


프로세스 보기     > p -e     > p -e


프로세스 상세사항           > p -l


crash 상세사항          > status


crash 종료     > q      > q 
 


ADB 디버거 사용하기:    adb -k vmunix.0 vmcore.0   adb -k unix.0 vmcore.0


패닉 메시지가 뭐였나?   *panicstr/s     *panicstr/s


호스트이름    hostname/s     $<utsname


OS 버전    version/s     $<utsname


도메인     domainname/s    srpc_domain/s 


시스템     sysname/s     $<utsname


제조업체          hw_provider/s 


크래쉬 시간/날짜    time/Y      TIME/y 


부트 시간/날짜    *boottime=Y     *time-(lbolt%0t100)=Y 


시스템 메시지 표시   msgbuf+10/s     msgbuf+14s  


최근의 메시지 버퍼 ]  $<msgbuf     $<msgbuf 
(ring)


C 스택 역추적    $c      $c


스택 역추적    <sp$<stacktrace


루트 장치는 어떤 것?         rootfs$<bootobj


스왑 장치는 어떤 것?         swapfile$<bootobj 
        dumpfile$<bootobj 


레지스터 보기   $cregs  


IPC 보기    ipcaccess/10i   


adb 종료   CTRL-D or $q     CTRL-D or $q 
 
커널 해킹 (!#?) :   adb -k /vmunix /dev/mem   adb -k /dev/ksyms /dev/mem