노무현 대통령 배너


2006. 8. 10. 10:17

디버깅을 익히자!

출처: http://kelp.or.kr/korweblog/stories.php?story=02/05/09/5898005

디버깅을 익히자!
글쓴이 : 조형기 (2002년 05월 09일 오후 11:51) 읽은수: 7,130 [ 임베디드강좌/초보 인쇄용 페이지 ]
디버깅을 익히자 !


- 들어가기 -

프로그래밍을 하는 데 있어 가장 중요한 것이 무엇이라고 생각하는가 ?
요지를 잘못 짐작할 요인이 없지 않은 질문이지만, 외형적인 면을 봤을 때,
그것은 바로 체계적으로 구성된 개발 환경일 것이다.

개발 환경(Development Environment) !

이미 대충 리눅스/유닉스에서의 개발 환경 개요도에 대해서는 알아 보았다. 그럼 그런 개발
환경 요소들 중에 가장 중요한 것은 또 무엇인가 ?
음, 가장 중요한 것은 컴파일러와 어셈블러이겠다. 이것이 없으면 프로그래밍 자체를 할 수
없지 않은가! 음 그 다음은 ?

그렇다! 다 같 이 Debugger !

아무리 최고의 프로그래머라고 하더라도 디버거없이 프로그래밍하기란 쉽지 않을 것이다.
나는 리눅스 토발즈와 앨런 콕스가 어떤 디버거를 사용하는지 또 어떻게 사용하는지, 참
궁금하다. 그들은 혹시 디버거를 사용하지 않을지도 ... 아마 사용할 것이다.

이번 글에서는 리눅스 환경에서 사용할 수 있는 여러가지 디버거에 대해 알아보고,
그것들을 체계적으로 공부할 수 있는 가이드 라인을 제시하겠다.



- 본론 -

리눅스에서 사용할 수 있는 디버거들의 종류에는 다음과 같은 것들이 있다.


===============================================================================================
Command-line debugger

[1] GDB - 리눅스 환경에서 가장 대표적인 디버거. 리차드 스톨만(Richar M. Stallman)과
롤래드 페쉬(Roland H. Pesch), 그 외의 많은 개발자가 만들었다.
현재 버전 5.2가 다운로드 가능하다. www.gnu.org의 gdb 페이지를 요약한다.

What is GDB ?

GDB같은 GNU 프로젝트 디버거의 목적은 프로그램 실행동안 프로그램 내부에서 진행되고 있는 것이
무엇인지를 여러분이 알도록 하는데에 있다. -- 또는 다른 프로그램이 죽는 순간에 무엇을 했는지.

GDB는 여러분이 버그를 잡도록 도와주는 4 종류의 일들(또 이것들을 지원하는 다른 것들)을 할수 있다.

프로그램을 시작할때 프로그램의 행동에 영향을 줄수 있는 것을 지정할수 있다.

1. 여러분의 프로그램을 지정된 조건에서 멈추도록 만든다.
2. 여러분의 프로그램이 멈추었을때 무엇이 일어났는지를 시험할수 있다.
3. 여러분의 프로그램내의 어떤것을 바꾸어서, 여러분이 버그를 고칠수 있도록 실험을 할수 있게 하고
다른것에 대해 배우도록 한다.
4. 여러분은 C나 C++로 쓰여진 프로그램을 디버깅하기 위해 GDB를 사용할수 있다. 더 많은 정보를
위해서, C 그리고 C++ 섹션을 참조해라.

C, C++, Pascal(그리고 다른 많은 언어들)로 짜여진 프로그램들이 디버깅 될 수 있다. 그런 프로그램들은
GDB가 실행되는 머신과 같은 곳에서 실행될 수 있고, 다른 머신(remote)에서도 실행 될 수 있다.
GDB는 대부분의 UNIX 와 Microsoft Windows 플랫폼에서 동작한다.


[2] DBX - BSD Unix에서 주로 사용되는 debugger이다. high-level commands 가지고 있으며 사용자 우호적.
물론 리눅스에서도 컴파일하여 사용할 수 있다.


[3] XDB - 잘 모르겠지만, Google에서 검색해 본 결과, HP-UX 유닉스의 표준 디버거 같다.
CAD-UL 에서 XDB 개발 툴을 체계적으로 판매하는 것 같으며, 주로 임베디드 환경의 개발 툴인 것
같다.


