GNU 디버거

GNU Debugger
GNU 디버거
GDB Archer Fish by Andreas Arnez.svg
GNU gdb 12.1 screenshot.png
개발자GNU 프로젝트
초기 릴리즈1986년, 36년(연장)
안정된 릴리스
2022년 5월 1일 / 12.1일[1]
저장소
기입처C
운영 체제Unix 계열, Windows
유형디버거
면허증.GPLv3
웹 사이트www.gnu.org/software/gdb

GNU 디버거(GDB)는 많은 Unix 계열 시스템에서 실행되는 휴대용 디버거Ada, C, C++, Objective-C, Free Pascal, Fortran, [2]Go 등을 포함한 [3]많은 프로그래밍 언어에서 작동합니다.

역사

GDB는 GNU Emacs가 "합리적으로 안정된"[4] 후에 1986년 Richard Stallman에 의해 GNU 시스템의 일부로 처음 작성되었습니다.GDB는 GNU General Public License(GPL)에 따라 출시된 무료 소프트웨어입니다.Berkeley Unix [4]배포판과 함께 제공된 DBX 디버거를 본떠 만들어졌습니다.

1990년부터 1993년까지 존 길모어[5]의해 유지되었다.현재는 자유 소프트웨어 [6]재단이 임명한 GDB 운영위원회에 의해 유지되고 있습니다.

기술적 세부사항

특징들

GDB는 컴퓨터 프로그램의 실행을 추적하고 변경하기 위한 광범위한 기능을 제공합니다.사용자는 프로그램의 내부 변수 값을 모니터링 및 수정할 수 있으며, 프로그램의 정상 동작과는 독립적으로 함수를 호출할 수도 있습니다.

GDB 타깃 프로세서(2003년 기준)는 다음과 같습니다.Alpha, ARM, AVR, H8/300, Altera Nios/Nios II, System/370, System 390, X86 및 그 64비트 확장 X86-64, IA-64 "Itanium", Motorola 68000, MIPS, PA-RISC, Super Sparh표준 릴리스에서 지원되는 덜 알려진 대상 프로세서에는 A29K, ARC, ETRAX CRIS, D10V, D30V, FR-30, FR-V, 인텔 i960, 68HC11, Motorola 88000, MCORE, MN10200, MN10300, NS32816, Stormy 이 있습니다.GDB는 M32R이나 V850[7]같은 덜 알려진 타깃 프로세서를 위한 시뮬레이터를 컴파일했습니다.

지상 유도 폭격 여전히 활발하게 개발되고 있다.버전의 7.0은 새로운 특징들과 버전 7.8의 GNUGuile 뿐만 아니라 XSS파이선 scripting[8]에 대한 지원을 포함한다.[9]이후"디버깅 가역"—에 대한 버전 7.0, 지원으로 많이 추락한 프로그램이 —을 사용할 수 있는 일이 발생했는지 보를 되감고 좋아하는 디버깅 세션을 허락한다.[10]

리모트 디버깅

지상 유도 폭격은"원격"모드일 때 포함된 시스템을 디버깅 하는 자주 사용하는 제공한다.때 지상 유도 폭격 한 기계에 달린 원격 작동 및 프로그램이 디버그 되어 다른 사람에 흘러들어 갑니다.지상 유도 폭격은 스텁 프로그램은 통신 프로토콜의 목표 쪽을 구현하는 적절한 스텁 파일 지상 유도 폭격으로 제공하는 것에 의해 만들어질 수 있는 직렬 장치 또는 TCP[11]을 통해 지상 유도 폭격 프로토콜을 관리하고 원격"스터브"에 소통할 수 있다.[12]또는, gdbserver 원격으로 어떤 식으로든 그것을 바꿀 필요 없이 프로그램을 디버깅 하는 데 사용할 수 있다.

그 같은 모드 또한 KGDB에 의해 gdb과 자원 상태에 달리는 리눅스 커널을 디버깅 하는 작업에 사용된다.그들이 응용 프로그램 debug KGDB으로, 커널 개발자들은 같은 방식으로 커널 디버깅 할 수 있다.그것은 커널 코드에서 이 가능한 곳 중단점,는 코드를 통해 단계였고, 관찰하다 변수를 만든다.때 지정된 메모리 주소 또는 액세스 하는 실행되고 있어 하드웨어 디버깅 레지스터를 사용할 수 있는 구조에서, watchpoints는 트리거 중단점 설정할 수 있습니다.KGDB는 기계 직렬 케이블이나 이더넷을 사용하고 디버그 되어 있다에 접속되는 추가 장치.FreeBSD의, 또한 찾아 고치다 파이어 와이어 기억 장치 직접 접근(DMA)를 사용하여 가능하다.[13]

