운영체제/리눅스
[리눅스] GDB 디버거 _1
Cloud_Park
2022. 7. 13. 00:02
2022.07.11 - [운영체제/리눅스] - [리눅스] GCC 입문
2022.07.13 - [클라우드/NHN Cloud] - [NHN Cloud] 인스턴스 생성하기
2018.11.16 - [클라우드/AWS] - (AWS) EC2 인스턴스 생성
GDB 디버거
개요 유닉스 기반의 시스템에서 동작하는 이식성이 좋은 디버거 C,C++ ,포트란까지 지원
줄단위 실행가능하고 특정시점에서 멈추게 할수있다.
프로그램 중간에 변수가 어떻게 들어갔는지 확인 가능
원하는 변수를 넣어 어떻게 변하는지 관찰가능
gcc -g 옵션을 넣어 사용한다 . * 꼭 g를 넣어줘야한다 .
gcc -g hello.c -o hello
GDB로 할 수 있는 일
break point 를 지정하여 멈출 수 있다.
하드웨어 감지를 할 수 있다
프로그램값과 속성값을 확인 할 수 있다.
프로그래밍 단계별 수행
스택프레임 : 함수를 호출할때 스택프레임에 넣어 확인 할 수 있다. (지역변수 등등) 관련 명령어
명령어
frame
infoframe
backtrace
GDB 설치
yum install gdb
사용방법
gdb -h // 사용 변수
gdb [실행파일] //gdb를 사용하여 디버깅 gcc -g 를 사용하여 만든어진 파일을 실행파일로 사용
gdb [실행파일] core // core dump가 발생하면 core파일을 넣는다 .
gdb [실행파일] [PID] // pid로 실행
core dump : 특정시점 메모리 상태를 기록한 것 , 보통 프로그램이 비정상적으로 종료되면 생성되다.
이외에도 정보 : 프로그램 카운터, 스택 포인터 , cpu 레지스터, 메모리 상태 , 프로세서 및 운영체제 플러그 정보등
코어파일 확인
ulimit -a //확인
ulimit -c //변경
코어파일 위치
/proc/sys/kernel/core_pattern
#코어 덤프 위치 변경 /var/crach 로 변경
vi /etc/sysctl.conf
kernel.coer_pattern=/var/crach/cere.%e%p%h%t
%e= executable filename (실행파일 네임)
%p= PID 를 넣을 수 있다.
%t= 해당 시간을 넣을 수 있다.
%h= hostname 을 넣는다.
===별도
fs.suid_dumpable=2
2(suidsfe)= 일반적으로 루트만 읽을 수 있다. 최종 사용자는 삭제는 가능하지만 직접 엑세스 할 수 없다.
덤프파일은 덮어쓰기가 불가능 , 이 모드는 관리자가 일반 환경에서 문제를 디버깅할때 적합하다.
===설정 재로딩
sysctl -p
GDB 명령어
====
실습
====
GDB 실습1
===gdb_test1.c
#include <stdio.h>
void print_func(char *str){
str[0]='';
printf("String: %s/n",str),
}
int main(){
char *str=NULL;
print_func(str);
return 0;
}
=======실행 -> 파일 생성확인
#gcc -g gdb_test.c -o gdb_test
#./gdb_test1
#ls /var/crash
======gdb 명령어 실행
#gdb ./gdb_test1
#(gdb)run // 처음부터 실행
실습2
==main.c
#include <stdio.h>
#include <stdlib.h>
void func1(void);
void func2(void);
int main(){
int result;
char number[]="abcd";
printf("main start \n");
func1();
func2();
result=atio(number);
printf("result: %d \n ,result")
return 0;
}
===func1.c
#includ <stdio.h>
void func1(){
printf("func1_call\n")
}
===func2.c
#includ <stdio.h>
void func2(){
printf("func2 _call\n")
}
===gdb 실행
#gcc -g main.c func1 func2 -o gdb_test2
#./gdb_test2
func1
func2
0
#gdb ./gdb_test2. /number 1234넣기
#(gdb)break main.c:1. // 1번째줄 멈추기
#(gdb) run // brack point 만날 때까지 실행
#(gdb) next
#(gdb) next // 함수는 지나간다
#(gdb) step // 함수로 들어간다.
#(gdb) display result // 변수 result의 값을 확인
#(gdb) set number = "1234" //1234로 대치
#(gdb) continue //실행
#(gdb) quit //종료