[4] WDB - WDB debugger는 Hewlett-Packard가 지원하는 GDB의 구현체인데, Free Software Foundation에 의해
개발되었다. HP WDB 는 GDB version 5.0에 근거하고 있다. WDB는 HP-UX Releases 10.20 와 11.x
에서 운영되고 있고, HP C, HP aC++, and Fortran 프로그램을 디버깅할 수 있다.
자세한 사항은
http://sdx1.uky.edu/Docs/programming_docs/debugging/wdb/ 이곳을 참고하라.


[5] JDB - 리눅스에서 사용할 수 있는 자바 디버거. 선의 자바 디버거 사이트를 참조하라. 이곳이다.
http://java.sun.com/j2se/1.3/docs/tooldocs/win32/jdb.html


[6] Perl Debugger - 아예 모른다.


[7] Pydb - Python Debugger, 아예 모른다.


=====================================================================================================
Graphical Interfaces to GDB or other debugger

그럼 좀 더 실용적으로 사용할 수 있는 여러 디버거들의 graphical user interface들을 살펴보자.

[1] Insight - a GUI for GDB written in tcl/tk. 레드 햇/시그너스 솔루션 에서 개발하고 있다.
(
http://sources.redhat.com/insight/ )

[2] DDD - GDB 와 dbx 를 위한 가장 유명한 디버거. 그러나 DDD는 거의 모든 디버거의 GUI 프론트 엔드로
사용할 수 있다. 상용 임베디드 리눅스 개발 업체들이 한결 같이 사용하는 그런 GUI 디버거이다.
나도 여기에 초점을 맞추겠다. Motif 툴킷을 필요로 한다. 리눅스에서는 헝그리 프로그래머의
(
http://www.hungry.com/) motif 자유 구현체인 lesstif를 사용하여 잘 쓸수 있다.


[3] Code Medic - 이것도 GDB의 GUI 프론트 엔드이다. Code Medic은 New Planet Software사의 제품이다.
즉, 상용이라는 뜻이다. Code Crusader 라는 GNU 개발툴들의 IDE환경에 디버거이다.
자세한 사항이나 스크린 샷을 보고싶으면 다음으로...(
http://www.newplanetsoftware.com/)


[4] kdbg - 이것도 GDB의 GUI 프론트 엔드, 특별한 점은 Kdevelop의 전용디버거라는 것이다.
(
http://members.nextra.at/johsixt//kdbg.html )

[5] HP Wildebeest - (WDB) version of GDB which is included in new versions of HPUX.
(
http://h21007.www2.hp.com/dspp/tech/tech_TechSoftwareDetailPage_IDX/1,1703,1662,00.html )

[6] GVD - Ada라는 언어로 짜여진 GNU Visual Debugger이다. GtkAda graphical toolkit을 사용한다.
(
http://libre.act-europe.fr/GtkAda/gvd/gvd.html )

[7] Jessie - 제시는 자바로 짜여졌다. multi-thread 와 multi-process 특성을 지원한다.
(
http://oss.sgi.com/projects/jessie/ )

==================================================================================================
음, 참 많은 커맨드 라인 디버거들과 그것들의 GUI 프론트 엔드 프로그램들이 있다. 중요한 것은 이 둘의 관계가
딱 정해 진 것이 아니라는 것이다. 어떤 커맨드라인 디버거에 어떤 GUI 프로트 엔드 프로그램을 붙여 사용할
것인 가는 당신이 정하는 것이다. 하지만 물론 사용하고자 하는 GUI 프론트엔드 프로그램이 진짜 디버거인
커맨드 라인 디버거를 지원해야 만 가능한 것이다. 그런 것이다. 쉽다 !

여러가지 디버거들이 있지만, 모두 디버거이다. 근본 개념은 다 동일하다는 것이다 .그렇지 않겠는가 !
여기서는 대표적인 gdb 와 DDD 를 배움으로써 전체를 다 배웠다고 구라를 쳐보자. 하하하

디버거를 사용하는 것은 그렇게 어렵지 않다고 생각한다. 자기가 짤 만한(즉, 자기 수준의) 프로그램을
디버깅하는 것은 그렇게 어렵지 않다는 것이다.


위 둘을 공부했던 필자의 경험을 토대로 공부의 가이드 라인을 제시하겠다.

[1] gdb

1) 우선 관련서적으로 gdb를 정통으로 익히자.
i) GNU 소프트웨어로 프로그래밍하기 - 오라일리.
ii) Linux Programming Beginning - Wrox.
iii)Running Linux - 오라일리.

2) 리눅스 학당
http://idos.kaist.ac.kr/~mskrap/com/system/ 의 gdb 사용법

3) kelp의 강좌
모바일 자료실에 가면 코티님의 '예제로 배우는 gdb사용법'이 있지요. 살펴 보세요.

4) 마지막으로 가장 자주 찾게 되는 곳
http://database.sarang.net/study/gdb/html/gdb-man.html - 예쁜 GDB 맨 페이지
http://korea.gnu.org/manual/release/gdb/ - gdb 한글 매뉴얼
http://sources.redhat.com/gdb/current/onlinedocs/gdb_toc.html - gdb 영문 매뉴얼

