반응형

프로그램 실행 시 아래 메시지 찍고 동작 안할 때 디버깅 방법 
세그멘테이션 오류 (코어 덤프됨)


l  코어파일 분석하기

 
코어파일은 충돌할 당시 프로세스의 메모리 이미지를 덤프한 것이다. 코어파일을 gdb와 함께 사용하여 프로그램의 상태를 조사하고 실패 원인을 규명할 수 있다. 어떤 예기치 않은 일이 발생하여 비정상적인 종료가 발생할 때 운영체계는 디스크에 코어 파일을 남긴다.메모리에 관한 문제는 Checker 패키지를 사용하여 예방할 수 있다. 하지만 메모리 fault를 일으키는 경우에는 충돌하면서 파일을 덤프한다. 코어파일은 일반적으로 프로세스를 실행시킨 현재 작업 디렉토리에 생성되지만 프로그램 내에서 작업 디렉토리를 바꾸는 경우도 있다.

보통 리눅스는 부팅시에 코어 파일을 만들지 않도록 세팅되어 있다. 코어 파일 생성을 가능케 하려고 한다면 그것을 다시 가능케 하는 셀의 내장 명령을 사용한다.

만약C쉘 호환 쉘(tcsh)을 쓰고 있다면 다음과 같이 명령을 내린다.

%  limit core unlimited

만약 본쉘류( sh , bash , zsh , pdksh )를 사용하고 있다면,

$  ulimit –c unlimited

와 같은 명령을 내린다.

코어파일을 함께 사용하기 위해선 다음과 같이 한다.

% gdb program core

 
참고로 ulimte -a 를 하면 현재 설정값을 볼 수 있다. core file size가 설정전 default값은 '0'이다.

core dump로 저장을 하려면 이 값을 unlimited로 변경해야 저장이 된다.

변경 방법은 아래와 같이 하면되고 변경 후의 값은 ulimit -a로 확인 가능하다. 

ulimit -c unlimited

$ulimit -c 0 $ulimit -c unlimited
$ulimit -a
core file size          (blocks, -c) 0

data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 79408
max locked memory       (kbytes, -l) unlimited
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 95
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 79408
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
$ulimit -a
core file size          (blocks, -c) unlimited
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 79408
max locked memory       (kbytes, -l) unlimited
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 95
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 79408
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
$ulimit -c
$0
$ulimit -c
$unlimited

 

반응형

'gdb' 카테고리의 다른 글

[GDB] display array(display *input@i)  (0) 2021.03.29
GDB commands  (0) 2021.03.28
GDB help  (0) 2021.03.28
GDB란 ?  (0) 2021.03.28
반응형

예제 코드

file name : test.c

#include <stdio.h>

int main()
{
    char input[100];
    int i = 0;
    scanf("%[^.]s", input);
    
    while(input[i] != '0')
    {   
        printf("%c", input[i]);
        i++;
    }   
    
    return 0;
}

compile 방법

#gcc test.c -o test -g

gdb 실행

#gdb test
#b main
#run
#n
...
scanf함수까지 이동한 후 아래와 같이 임의 문장을 입력한다.
#Test code is.
#display i
#display *input@i
#n
....
이후 next를 입력하면서 값이 변하는 것을 확인하시면 됩니다.

 

 

반응형

'gdb' 카테고리의 다른 글

[gdb]coredump 생성 및 분석 방법  (0) 2021.04.07
GDB commands  (0) 2021.03.28
GDB help  (0) 2021.03.28
GDB란 ?  (0) 2021.03.28
반응형

GDB 사용하는데 많이 사용하는 command 위주로 정리를 했으며 사용하면서 필요한 정보는 gdb의 help를 이용해서 참조하면서 사용하시면 될 것 같습니다.

 

1.compile 방법 

compile시 -g debug option을 꼭 추가해야 합니다. 
#gcc test.c -g -o test
-g : debug option(-O optimization 은 주면 안됨)
-o : 실행 파일 이름 설정 

*debug option적용된 file인지 확인 방법 
#objdump -g test
.debug_xxx section들이 존재해야 한다.
<예>
.debug_arranges
.debug_info
.debug_str

 

2. gdb 시작/종료 

-시작 

gdb [프로그램명]

gdb [프로그램명] [core 파일명]

gdb [프로그램명] [프로세스 PID]

[example]
#gdb test

 

-종료 

(gdb)quit

(gdb)ctrl+d

 

 

3. 각 class별로 commands

-running

 

 

advance

advance 20 현재 파일의 20라인을 만날 때까지 진행

advance file.c:20 file.c 파일의 20라인을 만날 때까지 진행

 

continue

c 다음 breakpoint 를 만날 때까지 실행

u 현재 loop를 빠져 나감

finish 현재 함수를 수행하고 빠져 나감

return 현재 함수를 수행하지 않고 빠져 나감

return 123 현재 함수를 수행하지 않고 빠져 나감, 리턴 값은 123

si 현재의 instruction을 수행, 함수 호출 시 함수 내부로 들어감.

ni 현재의 instruction을 수행, 함수 호출 시 함수 내부로 들어가지 않음.

 

next

다음 행을 수행한다. 서브루틴을 호출하면서 계속 수행한다.

호출이 발생하지 않으면 step와 같다.

next n : 이를 n번 수행하라는 의미

n 현재 행 수행 후 멈춤, 함수 호출 시 함수 수행 후 다음 행으로 감

n 6 n을 6번 입력

 

run

[프로그램 시작/종료]
프로그램을 시작한다.(break가 있다면 break까지 실행)

run/r 프로그램 시작 

r arg1 arg2 arg1,arg2 를 인자로 프로그램 실행

run arg : 새로운 인수를 가지고 프로그램을 시작한다.

arg는 “*”나 “[…]”를 포함할 수도 있다.

쉘의 사용까지도 확장될 수 있다.

“<”,“>” , “>>”같은 입출력 방향 재지정기호도 또한 허용된다.

step

한 줄씩 실행 시킨다.

함수를 포함하고 있으면 함수 내부로 들어가서 한 줄씩 실행시킨다.

- gdb 프로그램 진행

s 현재 행 수행 후 멈춤, 함수 호출 시 함수 내부로 들어감

s 6 s를 6번 입력

kill

디버깅 중인 프로그램의 실행을 취소한다.
k 프로그램 종료

list

- gdb 소스 보기
현재 위치에서 소스 파일의 내용을 10줄 보여준다                          

list 2, 15 : 소스 파일의2 ~ 15 까지를 보여준다.

 

l 현재 함수를 기점으로 소스 출력

l 10 10행을 기준으로 출력

l func func 함수의 소스를 출력

l - 출력된 행의 이전 행을 출력

l file.c:func file.c 파일의 func함수 부분을 출력

l file.c:10 file.c 파일의 10행을 기준으로 출력

 

break

- gdb breakpint

b func func 심볼의 시작 부분에 breakpoint 설정

b 10 10행에 breakpoint 설정

b file.c:func file.c 파일의 func 심볼에 breakpoint 설정

b file.c:10 file.c 파일의 10행에 breakpoint 설정

b +2 현재 행에서 2행 이후 지점에 breakpoint 설정

b -2 현재 행에서 2행 이전 지점에 breakpoint 설정

b *0x8049000 0x8049000 주소에 breakpoint 설정

b 10 if var == 0 10행에 breakpoint 설정하는데, var 변수의 값이 0일 때 동작

rb fun* *fun* 에 해당하는 모든 심볼에 breakpoint 설정

rb ^fun fun 으로 시작하는 모든 심볼에 breakpoint 설정

rb TestClass:: TestClass에 해당하는 모든 심볼에 breakpoint 설정


특정 라인이나 함수에 정지점을 설정한다.

break function : 현재 파일 안의 함수 function에 정지점을 설정한다.

break file:function : 파일file안의 function에 정지점을 설정한다.

watch : 감시점 설정(감시점은 어떤사건이 일어날 때에만 작동한다)

until : 실행중 line까지 실행

watch

- gdb watch point

watch [변수명] 변수에 값이 써질 때, break 걸림

rwatch [변수명] 변수의 값을 읽을 때, break 걸림

awatch [변수명] 변수의 값을 읽거나 쓸 때, break 걸림

 

clear

특정 라인이나 함수에 있던 정지점을 삭제한다.

delete

몇몇 정지점이나 자동으로 출력되는 표현을 삭제한다.

print

next

print expr : 수식의 값을 보여준다.

display

- gdb display

display [변수명] s/n 명령으로 진행하면서 변하는 변수값 확인


현재 display된 명령의 목록을 보여준다.

bt

프로그램 스택을 보여준다. (backtrace)

file

file program : 디버깅할 프로그램으로서 파일을 사용한다.

help

명령에 관한 정보를 보여주거나 일반적인 정보를 보여준다.

 

 

- gdb 변수/레지스터 값 검사

info locals 지역 변수 값 출력

info variables 전역 변수 값 출력

p [변수명] 변수의 값 출력

p [함수명] 함수의 주소 출력

p *[포인터변수명] 포인터변수의 내용을 출력

p $[register] register의 값 출력

info registers register 값 전체 출력

info all-registers MMX register를 포함해 거의 모든 register 값 출력

p *ptr_to_array@n 배열에 대한 pointer인 ptr_to_array에서 배열 원소의 수(n)를 입력으로 해서 출력

 

- gdb 변수 값 설정

p [변수명] = 값 변수명의 값을 설정

 

- gdb x

x/[범위][출력형식][범위의 단위]

메모리 특정 범위 확인

범위: 출력할 개수를 의미

범위의 단위: b(byte), h(half word = 2byte), w(word = 4byte), g(giant word = 8byte)

 

- gdb print/display/x 명령의 형식 지정

t 2진수로 출력

o 8진수로 출력

d 부호가 있는 10진수로 출력

u 부호가 없는 10진수로 출력

x 16진수로 출력

c 최초 1byte 값읅 문자옇으로 출력

f 부동소수점 값 형식으로 출력

a 가장 가까운 심볼의 오프셋을 출력

s 문자열로 출력

i 어셈블리 형식으로 출력

 

- gdb stack frame

frame [n] n번 stack frame 으로 변경

up 상위 stack frame 으로 이동

up [n] n번 상위 stack frame 으로 이동

down 하위 stack frame 으로 이동

down [n] n번 하위 stack frame 으로 이동

info frame stack frame 정보 출력

info args 함수가 호출될 때 인자를 출력

info locals 함수의 지역변수 출력

info catch 함수의 예외 핸들러를 출력

bt 전체 호출 stack frame 출력

 

- gdb 지원 함수들

disas [함수명] 함수의 어셈블리 코드 출력

call [함수명] 함수를 호출

signal [signal] 프로세스에 signal 전송

set {type}[addr]=[값] addr 주소를 type으로 인식하고 값을 저장

 

반응형

'gdb' 카테고리의 다른 글

[gdb]coredump 생성 및 분석 방법  (0) 2021.04.07
[GDB] display array(display *input@i)  (0) 2021.03.29
GDB help  (0) 2021.03.28
GDB란 ?  (0) 2021.03.28

+ Recent posts