그래피컬 사용자 인터페이스

하더라도, 텍스트 사용자 인터페이스가 들어 있나 그 디버거, 명령줄 인터페이스에 기본 값, 자체 그래픽 사용자 인터페이스가 포함되어 있지 않다.몇몇 front-ends, UltraGDB, Xxgdb, 데이터 디스플레이 디버거(DDD가 9/5), Nemiver, KDbg, Xcode디버거, GDBtk/Insight, Seer, 그리고 HPWildebeest 디버거 그래픽 사용자 인터페이스(WDB 그래픽 사용자 인터페이스)등이 설립되었다.IDEs Codelite, 코드 같은::.블록, Dev-C++, Geany, GNAT Programming Studio(GPS), KDevelope, Qt Creator, Lazarus, MonoDevelope, Eclipse, NetBeans 및 Visual Studio는 GDB와 인터페이스할 수 있습니다.GNU Emacs에는 "GU 모드" 및 ve용 도구가 있습니다.IDE에서 볼 수 있는 디버거와 유사한 기능을 제공합니다.

메모리 리크 디텍터 등 기타 디버깅툴은 GDB에서 동작하도록 설계되어 있습니다.

내부

GDB는 ptrace라는 이름의 시스템 호출(이름은 "프로세스 트레이스"의 약자)을 사용하여 다른 프로세스의 실행을 관찰 및 제어하고 프로세스의 메모리와 레지스터를 검사 및 변경합니다.일반적인 gdb 명령어와 대응하는 ptrace 콜 목록을 다음에 나타냅니다.

  • (gdb) start : PTRACE_TRACEME : 부모를 트레이서(트레이서로 호출)로 합니다.
  • (gdb) attach PID: PTRACE_ATTCH – 실행 중인 프로세스에 연결
  • (gdb) stop: kill(child_pid, SIGSTOP)(또는 PTRACE_INTERPT)
  • (gdb) 속행: PTRACE_CONT
  • (gdb) 정보 레지스터 : PTRACE_GET(FP)REGS(ET) 및 PTRACE_SET(FP)REGS(ET)
  • (gdb) x : PTRACE_PEEKTEXT 및 PTRACE_POKETEXt

브레이크포인트는 주어진 메모리 주소의 명령을 다른 특별한 명령으로 치환함으로써 구현된다.브레이크 포인트 명령을 실행하면 SIGTRAP이 발생합니다.

명령어 예시

gdb program 셸에서 "program" 디버깅
run -v 매개 변수를 사용하여 로드된 프로그램 실행
bt 역추적(프로그램이 크래쉬 했을 경우)
info registers 모든 레지스터 덤프
disas $pc-32, $pc+32 분해하다

세션 예시

C 로 기술되어 있는 다음의 소스 코드를 생각해 주세요.

#실패하다 <stdio.h> #실패하다 <stdlib.h> #실패하다 <문자열>h>  size_t foo_len( 컨스턴트  *s ) {   돌아가다 스트렌( s ); }  인트 주된( 인트 argc,  *argv[] ) {   컨스턴트  *a = 특수한 순서;    인쇄물( "a 크기 = %lu\n", foo_len(a) );    퇴장( 0 ); } 

Linux에서 GCC 컴파일러를 사용하여 위의 코드를 컴파일해야 합니다.-g생성된 바이너리에 대한 적절한 디버깅 정보를 포함하기 위해 플래그를 사용합니다. 따라서 GDB를 사용하여 검사할 수 있습니다. 위의 코드를 포함하는 파일이 명명되어 있다고 가정합니다.example.c컴파일 명령어는 다음과 같습니다.

$ gcc example.c - Og - g - o 예시

이제 바이너리를 실행할 수 있습니다.

$ . / 예: 세그멘테이션 장애

예제 코드가 실행되면 분할 결함이 생성되므로 GDB를 사용하여 문제를 검사할 수 있습니다.

