46
Programmin Programmin g g with with Debugging Debugging 2 2 조조조 조조조 (6 (6 ) ) 조조조 조조조 (6 (6 ) ) 조조조 조조조 (6 (6 ) ) bug bug

programming with GDB

Embed Size (px)

Citation preview

Page 1: programming with GDB

ProgrammiProgramming ng withwith

DebuggingDebugging22 조조

정낙천정낙천 (6(6 기기 ))박상현박상현 (6(6 기기 ))윤석우윤석우 (6(6 기기 ))

bugbug

Page 2: programming with GDB

Programming with Programming with DebuggerDebugger

22

UNIX/LINUX UNIX/LINUX 디버거의 종류디버거의 종류GDBGDB 와 와 EmacsEmacs

EmacsEmacs 에서 소스코드 편집하기에서 소스코드 편집하기EmacsEmacs 에서 컴파일 및 에서 컴파일 및 gdbgdb 실행하기실행하기

GDB GDB 사용하기사용하기기본적인기본적인 , , 쓸만한 명령어들쓸만한 명령어들자식프로세스 디버깅 하기자식프로세스 디버깅 하기스레드 디버깅 하기 스레드 디버깅 하기

참고자료참고자료

Page 3: programming with GDB

Programming with Programming with DebuggerDebugger

33

GDBGDB gdb gdb 는 아주 강력하며는 아주 강력하며 , , 자유롭게 구할 수도 자유롭게 구할 수도 있으며있으며 , , 다양한 다양한 UNIX UNIX 플랫폼에서 돌아간다플랫폼에서 돌아간다 . . gdb gdb 는 는 Linux Linux 시스템에서는 기본 디버거이시스템에서는 기본 디버거이다다 . gdb . gdb 는 수많은 다른 플랫폼으로 포팅이 는 수많은 다른 플랫폼으로 포팅이 되어 있어서되어 있어서 , , 내장 실시간 시스템을 내장 실시간 시스템을 디버깅하는 데도 사용할 수 있다 디버깅하는 데도 사용할 수 있다

Page 4: programming with GDB

Programming with Programming with DebuggerDebugger

44

DBXDBX dbx symbolic debug programdbx symbolic debug program 은 은 Source-levelSource-level 과 과 AsseAssembler language-Levelmbler language-Level 에서 프로그램을 디버깅하는 에서 프로그램을 디버깅하는 툴이다툴이다 . Source level debugging. Source level debugging 은 은 C, C++, Pascal, FoC, C++, Pascal, Fortran rtran 프로그램을 디버깅할 수 있다프로그램을 디버깅할 수 있다 . Assembler langu. Assembler language level debuggingage level debugging 은 은 Machine levelMachine level 에서 실행 에서 실행 프로그램을 디버깅할 수 있다프로그램을 디버깅할 수 있다 . Machine level debuggi. Machine level debuggingng 에서 사용하는 명령어는 에서 사용하는 명령어는 Source-level debuggingSource-level debugging에서 사용하는 명령어와 비슷하다에서 사용하는 명령어와 비슷하다 . . dbx dbx 디버그 프로그램을 이용하여 한번에 한 라인씩 디버그 프로그램을 이용하여 한번에 한 라인씩 디버그 하고자 하는 프로그램을 끝까지 추적할 수 디버그 하고자 하는 프로그램을 끝까지 추적할 수 있고 또한 디버그 프로그램을 중단시키기 위해 있고 또한 디버그 프로그램을 중단시키기 위해 프로그램에 프로그램에 BreakpointBreakpoint 를 설정할 수도 있다를 설정할 수도 있다 . .

Page 5: programming with GDB

Programming with Programming with DebuggerDebugger

55

DDDDDD GDBGDB 에서 그래픽컬한 환경을 제공하는 것이 에서 그래픽컬한 환경을 제공하는 것이 DDDD( Display Data Debugger)DD( Display Data Debugger) 이다이다 . . DDDDDD 는 일반적으로 다른 디버거보다 사용하는데 는 일반적으로 다른 디버거보다 사용하는데 편리한 인터페이스를 제공하고편리한 인터페이스를 제공하고 , , 또 디버깅을 또 디버깅을 하는데 필요한 환경을 손쉽게 설정할 수 있다하는데 필요한 환경을 손쉽게 설정할 수 있다 . . 하지만하지만 , , 디버거는 기본적으로 디버거는 기본적으로 gdbgdb 를 사용하고를 사용하고 , , 인터페이스만을 제공한다는 점을 명심 해야한다인터페이스만을 제공한다는 점을 명심 해야한다 . . 따라서 따라서 DDDDDD 는 는 gdbgdb 가 꼭 있어야만 한다가 꼭 있어야만 한다 . gdb. gdb말고도말고도 , dbx, dbx 나 나 xdb, jdbxdb, jdb 를 이용할 수도 있다를 이용할 수도 있다 . .