http://korea.gnu.org/manual/release/gdb-internals/ - gdb internals 한글 매뉴얼(번역중)
http://sources.redhat.com/gdb/onlinedocs/gdbint_toc.html - gdb internals 영문 매뉴얼


[2] DDD
내가 가장 좋아하는 디버거. 독일의 안드리아 젤러가(물론 다른 협력 프로그래머들도 있지만) 일생을 받쳐
만들어 온 걸작품. 계속 발전하고 있는 중이며, 비쥬얼한 기능에 비중을 많이 들인 디버거이다.
이런 디버거를 무료로 사용할 수 있을 뿐더러 소스코드 또한 얻을 수 있다는 것이 참 경이롭다.
웹사이트 ---->
http://www.gnu.org/software/ddd/ddd.html

1) ddd 맨페이지, DDD 매뉴얼
가장 좋은 참고 자료이다. ---->
http://www.gnu.org/manual/ddd/html_mono/ddd.html


2) 최고의 프로그래머들이 쓴 잡지의 기사들.
이런 기사들 또한 정말 좋은 안목을 갖게 해 주는 보물들이다. 정말 좋은 내용들이 많다.
대표적인 3개의 유명 기사가 있는데, 그것 중 2개가 한글로 번역이 되었있다.
비교적 최근에 안드리아 젤러가 쓴 'Visual Debugging with DDD'란 기사가 아직 번역이 안되어 있다.
그래서 내가 하고 있는 중이다. 곧 이 글에 첨부하겠다. 기사들을 소개하겠다.


i) 'Debugging using DDD' - Jose M. Laveda , www.linuxfocus.org 에 기재.
번연된 기사가 있는 곳 ---->
http://www.linuxfocus.org/Korean/January1998/article20.html

ii) 'Visual Debugging with ddd' - Wolfgang Mauerer , www.linuxgazette.com 에 기재.
(개인적으로 가장 좋은 예시를 보여준다고 생각한다. )
번역된 기사가 있는 곳 ---->
http://www.whiterabbitpress.com/lg/issue73/mauerer.html

iii) Visual Debugging with DDD - Anreaa Zeller , DDJ 라는 유명한 사이트에 기재하였음.
번역된 기사가 있는 곳 ----> 곧 이곳의 첨부 자료


- 마무리 -

이번에도 역시 가이드 라인밖에 없는 것 같습니다. 저 또한 위의 자료들을 보며 공부하고 있는 중입니다.
혹시 처음 디버거를 접하는 사람이 봐서 조금이나마 동기부여가 되거나 호기심이 생긴다면 성공입니다.
'예술적인 코드를 작성하는 프로그래머는 디버거를 사랑한다' 라는 말을 남기며 이번 글을 마칩니다.

'Utilities' 카테고리의 다른 글

[응용] Makefile 작성법  (2) 2006.08.10
리눅스 디버깅 기술 마스터하기 (한글)  (0) 2006.08.10
리눅스 개발환경의 개요도  (0) 2006.08.10
CVS 사용  (0) 2006.07.26
[본문스크랩] vi 편집기 사용법  (0) 2006.07.21