GDB - GNU Debugger 김진용.

Slides:



Advertisements
Similar presentations
03 변수와 자료형 세종대학교 최옥경 교수 참고 : 한빛미디어 뇌를 자극하는 C, INFINITY Perfect C.
Advertisements

Tcl/Tk 민 인학 한국 Tcl/Tk 커뮤니티.
제 2 장 프로그램 개발과정. 통합 개발 환경  통합 개발 환경 (IDE: integrated development environment)  에디터 + 컴파일러 + 디버거.
1.
데이터의 표현과 연산 (1) (Chapter 3)
Basic of Buffer Over Flow
제3장 C 프로그래밍 환경.
임베디드 시스템 개발을 위한 리눅스 환경설정.
2014 ITA 8월 강의 C Programming -1주차- C언어 기초 정대진 ( )
리눅스 실습 정성훈.
C 프로그래밍 소개 숙명여대 창병모 2011 가을.
알기 쉽게 해설한 Java 8th edition
제 8 장  파서 생성기 YACC 사용하기.
C 프로그래밍.
공학기초설계 Youn-Hee Han 강의 소개 & MinGW & gcc 공학기초설계 Youn-Hee Han
C 11장. 포인터의 활용 #include <stdio.h> int main(void) { int num;
쉽게 풀어쓴 C언어 Express 제17장 동적 메모리와 연결 리스트 C Express.
제9장 C 프로그래밍 환경 창병모
쉽게 풀어쓴 C언어 Express 제4장 변수와 자료형 C Express.
C언어: 배열 (Arrays).
컴퓨터의 기초 제 4강 - 표준 입출력, 함수의 기초 2006년 4월 10일.
처음으로 배우는 C 프로그래밍 제2부 기초 제5장 반복문.
6장. printf와 scanf 함수에 대한 고찰
버퍼 오버플로우에 대한 대책과 발전된 공격 안전한 함수 사용 버퍼 오버플로우에 취약한 함수 사용하지 않기
10장 메모리 관리.
쉽게 풀어쓴 C언어 Express 제17장 동적 메모리와 연결 리스트 C Express.
쉽게 풀어쓴 C언어 Express 제17장 동적메모리와 연결리스트 C Express.
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 02. 프로그램의 기본구성.
컴퓨터 프로그래밍 기초 - 2nd : scanf(), printf() 와 연산자 -
쉽게 풀어쓴 C언어 Express 제3장 C프로그램 구성요소 C Express.
누구나 즐기는 C언어 콘서트 제2장 기초 사항.
Internet Protocol and Programming
7장 배열 배열의 정의 배열의 초기화 1차원 배열 2차원 및 다차원 배열 문자 배열 배열과 구조.
Chapter 06. 선택문.
Beginning Linux Programming
1장. 프로그래밍 언어, C 프로그래밍.
제 3 장 상수와 변수
1주차: 프로그래밍언어란 무엇인가? C 언어란? C 프로그래밍을 위한 준비
adopted from KNK C Programming : A Modern Approach
2장 표준 입출력 표준 입출력 함수의 종류 형식화된 입출력 문자 입출력 문자열 입출력.
개정판 누구나 즐기는 C언어 콘서트 제6장 반복문 출처: pixabay.
11장. 1차원 배열 IT응용시스템공학과 김 형 진 교수.
Internet Protocol and Programming
제어문 & 반복문 C스터디 2주차.
쉽게 풀어쓴 C언어 Express 제2장 프로그램 작성 과정 C Express.
게임프로그래밍 I - 1차원 배열 - 공주대학교 게임디자인학과 박 찬 교수 2011년 4월 25일.
작은 분야의 일을 훌륭하게 해내는 자그마한 도구들을 개발자들에게 제공하고 개발자들은 이 도구들을 창의적으로 결합하여 사용하자.
Chapter 11. 배열과 포인터.
조 병 규 Software Quality Lab. 한국교통대학교
4장 자료형.
Chapter 05. 입출력 함수.
Byte Alignment ㈜ 웰컴정보시스템 김 정 은.
실습과제 1(조건문, ) 표준입력으로 수축기 혈압을 입력 받아 그에 따른 적당한 표현을 화면에 출력하는 프로그램을 if-else 문을 이용하여 작성.
제9장 C 프로그래밍 환경 TOPCIT (Test of Practical Competency in IT)
Fflush 사용이유 및 방법 [이유] 키보드에서 입력된 내용은 입력버퍼에 저장되었다가 Enter 키가 들어오면 프로그램으로 전달됨 이 때 입력버퍼에 있는 Enter 키도 프로그램으로 전달됨 그러므로 아래와 같은 프로그램에서 문자 하나를 입력해도 Enter키도 입력된 것으로.
6장 반복제어문 for 문 while 문 do while 문 기타 제어문.
누구나 즐기는 C언어 콘서트 제2장 기초 사항 IT응용시스템공학과 김형진 교수.
C언어 개론.
Internet Protocol and Programming
컴퓨터 프로그래밍 기초 - 11th : 파일 입출력 및 구조체 -
제5장 디버깅과 추적 문봉근.
실습과제 1번 생성된 파일 basic.txt를 프로젝트 폴더에서 메모장으로 열고 내용을 확인
3주차: Control Flow and Others
어서와 C언어는 처음이지 제16장.
C.
C 프로그래밍은 매우 도전적인 작업이다. 도전의 이면에 철저한 준비와 체계적인 노력
Chapter 09. 배열.
3b장 구조체와 열거형 구조체의 정의 구조체 변수의 선언 구조체 초기화 및 사용 구조체 재정의 포인터를 이용해서 구조체 사용
11장. 1차원 배열.
흐름도FLOWCHART 프로그래밍 과정 전단부 처리 단계 문제 분석 논리 설계
Presentation transcript:

GDB - GNU Debugger 김진용

GDB 개요 GDB GNU debugger GNU에서 만든 디버깅 유틸 실행 # gdb [ENTER]

GDB 명령어 실행 및 트레이스 run : 현재의 인수를 사용하여 프로그램을 실행 run <args> : 새로운 <인수>를 가지고 프로그램을 실행 continue : 현재 위치에서 프로그램을 계속 실행 (약자 c)

GDB 명령어 next : 한 줄씩 실행 시킨다. 이 때 함수를 포함하고 있으면 함수를 수행시킨다. (약자) n next <n> : <n>줄을 실행시킨다. step : 한 줄씩 실행 시킨다. 이 때 함수를 포함하고 있으면 함수 내부로 들어가서 한 줄씩 실행한다. (약자) s step <n> : <n>줄을 실행시킨다. (주의) step 사용시 원치않은 함수로 들어가지 않도록 주의해야함

GDB 명령어 break <line number> : 라인 번호에서 프로그램 실행을 멈추게 한다. quit : gdb를 종료 시킨다.

GDB 명령어 데이타에 관련된 명령들 whatis <expr> : 지정한 <변수>에 관련된 정보를 보여준다. print <expr> : <expr>에 지정된 식의 값을 보여준다. (약자) p display : 현재 지정된 display 명령의 목록을 보여준다. display <expr> : 새로운 <expr>을 display목록에 추가

GDB 명령어 list : 현재 위치에서 소스 파일의 내용을 10줄 보여준다. list <first>,<last> : <시작줄>과 <끝줄>사이의 소스파일 내용을 보여준다.

GDB 명령어 기타 명령어 help [name] : 명령어의 사용방법 안내 quit : gdb의 종료

GDB의 사용예 예제프로그램 버그(bug)가 눈에 보이나요? 13 strcpy(bug,"hi"); 14 printf("bug is %s \n", bug); 15 16 return; 17 } <끝> 파일 이름 : test.c 버그(bug)가 눈에 보이나요? 예제프로그램 1 #include <stdio.h> 2 3 main() 4 { 5 int i; 6 double j; 7 char *bug = NULL; 8 9 for( i = 0; i < 5; i++) { 10 j = i/2 + i; 11 printf(" j is %lf \n", j ); 12 }

GDB의 사용예 컴파일과 실행 [sugar@hussein gdb]$ cc -g test.c [sugar@hussein gdb]$ ./a.out j is 0.000000 j is 1.000000 j is 3.000000 j is 4.000000 j is 6.000000 Segmentation fault (core dumped) [sugar@hussein gdb]$ [sugar@hussein gdb]$ ls a.out core test.c

GDB의 사용예 GDB의 시작 $ gdb <실행화일> [sugar@hussein gdb]$ gdb a.out GNU gdb 4.17.0.11 with Linux support Copyright 1998 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Type "show copying" to see the conditions. There is absolutely no warranty for GDB. Type "show warranty" for details. This GDB was configured as "i386-redhat-linux"... (gdb)

GDB의 사용예 list명령 (gdb) list (gdb) list 4, 13 1 #include <stdio.h> 2 3 main() 4 { 5 int i; 6 double j; 7 char *bug = NULL; 8 9 for( i = 0; i < 5; i++) { 10 j = i/2 + i; (gdb) (gdb) list 4, 13 4 { 5 int i; 6 double j; 7 char *bug = NULL; 8 9 for( i = 0; i < 5; i++) { 10 j = i/2 + i; 11 printf(" j is %lf \n", j ); 12 } 13 strcpy(bug,"hi"); (gdb)

