운영체제/리눅스

[리눅스] 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 인스턴스 생성

 

 

 

[리눅스] GCC 입문

해당 글은 패.캠에서 인강들어 정리한 내용입니다. GUN Compiler Collection C,C++ ,Objectivc-C,Fortranm,Adam,Go 설치 도구 (yum) redhat 계열에서 패키지 관리 프로그램인 RPM 기반의 시스템을 위한 자동 업테..

base-on.tistory.com

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 //종료