수안이의 컴퓨터 연구실

  • Mainpage
  • About Me
  • Tags
  • Metapage
  • Notice
  • Location
  • Keywords
  • Guestbook
  • Admin
  • Write an Article
  • Total | 1694047
  • Today | 398
  • Yesterday | 588

1 Articles, Search for 'GDB'

  1. 2007/05/04 GDB를 이용한 Linux 소프트웨어의 디버깅
Unix & Linux/Develop2007/05/04 15:00

GDB를 이용한 Linux 소프트웨어의 디버깅

Core was generated by `./eg1'.
Program terminated with signal 8, Floating point exception.
...
#0  0x80483ea in wib (no1=8, no2=8) at eg1.c:7
7         result = no1 / diff;



이 지점에서 'info locals', 'pront', 'info args' 및 'list'를 시행하여 제로로 나눈 값을 알 수 있다. 'info variables' command는 모든 프로그램의 변수 값을 프린트한다. 그러나 gdb가 program code에서는 물론 C library에서도 변수를 인쇄하므로 시간이 오래 걸린다. Wib()을 호출한 함수에서 무슨 일이 발생했는지 알기 위해 gdb의 stack commands를 사용할 수 있다.

스택 트레이스(Stack traces)
"call stack" 프로그램은 현재까지의 함수에 대한 리스트이다. 각 함수와 변수는 프레임 0("bottom" frame)에서 최근에 호출된 함수와 함께 "frame"으로 할당된다. 스택을 프린트하기 위해 'bt'(backtrace) command를 실행한다 :

(gdb) bt
#0  0x80483ea in wib (no1=8, no2=8) at eg1.c:7
#1  0x8048435 in main (argc=1, argv=0xbffff9c4) at eg1.c:21



이것은 wib() 함수가 21 행의 main()에서 ('list21'로 쉽게 확인가능) 호출되었음을 나타낸다. 또 wib()은 frame 0에, main()은 frame 1에 있음을 나타낸다. 이것은wib()이 frame 0 에 있기 때문인데, frame 0는 arithmetic error가 발생할 때 프로그램 내에서 실행되는 함수이다.

'info locals' command를 시행하면 실제 gdb는 국소 변수(variables local)를 현재 프레임에 프린트한다. 이 프레임은 인터럽트 된 함수가 있는 곳에 (frame 4) 디폴트로 존재한다. 현재 프레임은 'frame' 명령으로 프린트 할 수 있다. 메인 함수(frame 1에 있는)의 변수를 알기 위해 'frame 1'후 'info locals'를 실행하면 frame 1로 스위치 할 수 있다 :

(gdb) frame 1
#1  0x8048435 in main (argc=1, argv=0xbffff9c4) at eg1.c:21
21          result = wib(value, div);
(gdb) info locals
value = 8
div = 8
result = 4
i = 2
total = 6



이것은 "value"와 div"이 같을 때 "for" 루프 (i와 2는 같다)를 통해 오류가 세 번째 발생했음을 가리킨다.

프레임은 두 가지 방식으로 스위치 가능하다. 프레임의 숫자를 분명하게 'frame' 명령에 지정하거나 또는 스택을 위로 움직일 때는 'up', 아래로 움직일 때는 'down' command 실행한다. 프레임에 대해서 주소나 프로그램 언어 같은 자세한 정보를 원하면 'info frame' command를 실행한다.

Gdb stack commands는 core file과 프로그램 실행에 유효하다. 따라서 복잡한 프로그램의 경우에도 실행 중일 때 함수에 어떻게 도달하는 지 추적할 수 있다.

다른 프로세스에 첨부
Core file이나 프로그램의 디버깅 이외에도 gdb는 이미 실행중인 프로세스에 첨부될 수 있다. Core file name 대신, gdb를 첨부하고자 하는 프로그램의 프로세스 ID를 지정하면 된다. Loop 및 sleep를 실행한 예제 프로그램은 다음과 같다 :

eg2 example code #include
int main(int argc, char *argv[])
{
int i;
for(i = 0; i < 60; i++)
{
   sleep(1);
}

return 0;
}




이것을 'gcc-c eg2.c-0 eg2'로 컴파일 해서 './eg2&'로 실행한다. 실행을 시작할 때 프린트 되는 process ID가 1283이다 :

./eg2 &
[3] 1283



Gdb 시작해서 pid를 지정하면, 'gdb eg2 1283'이 된다. Gdb는 "1283"의 core file을 찾지 못하면 gdb는 process 1283에 첨부된다. Gdb가 어디에서 실행되더라도 관계 없다. (이 경우는 아마 sleep()에 위치한다) :

...
/home/seager/gdb/1283: No such file or directory.
Attaching to program: /home/seager/gdb/eg2, Pid 1283
...
0x400a87f1 in __libc_nanosleep () from /lib/libc.so.6
(gdb)



이 지점에서 유용한 gdb가 모두 발생할 수 있다. 'backtrace'를 사용해서 main()과 관련된 위치와 main()의 프레임 숫자가 무엇인지 알 수 있다. 그리고 거기에서 프레임을 스위치 하여 "for" 루프를 몇 번 통과 했는지 알 수 있다 :

(gdb) backtrace
#0  0x400a87f1 in __libc_nanosleep () from /lib/libc.so.6
#1  0x400a877d in __sleep (seconds=1) at ../sysdeps/unix/sysv/linux/sleep.c:78
#2  0x80483ef in main (argc=1, argv=0xbffff9c4) at eg2.c:7
(gdb) frame 2
#2  0x80483ef in main (argc=1, argv=0xbffff9c4) at eg2.c:7
7           sleep(1);
(gdb) print i
$1 = 50



프로그램 설치가 완료되면 'detach' command로 프로그램을 실행할 수도 있고 'kill' command로 없앨(kill) 수도 있다. 또 pid 1283 아래 eg2를 첨부할 수도 있다. 이는 먼저 'file eg2'를 이용해서 그 안에 파일을 로드한 후 'attach 1283' 첨부 명령을 내림으로서 가능하다.

기타 사항
gdb를 이용하면 'detach' command로 디버깅 환경을 종료하지 않고 쉘 명령을 실행할 수 있다. 디버깅을 하면서 소스코드를 변경할 때 유용하게 쓰이는 'shell [commandline]'로서 호출되기 때문이다.

마지막으로 프로그램 실행 중에도 'set' command로 변수 값을 수정할 수 있다. Gdb에서 eg1을 실행한다. 그리고 'break 7 if diff==0' 명령으로 일부만 언급하였다. 자세한 사항은 GNU Debugger 매뉴얼을 참고하기 바란다.
"Develop" 카테고리의 다른 글
  • 공유 라이브러리 이해하기 (0)2007/05/10
  • 컴포넌트를 안전하게 호출하기 (0)2007/05/10
  • GDB를 이용한 Linux 소프트웨어의 디버깅 (0)2007/05/04
  • 객체 비지향(object disoriented)을 위한 공유 객체 (0)2007/05/04
  • Linux 애플리케이션을 위한 DLL 작성하기 (0)2007/05/04
2007/05/04 15:00 2007/05/04 15:00
Posted by webdizen
Tags GDB, 디버깅
No Trackback No Comment

Trackback URL : http://www.webdizen.net/blog/trackback/2897

Leave your greetings.

[로그인][오픈아이디란?]

«Prev  1  Next»

RSS HanRSS
Blog Image
webdizen
이곳은 컴퓨터에 대해 연구하고, 공유하고, 소통하기 위한 연구실입니다. 개인적으로는 OLAP, Data Mining, Semantic Web, Data Modeling에 대해서 연구하고 있습니다.

Categories

전체 (3009)
Webdizen (141)
Life (6)
Diary (16)
Blog (9)
IDEA (2)
Travel (10)
Book (16)
Photo (7)
Movie (8)
Music (14)
Leisure Sports (10)
Funny (6)
Hardware (121)
Software (120)
Windows (5)
Unix & Linux (120)
Installation (5)
Kernel (10)
System (34)
Develop (22)
X-Window (0)
Applicaton (31)
Security (4)
Framework (2)
Hadoop (2)
Programming (804)
Algorithm & Data Structure (1)
Assembly (38)
UNIX/Linux C (95)
C++ (128)
STL (4)
Java (38)
Win32 API (92)
ATL/COM (44)
MFC (151)
.NET (26)
WCF/WPF (4)
C# (28)
Network Programming (17)
Database Programming (12)
OpenGL / DirectX (13)
Multimedia Programming (0)
Game Programming (21)
Parallel Distributed Progra... (0)
Reverse Engineering (0)
Debugging (9)
Python (1)
Ruby (1)
Ruby on Rails (1)
QT (4)
GTK (0)
JSP (0)
PHP (6)
ASP.NET (6)
ASP (2)
Development (28)
Useful Library (2)
Data Modeling (0)
Database (105)
Oracle (4)
MSSQL (41)
MySQL (2)
Data Warehouse (2)
Data Mining (4)
Network (66)
Web (79)
DHTML (4)
XHTML (1)
Javascript (1)
CSS (1)
AJAX (9)
XML (11)
Flex (1)
Silverlight (3)
Security (91)
DoS (1)
Kernel (10)
Scanning (3)
Sniffing (0)
Spoofing (4)
Overflow (28)
Web (11)
Shell (10)
Format String (14)
Window (2)
Embedded (70)
Multimedia (27)
Mobile (14)
Graphic (24)
Management (633)
Knowledge (581)
Hadoop (0)

Notice

  • 메타 블로그 사이트에 등록
  • 새해 맞이 블로그의 변화
  • 블로그 명칭 변경
  • 도메인(www.webdizen.net) 구...
  • TEXTCUBE 1.6.1로 업그레이드...

Tags

  • 로그
  • 스노우보드
  • Regular Expressions
  • SQL Server 2008
  • 60주년 기념관
  • 태백관
  • DB2
  • join
  • 영어
  • Solaris
  • semantic
  • vim
  • Labs
  • 두뇌
  • MITS 4650
  • Solar PHP
  • 올림픽 공원
  • Thread 취소
  • 산림환경과학대학
  • 모니터링 매커니즘

Recent Articles

  • 트위터(Twitter)의 시작!.
  • 청년 리더의 조건.
  • 애플의 타블렛 PC - 아이패드....
  • 미래의 인터페이스 - 육감 기....
  • 기초발성법 동영상 강좌.

Recent Comments

  • 학교 과제물중 쓰레드에 대하....
    장진혁 03/17
  • 관리자만 볼 수 있는 댓글입....
    비밀방문자 03/12
  • 상대방의 이야기를 열심히 경....
    DoNuts 03/03
  • Lots of students know techn....
    Bobbi35Shannon 02/25
  • 좋은글 잘 보고 갑니다..
    Und_hacker 01/08

Recent Trackbacks

  • printf,scanf를 이용한 형식....
    yundream의 프로그래밍 이야기 03/10
  • 파일 열기/저장하기 CFileDialog.
    은마군의 나태블록 2009
  • World IT Show 2008.
    상우 :: Oranzie's BLOG 2008
  • cvs서버 설치하기.
    3인3색 2008
  • 속속 공개되는 Google Chart....
    PHP와 Web 2.0 2007

Archive

  • 2010/02 (1)
  • 2010/01 (6)
  • 2009/12 (5)
  • 2009/09 (3)
  • 2009/08 (1)

Calendar

«   2010/03   »
일 월 화 수 목 금 토
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      

Bookmarks

    • Administration
      • IIS.NET
      • NTFAQ
      • OS의 모든 것
      • 리눅스포털
    • Database
      • SQL Server Central
      • SQL Team
    • Development
      • .NET Heaven
      • ASP Alliance
      • ASP.NET 2.0
      • Bullog.net
      • C# Corner
      • C++ (C PlusPlus.com)
      • C++ Reference
      • CodeGuru
      • CodePlex
      • DebugLab
      • Dev Articles
      • Devpia
      • DotNet Junkies
      • DotNet Zone
      • Driver Online
      • GOSU.NET
      • HOONS 닷넷
      • Joinc 팀블로그
      • KOSR
      • MSDN Home Page
      • OSR Online
      • Sky.ph - 개발자 커뮤니...
      • TAEYO.NET
      • The Code Project
      • WindowsClient.net
      • 김상욱의 개발자 Side
      • 조인시 위키
    • Human Networks
      • belief21c's e-space
      • I think I can
      • Invisible Rover's Blog :D
      • Rodman®
      • ■ Feel So Good~! ■
      • 까만 나비
      • 나를 가꾸는 시간.
      • 나만의 즐거움~~!
      • 단녕
      • 상우 :: Oranzie's BLOG
    • Information Technology
      • Microsoft TechNet
      • 지디넷코리아 - 글로벌...
    • Security
      • FoundStone
      • milw0rm
      • NewOrder
      • OpenRCE
      • Phrack.org
      • Reverse Engineering b1...
      • Reverse Engineering Team
      • RootKit
      • SecurityFocus
      • SecurityXploded by Nag...
      • Wow Hacker
      • Zone-H
Textcube
Louice Studio Inc.
Powered by Textcube. Original designed by Tistory.