Page 6: programming with GDB

Programming with Programming with DebuggerDebugger

66

DDD DDD 실행화실행화면면

Page 7: programming with GDB

Programming with Programming with DebuggerDebugger

77

XxgdbXxgdb xxgdbxxgdb 는 는 gdbgdb 에 기초한 에 기초한 X X 윈도우 디버거이다윈도우 디버거이다 ..

JDBJDB자바 애플리케이션을 디버그자바 애플리케이션을 디버그 (debug)(debug) 할 수 할 수 있는 자바 도구이다있는 자바 도구이다 ..

ITS4ITS4CigitalCigital 에서 만든 툴로서 에서 만든 툴로서 C/C++ C/C++ 소스 코드를 소스 코드를 검사해 문제점이 있는 코드를 찾아준다검사해 문제점이 있는 코드를 찾아준다 . UNIX. UNIX와 와 WINDOWS WINDOWS 환경에서도 실행되는 환경에서도 실행되는 CommanCommand-line d-line 방식의 디버거이다방식의 디버거이다 ..

Page 8: programming with GDB

Programming with Programming with DebuggerDebugger

88

RATSRATSSecure Software SolutionsSecure Software Solutions 에서 만든 툴이다에서 만든 툴이다 . RATS. RATS 를 를 사용하면 사용하면 C, C++, Perl, PHP, C, C++, Perl, PHP, 파이썬 소스 코드의 파이썬 소스 코드의 버그를 발견할 수 있다버그를 발견할 수 있다 . . RATSRATS 는 유닉스용과 윈도우용 모두 나와 있기 때문에 는 유닉스용과 윈도우용 모두 나와 있기 때문에 플랫폼에 구애 받지 않고 사용 가능하다플랫폼에 구애 받지 않고 사용 가능하다 ..

SPLINTSPLINT미국 버지니아 대학에서 만든 미국 버지니아 대학에서 만든 C C 소스 코드 검사 소스 코드 검사 툴이다툴이다 ..SplintSplint 는 대학에서 만든 툴답게 다른 툴에 비해 훨씬 는 대학에서 만든 툴답게 다른 툴에 비해 훨씬 체계적으로 소스코드 검사를 할 수 있다는 장점이 체계적으로 소스코드 검사를 할 수 있다는 장점이 있지만 사용하기가 조금 복잡하다는 단점이 있다있지만 사용하기가 조금 복잡하다는 단점이 있다 ..

Page 9: programming with GDB

Programming with Programming with DebuggerDebugger

99

FlawfinderFlawfinder데이빗 휠러데이빗 휠러 (David Wheeler)(David Wheeler) 가 만든 가 만든 C C 소스 소스 코드 검사 프로그램이다코드 검사 프로그램이다 . . FlawfinderFlawfinder 은 은 UnixUnix 와 같은 환경에서 와 같은 환경에서 작동된다작동된다 . . 또또 , Windows , Windows 시스템에도 쉽게 시스템에도 쉽게 pport ort 할 수 있다할 수 있다 . . 실행하기 위해서는 실행하기 위해서는 Python Python 1.51.5 나 그 이상의 버전이 필요하다나 그 이상의 버전이 필요하다 ..

Page 10: programming with GDB

Programming with Programming with DebuggerDebugger

1010

ProfilingProfiling ProfilingProfiling 이라고 하는 것은 프로그램의 어떤 이라고 하는 것은 프로그램의 어떤 부분이 제일 자주 호출되고 있는지 또는 많은 부분이 제일 자주 호출되고 있는지 또는 많은 시간을 소요하고 있는지를 조사하는 것이다시간을 소요하고 있는지를 조사하는 것이다 . . 코드를 최적화시키고 시간이 가장 많이 코드를 최적화시키고 시간이 가장 많이 소비되는 곳을 고쳐주는 좋은 방법이다소비되는 곳을 고쳐주는 좋은 방법이다 . . 이렇게 하기 위해서는 이렇게 하기 위해서는 -p -p 옵션을 주어서 시간 옵션을 주어서 시간 정보를 오브젝트 화일들이 가질 수 있도록 정보를 오브젝트 화일들이 가질 수 있도록 다시 컴파일 해주어야 한다다시 컴파일 해주어야 한다 . . 또한 또한 binutil binutil 패키지에 있는 패키지에 있는 gprof gprof 라는 것을 필요로 한다라는 것을 필요로 한다 ..

Page 11: programming with GDB

Programming with Programming with DebuggerDebugger

1111

gprpfgprpf 프로파일러는 프로그램의 실제 실행을 통하여 얻어진 프로파일러는 프로그램의 실제 실행을 통하여 얻어진 정보를 사용하기 때문에정보를 사용하기 때문에 , , 소스 코드를 눈으로 보고 소스 코드를 눈으로 보고 분석하기에는 벅찬 복잡한 프로그램이나 대형 분석하기에는 벅찬 복잡한 프로그램이나 대형 프로그램에 사용할 수 있다프로그램에 사용할 수 있다 . . 그러나그러나 , , 프로그램이 프로그램이 어떻게 실행되냐에 따라 프로파일 데이터에 나타나는 어떻게 실행되냐에 따라 프로파일 데이터에 나타나는 정보가 달라질 수도 있다정보가 달라질 수도 있다 . . 즉즉 , , 프로파일하고자 하는 프로파일하고자 하는 프로그램의 특정 기능이 프로파일링 과정중에 사용되지 프로그램의 특정 기능이 프로파일링 과정중에 사용되지 않는다면않는다면 , , 해당 기능에 대한 프로파일 정보를 분석할 해당 기능에 대한 프로파일 정보를 분석할 수가 없게 된다수가 없게 된다 . . 프로파일링 분석 결과는 한 개의 프로파일링 분석 결과는 한 개의 파일에 저장되며파일에 저장되며 , , 이 파일에는 이 파일에는 flat profileflat profile 과 과 call graphcall graph로 불리우는 두 개의 테이블과 이들 테이블의 내용에 로 불리우는 두 개의 테이블과 이들 테이블의 내용에 대한 간략한 설명이 포함되어 있다대한 간략한 설명이 포함되어 있다 . Flat profile. Flat profile 은 은 프로그램내의 각각의 함수에서 소비된 시간과 각각의 프로그램내의 각각의 함수에서 소비된 시간과 각각의 함수가 호출된 횟수에 대한 정보를 표시한다함수가 호출된 횟수에 대한 정보를 표시한다 . .

Page 12: programming with GDB

Programming with Programming with DebuggerDebugger

1212

KprofKprof KprofKprof 는 는 gprofgprof 에 의해서 생성된 에 의해서 생성된 profileprofile 를 보기쉽게 를 보기쉽게 보여주기 위한 툴이다보여주기 위한 툴이다 . gprof. gprof 에 의해 생성된 에 의해 생성된 profileprofile이 읽기 힘들기 때문에 이 읽기 힘들기 때문에 kprofkprof 는 이해하기 쉽도록 는 이해하기 쉽도록 listlist-view-view 나 나 tree-viewtree-view 의 형식으로 보여준다의 형식으로 보여준다 ..

GcovGcovgcovgcov 는 는 test coverage test coverage 프로그램으로 프로그램으로 GNU CCGNU CC 와 와 함께 사용함으로써 좀 더 효율적이고함께 사용함으로써 좀 더 효율적이고 , , 빠른 속도의 빠른 속도의 실행 코드를 작성하는데 필요한 프로그램 분석을 실행 코드를 작성하는데 필요한 프로그램 분석을 위하여 사용한다위하여 사용한다 . gcov. gcov 는 코드 최적화를 사용시 는 코드 최적화를 사용시 코드의 성능이 향상될 수 있는 지점을 찾는 코드의 성능이 향상될 수 있는 지점을 찾는 프로파일링 툴로 사용할 수 있으며프로파일링 툴로 사용할 수 있으며 , grpof, grpof 와 같은 와 같은 다른 프로파일링 툴과 함께 사용하여 계산 시간의 다른 프로파일링 툴과 함께 사용하여 계산 시간의 많은 부분을 점유하는 코드 영역을 평가하는데 많은 부분을 점유하는 코드 영역을 평가하는데 사용할 수도 있다사용할 수도 있다 ..

Page 13: programming with GDB

Programming with Programming with DebuggerDebugger

1313

소스코드 편집하기소스코드 편집하기 11 Emace Emace 시작하기시작하기

% Emacs hi.c% Emacs hi.c

종료하기 종료하기 Ctrl-x Ctrl-c Ctrl-x Ctrl-c

Page 14: programming with GDB

Programming with Programming with DebuggerDebugger

1414

소스코드 편집하기소스코드 편집하기 22 커서이동커서이동 11

Ctrl-bCtrl-b 한글자 앞으로 이동한글자 앞으로 이동 Ctrl-fCtrl-f 한글자 뒤로 이동한글자 뒤로 이동 Ctrl-pCtrl-p 앞줄로 이동앞줄로 이동 Ctrl-nCtrl-n 뒷줄로 이동뒷줄로 이동 ESC bESC b 한 단어 앞으로 이동한 단어 앞으로 이동 ESC fESC f 한 단어 뒤로 이동한 단어 뒤로 이동 Ctrl-aCtrl-a 현재 줄의 맨 앞으로 이동현재 줄의 맨 앞으로 이동 Ctrl-eCtrl-e 현재 줄의 맨 뒤로 이동현재 줄의 맨 뒤로 이동

Page 15: programming with GDB

Programming with Programming with DebuggerDebugger

1515

소스코드 편집하기소스코드 편집하기 33 커서이동커서이동 22

Ctrl-vCtrl-v 한 페이지 아래로 이동한 페이지 아래로 이동 ESC vESC v 한 페이지 위로 이동한 페이지 위로 이동 ESC >ESC > 파일의 맨 끝으로 이동파일의 맨 끝으로 이동 ESC <ESC < 파일의 맨 앞으로 이동파일의 맨 앞으로 이동 ESC aESC a 문장의 맨 앞으로 이동문장의 맨 앞으로 이동 ESC eESC e 문장의 맨 뒤로 이동문장의 맨 뒤로 이동 ESC CtrESC Ctr -a-a 함수의 맨 앞으로 이동함수의 맨 앞으로 이동 ESC CtrESC Ctr -e -e 함수의 맨 뒤로 이동함수의 맨 뒤로 이동 Ctrl-uCtrl-u 이전 명령의 네 번 실행 이전 명령의 네 번 실행

Page 16: programming with GDB

Programming with Programming with DebuggerDebugger

1616

소스코드 편집하기소스코드 편집하기 44 글을 지우고 되살리기글을 지우고 되살리기 DELDEL 커서의 왼쪽에 있는 글자를 지운다커서의 왼쪽에 있는 글자를 지운다 .. Ctrl-d Ctrl-d 커서 아래의 글자를 지운다커서 아래의 글자를 지운다 .. ESC DEL ESC DEL 커서 왼쪽의 단어를 지운다커서 왼쪽의 단어를 지운다 .. ESC d ESC d 커서 오른쪽의 단어를 지운다커서 오른쪽의 단어를 지운다 .. Ctrl-k Ctrl-k 커서 오른쪽부터 줄 끝까지 지운다커서 오른쪽부터 줄 끝까지 지운다 .. Ctrl-@ Ctrl-@ 구역의 시작을 지정한다구역의 시작을 지정한다 .. Ctrl-w Ctrl-w 구역 시작 부분부터 커서 사이의 영역을 지운다구역 시작 부분부터 커서 사이의 영역을 지운다 .. Ctrl-y Ctrl-y 바로 이전에 지운 부분을 되살린다바로 이전에 지운 부분을 되살린다 ..

(( 한 글자의 경우에는 동작하지 않는다한 글자의 경우에는 동작하지 않는다 .).) ESC y ESC y 바로 그 이전에 지운 글을 되살린다바로 그 이전에 지운 글을 되살린다 ..

( Ctrl-y ( Ctrl-y 다음에 사용한다다음에 사용한다 .).) Ctrl-x u Ctrl-x u 바로 이전 명령을 취소한다바로 이전 명령을 취소한다 ..

(( 다른 용도로도 많이 사용다른 용도로도 많이 사용 ) )

Page 17: programming with GDB

Programming with Programming with DebuggerDebugger

1717

소스코드 편집하기소스코드 편집하기 55 찾기와 바꾸기찾기와 바꾸기

Ctrl-sCtrl-s 반복하며 계속 앞으로 찾기를 한다반복하며 계속 앞으로 찾기를 한다 .. Ctrl-rCtrl-r 반복하며 계속 뒤로 찾기를 한다반복하며 계속 뒤로 찾기를 한다 .. ESCESC 점진적 찾기를 끝냈다점진적 찾기를 끝냈다 .. ESC %ESC % 질의 바꾸기 질의 바꾸기 !! 질의하지 않고 모든 것을 바꾼다질의하지 않고 모든 것을 바꾼다 .. nn 찾고자하는 다음 문자열로 건너뛴다찾고자하는 다음 문자열로 건너뛴다 .. ESCESC 더 나아가지 않고 질의 바꾸기를 끝낸다더 나아가지 않고 질의 바꾸기를 끝낸다 .. .. 현재 위치에서 바꾸기를 하고 끝낸다현재 위치에서 바꾸기를 하고 끝낸다 .. ^̂ 이전에 일치한 글자로 이동한다이전에 일치한 글자로 이동한다 . .

Page 18: programming with GDB

Programming with Programming with DebuggerDebugger

1818

소스코드 편집하기소스코드 편집하기 66 파일 저장하기파일 저장하기

