A debugger plays a vital role in any software development system. Nobody can write a bug-free code all at once. During the course of development, bugs are being raised and needs to be solved for further enhancement. A development system is incomplete without a debugger. Considering the open source developers community, GNU Debugger is their best choice. It is also used for commercial software development on UNIX type platforms.

GNU 디버거, 또한 gdb로 알려져 있으며, 코드가 실행되는 동안 또는 프로그램이 충돌하기 전에 무슨 일을 하려고 하는지 확인할 수 있게 해줍니다. GDB는 기본적으로 소스 코드에서 결함을 잡기 위해 네 가지 주요 작업을 수행할 수 있습니다.
- 일반 동작에 영향을 줄 수 있는 인수를 지정하여 프로그램 시작.
- 지정된 조건에서 프로그램을 중지.
- 크래시 또는 프로그램이 중지된 상태를 조사.
- 코드를 변경하고 수정된 코드로 실험하는 것.
우리는 노력을 많이 들이지 않고 C와 C++로 작성된 프로그램을 디버깅하기 위해 gdb를 사용할 수 있습니다. 현재 D, Modula-2, Fortran 같은 다른 프로그래밍 언어 지원은 부분적입니다.
GNU 디버거 또는 GDB를 시작하는 방법
GDB를 실행하려면 gdb 명령어를 사용합니다. gdb를 입력하면 플랫폼에 대한 정보가 표시되고 아래에 (gdb) 프롬프트로 이동됩니다. 아래에 표시된 것과 같이.
[root@fedora20 ~]# gdb
샘플 출력
GNU gdb (GDB) Fedora 7.6.50.20130731-19.fc20 Copyright (C) 2013 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "x86_64-redhat-linux-gnu". Type "show configuration" for configuration details. For bug reporting instructions, please see: <http://www.gnu.org/software/gdb/bugs/>. Find the GDB manual and other documentation resources online at: <http://www.gnu.org/software/gdb/documentation/>. For help, type "help". Type "apropos word" to search for commands related to "word". (gdb)
help 목록을 입력하여 gdb 내에서 사용 가능한 다른 명령어 클래스를 확인합니다. 클래스 이름 뒤에 help 를 입력하여 해당 클래스의 명령어 목록을 확인합니다. 모든 명령어의 목록은 help all을 입력합니다. 명령어 이름은 모호하지 않으면 줄임말을 사용할 수 있습니다. 예를 들어, n을 입력하여 next 또는 c 대신 continue을 입력할 수 있습니다.
가장 일반적으로 사용되는 GDB 명령어
일반적으로 사용되는 gdb 명령어는 다음 표에 나열되어 있습니다. 이러한 명령어들은 gdb 명령 프롬프트(gdb)에서 사용해야 합니다.
Command
|
Description
|
run
|
Start a program execution
|
quit
|
Quit gdb
|
print expr
|
Print expression where expr may be a variable name too
|
next
|
Go to next line
|
step
|
Step into next line
|
continue
|
Continue from the current line till the end of program or next break point
|
두 개의 명령어 step과 next 사이의 차이에 주의하십시오. next 명령은 다음 줄이 함수 호출인 경우 함수 내부로 이동하지 않습니다. 반면 step 명령은 함수 내부로 들어가서 거기에서 무슨 일이 일어나는지 볼 수 있습니다.
A sample session with GDB
다음 소스 코드를 고려해 보겠습니다.
// sum.c #include <stdio.h> int sum (int a, int b) { int c; c = a + b; return c; } int main() { int x, y, z; printf("\nEnter the first number: "); scanf("%d", &x); printf("Enter the second number: "); scanf("%d", &y); z = sum (x, y); printf("The sum is %d\n\n", z); return 0; }
출력 파일을 디버깅하기 위해 동일한 -g 옵션을 사용하여 gcc로 컴파일해야 합니다.
$ gcc -g sum.c -o sum
출력 파일 sum은 다음 두 가지 방법 중 하나로 gdb에 첨부할 수 있습니다:
1. 출력 파일을 gdb에 인수로 지정하는 방법.
$ gdb sum
2. file 명령을 사용하여 gdb 내에서 출력 파일을 실행하는 방법.
$ gdb (gdb) file sum
list 명령은 소스 코드 파일의 줄을 나열하고 포인터를 이동시킵니다. 따라서 먼저 list 는 처음 10줄을 표시하고 다음 list는 다음 10줄을 표시합니다. 그리고 계속 반복됩니다.
(gdb) list 1 #include <stdio.h> 2 3 int sum (int a, int b) { 4 int c; 5 c = a + b; 6 return c; 7 } 8 9 int main() { 10 int x, y, z;
실행을 시작하려면 run 명령을 입력하십시오. 이제 프로그램이 정상적으로 실행됩니다. 그러나 디버깅을 위해 소스 코드에 중단점을 설정하는 것을 잊었습니다, 맞나요? 이러한 중단점은 함수 또는 지정된 줄에 지정할 수 있습니다.
(gdb) b main
참고: 저는 b를 break의 약어로 사용했습니다.
main 함수에 중단점을 설정한 후 프로그램을 다시 실행하면 라인 11에서 멈춥니다. 같은 효과를 내기 위해서는 라인 번호를 미리 알고 있어야 합니다.
(gdb) b sum.c:11
이제 next 또는 n 명령을 사용하여 코드 줄을 하나씩 실행해 보세요. next 명령은 함수 코드 내부로 진입하지 않습니다. 함수에 중단점을 설정해야만 가능합니다. 이제 print 명령을 실행해 보겠습니다. 아래와 같이 함수 sum에 중단점을 설정하세요.
(gdb) b sum Breakpoint 1 at 0x4005aa: file sum.c, line 5. (gdb) r Starting program: /root/sum Enter the first number: 2 Enter the second number: 3 Breakpoint 1, sum (a=2, b=3) at sum.c:5 5 c = a + b; (gdb) p a $1 = 2 (gdb) p b $2 = 3 (gdb) c Continuing. The sum is 5 [Inferior 1 (process 3444) exited normally]
프로그램을 실행하는 데 커맨드 라인 매개변수가 필요한 경우, run 명령과 함께 해당 매개변수를 제공하세요.
(gdb) run . . .
현재 실행 중인 프로그램의 공유 라이브러리 파일을 나열할 수 있습니다.
(gdb) info share From To Syms Read Shared Object Library 0x00000035a6000b10 0x00000035a6019c70 Yes /lib64/ld-linux-x86-64.so.2 0x00000035a641f560 0x00000035a6560bb4 Yes /lib64/libc.so.6
변수 수정
GDB는 프로그램 실행 중에 변수를 수정할 수도 있습니다. 이를 시도해 보겠습니다. 위에서 언급한 대로 라인 16에 중단점을 설정하고 프로그램을 실행하세요.
(gdb) r Starting program: /root/sum Enter the first number: 1 Enter the second number: 2 Breakpoint 1, main ( ) at sum.c:16 16 printf("The sum is %d\n\n", z); (gdb) set z=4 (gdb) c Continuing. The sum is 4
이제 a = 1, b = 2 이고 결과는 z = 3이어야 합니다. 그러나 여기서 우리는 main 함수에서 최종 결과를 z = 4로 변경했습니다. 이렇게 하면 gdb를 사용하여 디버깅을 보다 쉽게 할 수 있습니다.
중단점 활성화/비활성화
모든 중단점 목록을 얻으려면 info breakpoints를 입력하세요.
(gdb) info breakpoints Num Type Disp Enb Address What 1 breakpoint keep y 0x00000000004005c2 in main at sum.c:11
여기에는 하나의 중단점만 있으며 활성화 또는 비활성화하려면 중단점 번호와 함께 disable 명령을 사용하세요. 나중에 다시 활성화하려면 enable 명령을 사용하세요.
(gdb) disable 1 (gdb) info breakpoints Num Type Disp Enb Address What 1 breakpoint keep n 0x00000000004005c2 in main at sum.c:11
당신은 delete 명령어로 중단점도 삭제할 수 있습니다.
실행 중인 프로세스 디버깅
GNU/Linux 시스템에서는 여러 프로세스가 백그라운드에서 실행됩니다. 실행 중인 프로세스를 디버깅하려면 먼저 해당 프로세스의 프로세스 ID를 찾아야 합니다. pidof 명령어를 사용하여 프로세스의 pid를 얻을 수 있습니다.
$ pidof <process_name>
이제 이 pid를 gdb에 연결해야 합니다. 두 가지 방법이 있습니다.
1. gdb와 함께 pid를 지정하는 방법.
$ gdb -p <pid>
2. gdb의 attach 명령어를 사용하는 방법.
(gdb) attach <pid>
이상입니다. 이는 디버깅 소스 코드의 기초에 불과하며, 여기서 설명한 것보다 훨씬 많은 기능을 제공합니다. 예를 들어 스택 정보, 환경 변수 등을 사용하여 디버깅할 수 있습니다. 이러한 기능들을 사용해 보세요…
Source:
https://www.tecmint.com/debug-source-code-in-linux-using-gdb/