수색…


비고

GDB (GNU 프로젝트 디버거)는 실행중인 프로그램과 코어 된 프로그램을 분석하는 데 유용한 명령 행 기본 디버거입니다. 사용자 매뉴얼 에 따르면 GDB는 C, C ++, D, Go, Objective-C, Fortran, Java, OpenCL C, Pascal, Rust, 어셈블리, Modula-2 및 Ada를 지원합니다.

GDB는 대부분의 디버거와 동일한 기능 세트를 가지고 있지만 GUI 요소를 클릭하는 대신 명령을 입력하는 방식을 기반으로하는 대부분의 디버거와는 다른 점이 있습니다. 이러한 기능 중 일부는 다음과 같습니다.

  • 중단 점 설정
  • 변수 값 인쇄.
  • 변수를 테스트 해보기 위해 값을 설정하는 것.
  • 스택보기

GDB 란 무엇입니까?

GNU Debugger의 약자 인 GDB는 UNIX 시스템에서 C 및 C ++ 프로그램을 디버깅하는 데 가장 많이 사용되는 디버거입니다. GNU 디버거 (gdb라고도 함)는 UNIX 시스템에서 C 및 C ++ 프로그램을 디버깅하는 데 가장 많이 사용되는 디버거입니다.

GNU 디버거는 다음에 대한 정보를 얻는 데 도움을줍니다.

  • 코어 덤프가 발생하면 프로그램이 충돌 한 문장이나 표현은 무엇입니까?

  • 함수를 실행하는 동안 오류가 발생하면
    프로그램에는 해당 함수에 대한 호출이 포함되어 있으며
    매개 변수?

  • 프로그램 실행 중 특정 시점의 프로그램 변수 값은 무엇입니까?

  • 프로그램에서 특정 표현의 결과는 무엇입니까?

GDB 시작하기

GDB를 시작하려면, 터미널에서,

gdb <executable name>

위의 예제에서 main이라는 프로그램을 사용하면 명령이 다음과 같이됩니다.

gdb main

중단 점 설정

프로그램의 상태를 검토 할 수 있도록 프로그램이 어느 시점에서 중단되기를 원할 것입니다. 프로그램이 일시적으로 중단되기 원하는 줄을 중단 점이라고합니다.

break <source code line number>

프로그램 실행하기

프로그램을 실행하기 위해 명령은 예상대로,

run

코어 열기

gdb -c coreFile pathToExecutable  

코어 파일로 작업하기

이 정말 나쁜 프로그램을 만들었습니다.

 #include <stdio.h>
 #include <ctype.h>

// forward declarations


void bad_function()
{

   int *test = 5;

   free(test);

}


int main(int argc, char *argv[])
{
   bad_function();
   return 0;
}


gcc -g ex1.c

./a.out   //or whatever gcc creates
Segmentation fault (core dumped)

gdb -c core a.out

Core was generated by `./a.out'.

프로그램이 SIGSEGV 신호로 종료되었습니다. 세그먼트가 잘못되었습니다. # 0 __GI___libc_free (mem = 0x5) at malloc.c : 2929 2929 malloc.c : 그런 파일이나 디렉토리가 없습니다.

(gdb) where

# 0 __GI___libc_free (mem = 0x5) malloc.c : ex1.c : 19에서 bad_function ()의 2929 # 1 0x0000000000400549 : 2 # 2 0x0000000000400564 (argc = 1, argv = 0x7fffb825bd68) ex1.c : 12에서 0x0000000000400564

-g로 컴파일 한 이후, where 호출은 bad_function ()의 12 행에있는 코드가 마음에 들지 않는다는 것을 알 수 있습니다.

그런 다음 무료로 시도한 테스트 변수를 검토 할 수 있습니다.

(gdb) up

ex1.c의 bad_function ()에서 # 1 0x0000000000400549 : 12 12 무료 (테스트);

(gdb) print test

$ 1 = (int *) 0x5

(gdb) print *test

0x5 주소의 메모리에 액세스 할 수 없습니다.

이 경우에는 버그가 꽤 분명합니다. malloc에 ​​의해 생성되지 않은 주소 5에 할당 된 포인터를 해제하려고 했으므로 free가 무엇을해야할지 모릅니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow