GDB 튜토리얼
GDB 시작하기
수색…
비고
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가 무엇을해야할지 모릅니다.