$gdb./예: GNU gdb (GDB) Fedora (7.3.50.20110722-13.fc16) Copyright (C) 2011 Free Software Foundation, Inc.라이센스 GPLv3+: GNU GPL 버전3 이후 <https://gnu.org/licenses/gpl.html> 이것은 프리 소프트웨어입니다.변경재배포는 자유입니다.법에 의해 허용된 범위 내에서 보증은 없습니다.  자세한 내용은 "show copying" "show warranty"를 입력합니다.이 GDB는 "x86_64-redhat-linux-gnu"로 구성되었습니다.버그 리포트의 순서에 대해서는, 다음의 URL 참조해 주세요.< https://www.gnu.org/software/gdb/bugs/ > .../path/example...done. (gdb) 시작 프로그램: /path/example 프로그램이 수신 신호 SIGSEGV, 분할 오류.foo_len (s=0x0)의 0x00000000527 (:)c:7 7 리턴 스트렌; (gdb) 인쇄 1달러 = 0x0

이 문제는 회선7에 나타나며 함수를 호출할 때 발생합니다.strlen(왜냐하면,s, 는NULLstrlen의 실장(inline 또는 not)에 따라 출력이 다를 수 있습니다.예를 들어 다음과 같습니다.

GNU gdb (GDB) 7.3.1 Copyright (C) 2011 Free Software Foundation, Inc.라이센스 GPLv3+: GNU GPL 버전3 이후 <https://gnu.org/licenses/gpl.html> 이것은 프리 소프트웨어입니다.변경재배포는 자유입니다.법에 의해 허용된 범위 내에서 보증은 없습니다.  자세한 내용은 "show copying" "show warranty"를 입력합니다.이 GDB는 "i686-pc-linux-gnu"로 구성되었습니다.버그 리포트의 순서에 대해서는, 다음의 URL 참조해 주세요.< https://www.gnu.org/software/gdb/bugs/ > .../tmp/gdb/example에서 상징을 읽는 것....(gdb)프로그램:/tmp/gdb/example 프로그램strlen()에/lib/i686/cmov/libc.so.6(gdb)고에서 신호 SIGSEGV, 세분화를 잘못. 0xb7ee94f3 받은#00xb7ee94f3/lib/i686/cmov/libc.so.6#10x08048435foo_len(s=0x0)에서 example.c에strlen()에:7#20x0804845a 주요(argc=&lt에 탈퇴부터 달린 일입니다.나는iged out > , argv = < optimized out > ) 。c:14

문제를 해결하려면 변수를a(함수 내)main)는 유효한 문자열을 포함해야 합니다.다음은 코드의 고정 버전입니다.

#실패하다 <stdio.h> #실패하다 <stdlib.h> #실패하다 <문자열>h>  size_t foo_len( 컨스턴트  *s ) {   돌아가다 스트렌(s); }  인트 주된( 인트 argc,  *argv[] ) {   컨스턴트  *a = "이것은 테스트 문자열입니다.";    인쇄물( "a 크기 = %lu\n", foo_len(a) );    퇴장( 0 ); } 

이제 GDB 내에서 실행 파일을 다시 컴파일하고 실행하면 올바른 결과를 얻을 수 있습니다.

GDB는 출력 결과를 출력합니다.printf사용자에게 프로그램이 정상적으로 종료되었음을 알립니다.

「 」를 참조해 주세요.

레퍼런스

  1. ^ "GDB 12.1 출시!" , 저자명 문자열: Joel Brobecker, 발행일: 2022년 5월 1일, 취득일: 2022년 5월 2일.
  2. ^ "GDB Documentation - Supported Languages". Retrieved 2011-11-28.
  3. ^ "GDB Documentation - Summary". Retrieved 2011-11-28.
  4. ^ a b "Richard Stallman lecture at the Royal Institute of Technology, Sweden (1986-10-30)". Retrieved 2006-09-21. Then after GNU Emacs was reasonably stable, which took all in all about a year and a half, I started getting back to other parts of the system. I developed a debugger which I called GDB which is a symbolic debugger for C code, which recently entered distribution. Now this debugger is to a large extent in the spirit of DBX, which is a debugger that comes with Berkeley Unix.
  5. ^ "John Gilmore (activist)". hyperleap.com.
  6. ^ "GDB Steering Committee". Retrieved 2008-05-11.
  7. ^ "GDB Documentation - Summary - Contributors". Retrieved 2011-12-01.
  8. ^ "GDB 7.0 Release Notes". Retrieved 2011-11-28.
  9. ^ Joel Brobecker (2014-07-29). "GDB 7.8 released!". Retrieved 2014-07-30.
  10. ^ "Reverse Debugging with GDB". Retrieved 2014-01-20.
  11. ^ "Howto: GDB Remote Serial Protocol: Writing a RSP Server" (PDF).
  12. ^ "Implementing a remote stub".
  13. ^ "Kernel debugging with Dcons".

외부 링크

문서

튜토리얼