Ctrl-x Ctrl-sCtrl-x Ctrl-s 현재 편집하고 있는 파일을 저장현재 편집하고 있는 파일을 저장 .. Ctrl-x Ctrl-wCtrl-x Ctrl-w 파일을 다른 이름으로 저장파일을 다른 이름으로 저장 . . Ctrl-x Ctrl-fCtrl-x Ctrl-f 파일을 불러온다파일을 불러온다 . . Ctrl-x Ctrl-rCtrl-x Ctrl-r 파일을 읽기 전용으로 불러온다파일을 읽기 전용으로 불러온다 .. Ctrl-x Ctrl-qCtrl-x Ctrl-q 읽기 전용 파일을 기록할 수 읽기 전용 파일을 기록할 수 있도록 만들거나있도록 만들거나 , , 그 반대의 동작을 한다그 반대의 동작을 한다 ..

Page 19: programming with GDB

Programming with Programming with DebuggerDebugger

1919

소스코드 편집하기소스코드 편집하기 77 다중창다중창

C-x n nC-x n n 개의 창으로 나누기개의 창으로 나누기 C-x 0 C-x 0 창 없애기창 없애기 C_x 1 C_x 1 창 하나만 남기기창 하나만 남기기 C-x C-f C-x C-f 파일경로 다른 파일 보기파일경로 다른 파일 보기 C-x C-c C-x C-c 모든 프레임 닫기 모든 프레임 닫기

Page 20: programming with GDB

Programming with Programming with DebuggerDebugger

2020

소스코드 편집하기소스코드 편집하기 88 들여쓰기와 주석 보조 기능들여쓰기와 주석 보조 기능

Tab Tab 각 행별 자동 들여쓰기 각 행별 자동 들여쓰기 코드의 들여쓰기가 잘못되었을 경우 – 커서를 그줄에 코드의 들여쓰기가 잘못되었을 경우 – 커서를 그줄에 두고 두고 TabTab 키키

ESC ESC 줄의 맨끝에 주석기호 삽입 줄의 맨끝에 주석기호 삽입

쉘창쉘창 ESC x shell ESC x shell

Page 21: programming with GDB

Programming with Programming with DebuggerDebugger

2121

EmacsEmacs 에서 컴파일에서 컴파일 Esc-x compileEsc-x compile 그 후에 컴파일 모드 설정그 후에 컴파일 모드 설정

cc –g hi.c –o hi <enter>cc –g hi.c –o hi <enter>

Ctrl x ` Ctrl x ` 에러 난 줄로 이동하기 에러 난 줄로 이동하기

Page 22: programming with GDB

Programming with Programming with DebuggerDebugger

2222

gdbgdb 실행하기실행하기‘‘M-x gdb’M-x gdb’ 를 친다를 친다 ..그다음에는 그다음에는 gdbgdb 에서 어떤 파일을 디버거 할 에서 어떤 파일을 디버거 할 것인지 물어보는 메시지가 출력된다것인지 물어보는 메시지가 출력된다 . . 그 그 뒤에 디버그 할 파일이나 뒤에 디버그 할 파일이나 process-idprocess-id 를 를 입력한다입력한다 ..그 다음에는 하나의 창에 그 다음에는 하나의 창에 gdb gdb 인터페이스가 인터페이스가 출력이 된다 출력이 된다 . . 그 다음 그 다음 gdbgdb 를 사용하면 를 사용하면 된다된다 ..

Page 23: programming with GDB

Programming with Programming with DebuggerDebugger

2323

기본적인 명령어기본적인 명령어 11 정지점 설정하기정지점 설정하기

breakbreak arg : arg : 정지점을 설정한다정지점을 설정한다 . . info breakinfo break : break : break 를 설정한 모든 정보를 를 설정한 모든 정보를 보여준다보여준다 . . disable breakdisable break num : num num : num 에 해당되는 정지점을 에 해당되는 정지점을 비활성화 시킨다비활성화 시킨다 . . delete break delete break numnum : num: num 에 해당되는 정지점을 에 해당되는 정지점을 지운다지운다 . .

Page 24: programming with GDB

Programming with Programming with DebuggerDebugger

2424

기본적인 명령어기본적인 명령어 22 프로그램 실행프로그램 실행 11

runrun : : 프로그램 내에 정지점을 처음으로 만날 프로그램 내에 정지점을 처음으로 만날 때까지 실행한다때까지 실행한다 . . stepstep : : 한 단계씩 실행한다한 단계씩 실행한다 . . nextnext : : 한 단계씩 실행을 한다한 단계씩 실행을 한다 . .

함수를 호출하는 명령어를 만나면 그 해당하는 함수를 다 함수를 호출하는 명령어를 만나면 그 해당하는 함수를 다 실행하고 함수 안으로 들어가지는 않는다실행하고 함수 안으로 들어가지는 않는다 . .

continuecontinue : : 프로그램이 수행중이고 어느줄에서 프로그램이 수행중이고 어느줄에서 멈쳐져 잇을 때멈쳐져 잇을 때 , , 정지점이 설정된 곳까지 정지점이 설정된 곳까지 프로그램을 실행하는 명령어이다프로그램을 실행하는 명령어이다 . .

Page 25: programming with GDB

Programming with Programming with DebuggerDebugger

2525

기본적인 명령어기본적인 명령어 33 프로그램 실행프로그램 실행 22

finishfinish : : 어느 함수에 들어가 있을 경우 그 함수가 어느 함수에 들어가 있을 경우 그 함수가 retreturn urn 될 때까지 실행하고될 때까지 실행하고 , return, return 값을출력 후에 곧바로 값을출력 후에 곧바로 멈춘다멈춘다 . . returnreturn value: value: 들어가 있는 함수나 들어가 있는 함수나 mainmain 에서 에서 나머지코드를 수행하지 않고 나머지코드를 수행하지 않고 vaulevaule 값을 값을 return return 한다한다 . . jumpjump num : num num : num 에 해당되는 줄에서부터 프로그램을 에 해당되는 줄에서부터 프로그램을 실행한다실행한다 . . 현재 있던 줄에서 현재 있던 줄에서 numnum 에 해당되는 줄 에 해당되는 줄 사이에 있는 코드는 실행하지 않는다사이에 있는 코드는 실행하지 않는다 . . untiluntil : : 순환문이 종료될 때까지 실행 하는 명령어순환문이 종료될 때까지 실행 하는 명령어 ..

Page 26: programming with GDB

Programming with Programming with DebuggerDebugger

2626

기본적인 명령어기본적인 명령어 44 자료 점검자료 점검

whatiswhatis 표현식 표현식 : : 표현식의 표현식의 typetype 을 출력해 준다을 출력해 준다 . . printprint 표현식 표현식 : : 표현식에 해당하는 값을 출력표현식에 해당하는 값을 출력 ptypeptype 표현식 표현식 : struct: struct 나 나 classclass 의 의 fieldsfields 의 의 선언을 보여준다선언을 보여준다 . . info localsinfo locals : : 현재의 함수 안에 선언된 변수 모두를 현재의 함수 안에 선언된 변수 모두를 출력한다출력한다 . . print/<print/< 옵션옵션 >> : option : option 은 해당하는 진수로 출력한은 해당하는 진수로 출력한 ..

xx(16(16 진수진수 ), ), dd(10(10 진수진수 ), ), uu(( 양수 십진수양수 십진수 ), ), oo(8(8 진수진수 ), ), tt(2(2진수진수 ), ), aa(16(16 진수로 절대 주소와 상대주소진수로 절대 주소와 상대주소 ) )

displaydisplay 표현식 표현식 : : 표현식의 값을 계속 모니터링 표현식의 값을 계속 모니터링

Page 27: programming with GDB

Programming with Programming with DebuggerDebugger

2727

그 외 쓸만한 명령어들그 외 쓸만한 명령어들 11 명령 자동 실행명령 자동 실행

commandscommands 정지점번호… 명령어들 … 정지점번호… 명령어들 … endend : : 프로그램이 실행 중에 정지점 번호에 해당되는 프로그램이 실행 중에 정지점 번호에 해당되는 정지점에 도달하면 명령어들을 실행한다정지점에 도달하면 명령어들을 실행한다 . . listlist : : 실행중인 줄번호를 가운데로 놓고 소스코드 실행중인 줄번호를 가운데로 놓고 소스코드 1010 줄을 출력줄을 출력 denfinedenfine 명령어이름 … 명령어들 … 명령어이름 … 명령어들 … endend : comma : command nd 와는 다르게 언제든지 명령어들을 실행할 수 와는 다르게 언제든지 명령어들을 실행할 수 있다있다 . . sourcesource 명령어가담김파일이름 명령어가담김파일이름 : : 해당 파일 에서 해당 파일 에서 명령어를 읽어서 실행 명령어를 읽어서 실행

Page 28: programming with GDB

Programming with Programming with DebuggerDebugger

2828

그 외 쓸만한 명령어들그 외 쓸만한 명령어들 22 stack stack 제어 제어

wherewhere :. :. 스택에 쌓여있는 함수들의 정보를 출력스택에 쌓여있는 함수들의 정보를 출력 Frame Frame : : 프레임 번호가 없이 명령어가 실행되면 프레임 번호가 없이 명령어가 실행되면 현재 실행중인 함수의 현재 실행중인 함수의 stack framestack frame 의 간단한 의 간단한 정보를 출력정보를 출력 info frame info frame : : 현재 실행중인 함수의 현재 실행중인 함수의 stack framestack frame의 자세한 정보를 출력의 자세한 정보를 출력 upup 넘어갈단계수 넘어갈단계수 : : 상위 프레임으로상위 프레임으로 . . downdown 넘어갈단계수 넘어갈단계수 : : 하위 프레임으로하위 프레임으로 ..