GDB의 사용예 break , run 명령 break point의 지정, run으로 break point까지 실행 Breakpoint 1 at 0x804840d: file test.c, line 9. (gdb) run Starting program: /home/users/phd/sugar/bit/gdb/a.out Breakpoint 1, main () at test.c:9 9 for( i = 0; i < 5; i++) { (gdb)

GDB의 사용예 next, print 명령 (gdb) n (gdb) p j 10 j = i/2 + i; $4 = 0 (gdb) p i $1 = 0 (gdb) p j $2 = 4.8699524093964861e-270 11 printf(" j is %lf \n", j ); $3 = 0 (gdb) p j $4 = 0 (gdb) n j is 0.000000 9 for( i = 0; i < 5; i++) { (gdb)

GDB의 사용예 display 명령 (gdb) n j is 1.000000 (gdb) display i (gdb) display j 2: j = 0 (gdb) n 10 j = i/2 + i; 1: i = 1 11 printf(" j is %lf \n", j ); 2: j = 1 (gdb) n j is 1.000000 9 for( i = 0; i < 5; i++) { 2: j = 1 1: i = 1 10 j = i/2 + i; 1: i = 2 11 printf(" j is %lf \n", j ); 2: j = 3 (gdb)

GDB의 사용예 J값이 이상하다! …next명령어 계속... (gdb) n (gdb) n 13 strcpy(bug,"hi"); 10 j = i/2 + i; 2: j = 4 1: i = 4 11 printf(" j is %lf \n", j ); 2: j = 6 j is 6.000000 9 for( i = 0; i < 5; i++) { (gdb) n 13 strcpy(bug,"hi"); 2: j = 6 1: i = 5 Program received signal SIGSEGV, Segmentation fault. strcpy (dest=0x0, src=0x80484ec "hi") at ../sysdeps/generic/strcpy.c:38 ../sysdeps/generic/strcpy.c:38: No such file or directory. (gdb) q J값이 이상하다!

GDB의 사용예 bug의 값(주소)가 잘못되어 있다! [sugar@hussein gdb]$ gdb a.out GNU gdb 4.17.0.11 with Linux support …생략... (gdb) b 13 Breakpoint 1 at 0x8048460: file test.c, line 13. (gdb) run Starting program: /home/users/phd/sugar/bit/gdb/a.out j is 0.000000 j is 1.000000 j is 3.000000 j is 4.000000 j is 6.000000 Breakpoint 1, main () at test.c:13 13 strcpy(bug,"hi"); (gdb) p bug $1 = 0x0 (gdb) bug의 값(주소)가 잘못되어 있다!

GDB의 사용예 예제프로그램 (vi debug.c에서 set number 명령 실행) _____10_main() ______1_#include <stdio.h> ______2_ ______3_void ______4_print_sum(sum) ______5_int sum; ______6_{ ______7_ printf("Total sum : %d\n", sum); ______8_} ______9_ _____10_main() _____11_{ _____12_ int i, sum; _____13_ _____14_ sum = 0; _____15_ for(i=0;i<5;i++) { _____16_ printf("%dth interation\n", i ); _____17_ sum += i; _____18_ } _____19_ print_sum(sum); _____20_}

GDB의 사용예 [sugar@hussein bit]$ gcc -g debug.c [sugar@hussein bit]$ gdb a.out GNU gdb 4.17.0.11 with Linux support Copyright 1998 Free Software Foundation, Inc. ....생략.... (gdb) break 14 Breakpoint 1 at 0x80483ee: file debug.c, line 14. (gdb) run Starting program: /home/users/phd/sugar/bit/a.out Breakpoint 1, main () at debug.c:14 14sum = 0; (gdb) next 15for(i=0;i<5;i++) { 16printf("%dth interation\n", i ); (gdb) n 0th interation 17sum += i; (gdb)

GDB의 사용예 (gdb) n (gdb) n 15for(i=0;i<5;i++) { 16printf("%dth interation\n", i ); 1th interation 17sum += i; 2th interation (gdb) n 15for(i=0;i<5;i++) { 16printf("%dth interation\n", i ); 3th interation 17sum += i; (gdb)

GDB의 사용예 (gdb) n (gdb) next 15for(i=0;i<5;i++) { (gdb) print sum $1 = 6 (gdb) print i $2 = 3 (gdb) display sum 1: sum = 6 (gdb) display i 2: i = 3 (gdb) next 16printf("%dth interation\n", i ); 2: i = 4 1: sum = 6 4th interation 17sum += i; (gdb)

GDB의 사용예 버그가 없이 동작함을 확인! (gdb) next (gdb) next 15for(i=0;i<5;i++) { 1: sum = 10 19print_sum(sum); 2: i = 5 (gdb) next Total sum : 10 20} 2: i = 5 1: sum = 10 (gdb) c Program exited with code 017. (gdb) quit [sugar@hussein bit]$ 버그가 없이 동작함을 확인!