Page 29: programming with GDB

Programming with Programming with DebuggerDebugger

2929

그 외 쓸만한 명령어들그 외 쓸만한 명령어들 33 하드웨어 수준의 제어하드웨어 수준의 제어

info lineinfo line 줄번호 줄번호 : : 줄 번호에 해당되는 코드의 줄 번호에 해당되는 코드의 메모리내의 시작주소와 끝나는 주소를 보여준다메모리내의 시작주소와 끝나는 주소를 보여준다 . . diassemblediassemble 시작주소 끝나는주소 시작주소 끝나는주소 : : 시작 주소와 시작 주소와 끝나는 주소 사이의 어셈블리 언어 코드를 끝나는 주소 사이의 어셈블리 언어 코드를 보여준다보여준다 . . stepistepi : : 어셈블리 언어 코드 수준의 단계로 실행어셈블리 언어 코드 수준의 단계로 실행 .. nextinexti : : 어셈블리 언어 코드 수준의 단계로 실행어셈블리 언어 코드 수준의 단계로 실행 ..

어셈블리 코드가 함수를 호출하는 코드이면 그 함수가 어셈블리 코드가 함수를 호출하는 코드이면 그 함수가 rreturneturn 할 때 까지 계속 실행 할 때 까지 계속 실행

Page 30: programming with GDB

Programming with Programming with DebuggerDebugger

3030

그 외 쓸만한 명령어들그 외 쓸만한 명령어들 44 shell shell shellshell 명령어 명령어 :: gdb gdb 프롬프트 안에서 프롬프트 안에서 shshellell 을 사용하기 위한 명령을 사용하기 위한 명령 ..

Page 31: programming with GDB

Programming with Programming with DebuggerDebugger

3131

자식 프로세스 디버깅의 어려움 자식 프로세스 디버깅의 어려움 여러가지 환경변수로 인해 자식프로세스에게 여러가지 환경변수로 인해 자식프로세스에게 디버거를 붙이기가 어렵다디버거를 붙이기가 어렵다 ..

hp-uxhp-ux 에서만 제공하는 에서만 제공하는 gdbgdb 에서 사용 에서 사용 가능한 명령어가능한 명령어

set follow-fork-mode set follow-fork-mode modemode parent, child, askparent, child, ask

catch catch 이벤트 이벤트 이벤트 종류 이벤트 종류 : : execexec, , execvpexecvp, , execlpexeclp, , forkfork, , vforkvfork 등등

Page 32: programming with GDB

Programming with Programming with DebuggerDebugger

3232

편법으로 자식프로세스 디버깅하기편법으로 자식프로세스 디버깅하기 1 1 이 방법조차 잘 안 먹히는 경우가 많다이 방법조차 잘 안 먹히는 경우가 많다 .. attachattach process-id process-id

현재 실행되고 있는 프로세스에 붙어서 디버깅을 현재 실행되고 있는 프로세스에 붙어서 디버깅을 한다 한다 꼭 꼭 process-idprocess-id 가 붙어야 한다가 붙어야 한다 .. attach attach 할 할 processprocess 는 는 gdbgdb 의 밖에서 실행되고 의 밖에서 실행되고 있는 있는 processprocess 이어야 한다이어야 한다 . . 즉 즉 background background 로 로 실행되고 있는 실행되고 있는 processprocess 이거나 항상 이거나 항상 background background 로 실행되는 로 실행되는 demon processdemon process 이어야 하는 것이다이어야 하는 것이다 ..

Page 33: programming with GDB

Programming with Programming with DebuggerDebugger

3333

편법으로 자식프로세스 디버깅하기편법으로 자식프로세스 디버깅하기 22 detachdetach : attach : attach 로 로 process process 를 디버그한 를 디버그한 후에 후에 attachattach 한 한 pricesspricess 에서 나가자고 할땐 에서 나가자고 할땐 ddetachetach 명령어를 써야 한다명령어를 써야 한다 . .

순서순서 소스에 소스에 sellp(); -> breakpoint -> sellp(); -> breakpoint -> 실행 실행 -> finis-> finish -> shell ps –a -> attach -> continue -> h -> shell ps –a -> attach -> continue -> 디버깅 시작디버깅 시작

Page 34: programming with GDB

Programming with Programming with DebuggerDebugger

3434

예제소스예제소스 -- 전반전반

Page 35: programming with GDB

Programming with Programming with DebuggerDebugger

3535

예제소스예제소스 -- 후반후반

Page 36: programming with GDB

Programming with Programming with DebuggerDebugger

3636

자식프로세스로 디버깅하기 결과자식프로세스로 디버깅하기 결과 11

Page 37: programming with GDB

Programming with Programming with DebuggerDebugger

3737

자식프로세스로 디버깅하기 결과자식프로세스로 디버깅하기 결과 11

Page 38: programming with GDB

Programming with Programming with DebuggerDebugger

3838

자식프로세스로 디버깅하기 결과자식프로세스로 디버깅하기 결과 22

Page 39: programming with GDB

Programming with Programming with DebuggerDebugger

3939

gdbgdb 에서 제공하는 명령어에서 제공하는 명령어 breakbreak 줄번호 줄번호 threadthread thread thread 번호 번호 set scheduler-lockingset scheduler-locking mode mode

OffOff : : 언제든지 어느 언제든지 어느 thread thread 이든지 실행 가능이든지 실행 가능 .. OnOn : : 현재 실행중인 현재 실행중인 thread thread 만 디버깅동안 만 디버깅동안 실행되어야 한다실행되어야 한다 .. StepStep : : 프로그래머가 프로그래머가 stepstep 을 하고 있는 동안에는 을 하고 있는 동안에는 다른 다른 threadthread 는 현재 디버그 중인 는 현재 디버그 중인 threadthread 의 의 실행권을 뺏을 수 없다실행권을 뺏을 수 없다 ..

SunOs 5.8 SunOs 5.8 에선 이 모드전환을 지원하지 않는다에선 이 모드전환을 지원하지 않는다 . SunO. SunOss 에선 기본값이 에선 기본값이 offoff 로 되어 있다로 되어 있다 . .

Page 40: programming with GDB

Programming with Programming with DebuggerDebugger

4040

예제소스예제소스 11

Page 41: programming with GDB

Programming with Programming with DebuggerDebugger

4141

예제소스예제소스 22

Page 42: programming with GDB

Programming with Programming with DebuggerDebugger

4242

예제소스예제소스 33

Page 43: programming with GDB

Programming with Programming with DebuggerDebugger

4343

예제소스예제소스 4 – 4 – 읽는 스레드읽는 스레드

Page 44: programming with GDB

Programming with Programming with DebuggerDebugger

4444

예제소스예제소스 5 – 5 – 쓰는 스레드쓰는 스레드

Page 45: programming with GDB

Programming with Programming with DebuggerDebugger

4545

스레드 디버깅하는 요령스레드 디버깅하는 요령 mainmain 에선 에선 creatcreat 나 나 joinjoin 을 실행할 단계가 을 실행할 단계가 오면 오면 stepstep 을 사용 한다을 사용 한다 .. Thread Thread 안에 들어오면 안에 들어오면 nextnext 를 사용한다를 사용한다 .. Thread Thread 안에서 안에서 waitwait 같은 세마포어 함수를 같은 세마포어 함수를 만나서 만나서 gdbgdb 프롬프트 창이 안 뜨거나 이상한 프롬프트 창이 안 뜨거나 이상한 에러메세지가 뜨면 에러메세지가 뜨면 continuecontinue 를 사용한다를 사용한다 . . 그렇게 하면 디버그중인 그렇게 하면 디버그중인 threadthread 는 잠들고 는 잠들고 다른 다른 threadthread 로 보통 실행이 넘어간다로 보통 실행이 넘어간다 ..

Page 46: programming with GDB

Programming with Programming with DebuggerDebugger

4646

실습 예제실습 예제http://home.postech.ac.kr/~sinclair/doc/gdb/http://home.postech.ac.kr/~sinclair/doc/gdb/

gcovgcovhttp://purple.icu.ac.kr/~kimkk/guide/gcov/gcov_1.htmlhttp://purple.icu.ac.kr/~kimkk/guide/gcov/gcov_1.html

kprofkprofhttp://www.opensource.co.kr/opensource/proj.php3?projcode=106220http://www.opensource.co.kr/opensource/proj.php3?projcode=106220&page=1&page=1

프로파일링프로파일링http://kldp.org/HOWTO/html/GCC/GCC-HOWTO-5.htmlhttp://kldp.org/HOWTO/html/GCC/GCC-HOWTO-5.html

DBXDBXhttp://it.soongsil.ac.kr/webzine/c/debugger.htmlhttp://it.soongsil.ac.kr/webzine/c/debugger.html

GDBGDB 명령어 리스트 명령어 리스트 http://database.sarang.net/study/gdb/html/gdb-man.htmlhttp://database.sarang.net/study/gdb/html/gdb-man.html

Debugging with GDBDebugging with GDBGNU Software – GNU GNU Software – GNU 소프트에어로 프로그래밍하기소프트에어로 프로그래밍하기

O’Reilly /O’Reilly / 한빛미디어한빛미디어