20.2. GDB를 사용하여 애플리케이션의 내부 상태 검사
애플리케이션이 제대로 작동하지 않는 이유를 찾으려면 해당 실행을 제어하고 내부 상태를 디버거로 검사합니다. 이 섹션에서는 이 작업에 GNU Debugger(GDB)를 사용하는 방법을 설명합니다.
20.2.1. GNU Debugger(GDB)
디버거는 코드 실행 및 코드 상태의 검사를 제어할 수 있는 도구입니다. 이 기능은 프로그램에서 발생하는 상황과 이유를 조사하는 데 사용됩니다.
Red Hat Enterprise Linux에는 명령줄 사용자 인터페이스를 통해 이 기능을 제공하는 GNU 디버거(GDB)가 포함되어 있습니다.
GDB에 대한 그래픽 프런트 엔드의 경우 Eclipse 통합 개발 환경을 설치합니다. Eclipse 사용을 참조하십시오.
GDB 기능
단일 GDB 세션이 디버그할 수 있습니다.
- 다중 스레드 및 프로그램 예약
- 한 번에 여러 프로그램
-
원격 시스템 또는
gdbserver
유틸리티가 있는 컨테이너의 프로그램들이 TCP/IP 네트워크 연결을 통해 연결됨
디버깅 요구 사항
실행 코드를 디버깅하려면 GDB는 해당 디버깅 정보를 필요로 합니다.
- 사용자가 개발한 프로그램의 경우 코드를 빌드하는 동안 디버깅 정보를 생성할 수 있습니다.
- 패키지에서 설치한 시스템 프로그램의 경우 해당 debuginfo 패키지를 설치해야 합니다.
20.2.2. GDB를 프로세스에 연결
프로세스를 검사하려면 GDB를 프로세스에 연결해야 합니다.
사전 요구 사항
GDB로 프로그램 시작
프로그램이 프로세스로 실행되지 않으면 GDB로 시작합니다.
$ gdb program
program 을 파일 이름 또는 프로그램의 경로로 바꿉니다.
GDB는 프로그램의 실행을 시작합니다. run
명령으로 프로세스 실행을 시작하기 전에 중단점 및 the gdb
환경을 설정할 수 있습니다.
GDB를 Already Running Process에 연결
GDB를 프로세스로 이미 실행 중인 프로그램에 연결하려면 다음을 수행합니다.
ps
명령을 사용하여 프로세스 ID(pid )를 찾습니다.$ ps -C program -o pid h pid
program 을 파일 이름 또는 프로그램의 경로로 바꿉니다.
이 프로세스에 GDB를 연결합니다.
$ gdb program -p pid
프로그램을 프로그램의 파일 이름 또는 경로로 교체하고 pid 를
ps
출력의 실제 프로세스 ID 번호로 바꿉니다.
Already running GDB를 Already Running Process에 연결
이미 실행 중인 GDB를 이미 실행 중인 프로그램에 연결하려면 다음을 수행합니다.
GDB
명령을
사용하여ps
명령을 실행하고 프로그램의 프로세스 ID(pid)를 찾습니다.(gdb) shell ps -C program -o pid h pid
program 을 파일 이름 또는 프로그램의 경로로 바꿉니다.
attach
명령을 사용하여 GDB를 프로그램에 연결합니다.(gdb) attach pid
ps
출력의 실제 프로세스 ID 번호로 pid 를 교체합니다.
경우에 따라 GDB가 해당 실행 파일을 찾지 못할 수 있습니다. file
명령을 사용하여 경로를 지정합니다.
(gdb) file path/to/program
추가 리소스
- GDB - 2.1 GDB 호출
- GDB를 사용한 디버깅 - 4.7 Already 실행 프로세스 디버깅
20.2.3. GDB를 사용하여 프로그램 코드를 단계별로 실행
GDB 디버거가 프로그램에 연결되면 여러 명령을 사용하여 프로그램의 실행을 제어할 수 있습니다.
사전 요구 사항
- GDB는 시스템에 설치해야 합니다
필요한 디버깅 정보를 사용할 수 있어야 합니다.
- 프로그램은 디버깅 정보로 컴파일 및 구축되거나
- 관련 debuginfo 패키지가 설치됨
- GDB는 디버그할 프로그램에 연결되어 있습니다.
GDB 명령어를 사용하여 코드 전달
R
(run)-
프로그램 실행을 시작합니다.
실행이
인수와 함께 실행되면 해당 인수는 프로그램이 정상적으로 시작된 것처럼 실행 파일에 전달됩니다. 일반적으로 사용자는 중단점을 설정한 후 이 명령을 실행합니다. start
-
프로그램의 실행을 시작하고 기본 함수의 시작 부분에서 중지합니다.
start
를 인수로 실행하면 프로그램이 정상적으로 시작된 것처럼 해당 인수가 실행 파일에 전달됩니다.
c
(계속)현재 상태에서 프로그램을 계속 실행합니다. 프로그램 실행이 다음 중 하나가 true가 될 때까지 계속됩니다.
- Breakpoint에 도달합니다.
- 지정된 조건이 충족됨
- 프로그램에 의해 수신된 신호
- 오류가 발생했습니다.
- 프로그램이 종료
N
(next)이 명령의 일반적으로 알려진 또 다른 이름은
step
입니다. 현재 소스 파일의 다음 코드 줄에 도달할 때까지 현재 상태에서 프로그램을 계속 실행합니다. 프로그램 실행이 다음 중 하나가 true가 될 때까지 계속됩니다.- Breakpoint에 도달합니다.
- 지정된 조건이 충족됨
- 프로그램에 의해 수신된 신호
- 오류가 발생했습니다.
- 프로그램이 종료
s
(단계)-
이 명령의 다른 일반적으로 알려진 이름은
다음과
같습니다.step
명령은 현재 소스 파일에서 코드의 각 순차적 줄에서 실행을 중지합니다. 그러나 현재 함수 호출이 포함된 소스 라인에서 실행이 중지된 경우 GDB는 함수 호출 을 입력한 후(실행하지 않고) 실행을 중지합니다. - 위치
까지
- 위치 옵션으로 지정한 코드 위치에 도달할 때까지 실행을 계속합니다.
Fini
(마지막)프로그램 실행을 다시 시작하고 실행이 함수에서 반환될 때 중지됩니다. 프로그램 실행이 다음 중 하나가 true가 될 때까지 계속됩니다.
- Breakpoint에 도달합니다.
- 지정된 조건이 충족됨
- 프로그램에 의해 수신된 신호
- 오류가 발생했습니다.
- 프로그램이 종료
Q
(quit)- 실행을 종료하고 GDB를 종료합니다.
추가 리소스
- 20.2.5절. “GDB 차단기를 사용하여 정의된 코드 위치 실행 중지”
- GDB로 디버깅 - 4.2 프로그램 시작
- GDB를 사용한 디버깅 - 5.2 연속 및 단계
20.2.4. GDB를 사용하여 프로그램 내부 값 표시
프로그램의 내부 변수의 값을 표시하는 것은 프로그램이 무엇을 하는지 이해하는 데 중요합니다. GDB는 내부 변수를 검사하는 데 사용할 수 있는 여러 명령을 제공합니다. 이 섹션에서는 이러한 명령을 가장 유용하게 설명합니다.
사전 요구 사항
- GDB 디버거에 대한 이해
GDB 명령 프로그램의 내부 상태를 표시
p
(인쇄)지정된 인수의 값을 표시합니다. 일반적으로 인수는 간단한 단일 값에서 구조까지 복잡한 변수의 이름입니다. 인수는 프로그램 변수 및 라이브러리 함수 또는 테스트 중인 프로그램에 정의된 함수 사용을 포함하여 현재 언어로 유효한 표현식일 수도 있습니다.
출력 명령을 사용하여 데이터 구조(예: 클래스, groups)의 사용자 지정 표시를 위해 GDB를 Python 또는 Guile 스크립트로 확장할
수
있습니다.BT(
backtrace)현재 실행 지점에 도달하는 데 사용되는 함수 호출 체인 또는 실행이 전송될 때까지 사용되는 함수의 함수 체인을 표시합니다. 이는 제거 원인과 같은 심각한 버그(예: 분할 오류)를 조사하는 데 유용합니다.
backtrace
명령에전체
옵션을 추가하면 로컬 변수도 표시됩니다.bt
및info 프레임 명령을 사용하여 표시된 데이터의 사용자 지정 디스플레이에 대해 프레임 필터 Python 스크립트를 사용하여 GDB를 확장할 수 있습니다
. 프레임 이라는 용어는 단일 함수 호출과 연관된 데이터를 나타냅니다.info
info
명령은 다양한 항목에 대한 정보를 제공하는 일반적인 명령입니다. 항목을 지정하는 옵션이 필요합니다.-
info args
명령은 현재 선택된 프레임인 함수 호출의 인수를 표시합니다. -
info locals
명령은 현재 선택된 프레임에 로컬 변수를 표시합니다.
가능한 항목 목록은 GDB 세션에서 명령
도움말 정보를
실행하십시오.(gdb) help info
-
l
(list)-
프로그램이 중지된 소스 코드에서 행을 표시합니다. 이 명령은 프로그램 실행이 중지된 경우에만 사용할 수 있습니다. 내부 상태를 표시하는 명령은 엄격하게 아니지만
list
는 사용자가 프로그램 실행의 다음 단계에서 내부 상태에 대한 변경 사항을 이해하는 데 도움이 됩니다.
추가 리소스
- Red Hat Developer 블로그 항목 - GDB Python API
- GDB를 사용한 디버깅 - 10.9 Pretty Printing
20.2.5. GDB 차단기를 사용하여 정의된 코드 위치 실행 중지
많은 경우 특정 줄의 코드에 도달할 때까지 프로그램을 실행하도록 하는 것이 좋습니다.
사전 요구 사항
- GDB 이해
GDB에서 구분점 사용
Breakpoints는 GDB에 프로그램의 실행을 중지하도록 지시하는 마커입니다. points는 소스 코드 줄과 가장 일반적으로 연관되어 있습니다. point를 배치하려면 소스 파일 및 행 번호를 지정해야 합니다.
중단을 배치하려면:
소스 코드 파일의 이름과 해당 파일의 행을 지정합니다.
(gdb) br file:line
파일이 없으면 현재 실행 지점에 있는 소스 파일의 이름이 사용됩니다.
(gdb) br line
또는 함수 이름을 사용하여 Breakpoint를 배치합니다.
(gdb) br function_name
작업에 대해 일정 횟수가 반복된 후 프로그램이 오류가 발생할 수 있습니다. 실행을 중단할 추가 조건을 지정하려면 다음을 수행합니다.
(gdb) br file:line if condition
C 또는 C++ 언어의 조건으로 조건을 바꿉니다. 파일과 행 의 의미는 위와 동일합니다.
모든 중단점 및 감시점의 상태를 검사 하려면 다음을 수행합니다.
(gdb) info br
정보 br
의 출력에 표시된 번호를 사용하여 중단점을 제거하려면 다음을 수행합니다.(gdb) delete number
지정된 위치에서 중단 항목을 제거하려면 다음을 수행합니다.
(gdb) clear file:line
20.2.6. GDB Watchpoints를 사용하여 데이터 액세스 및 변경 사항 실행 중지
대부분의 경우 특정 데이터가 변경되거나 액세스될 때까지 프로그램을 실행하도록 하는 것이 유리합니다. 이 섹션에는 가장 일반적인 시계가 나열되어 있습니다.
사전 요구 사항
- GDB이해
GDB에서 Watchpoint 사용
Watchpoints는 GDB 가 프로그램의 실행을 중지하도록 지시하는 마커입니다. Watchpoints는 데이터와 관련이 있습니다. 감시 포인트를 배치하려면 변수, 여러 변수 또는 메모리 주소를 설명하는 표현식을 지정해야 합니다.
데이터 변경에 대한 감시 지점을 배치 하려면 다음을 실행합니다 (쓰기).
(gdb) watch expression
보고자 하는 내용을 설명하는 표현식 으로 표현식을 바꿉니다. 변수의 경우 표현식 은 변수 이름과 동일합니다.
데이터 액세스를 위한 감시 지점을 배치 하려면(읽기:).
(gdb) rwatch expression
데이터 액세스(읽기 및 쓰기) 에 대한 감시 지점을 배치 하려면 다음을 수행하십시오.
(gdb) awatch expression
모든 감시점 및 중단점의 상태를 검사 하려면 다음을 수행합니다.
(gdb) info br
감시 지점을 제거하려면 다음을 수행합니다.
(gdb) delete num
num 옵션을
info br
명령으로 보고된 번호로 바꿉니다.
20.2.7. GDB를 사용하여 Forking 또는 Threaded programs 디버깅
일부 프로그램은 포크 또는 스레드를 사용하여 병렬 코드 실행을 수행합니다. 여러 동시 실행 경로를 디버깅하려면 특별한 고려 사항이 필요합니다.
사전 요구 사항
- GDB 디버거에 대한 이해
- 프로세스의 개념 및 스레드 이해
GDB를 사용하여 포크된 프로그램 디버깅
포크는 프로그램(상위)이 자체(자체)의 독립적인 사본을 만들 때 발생하는것입니다. 다음 설정 및 명령을 사용하여 GDB의 발생 포크에 영향을 미칩니다.
follow-fork-mode
설정은 GDB가 포크 뒤의 상위 또는 하위 항목을 따르는지 여부를 제어합니다.follow-fork-mode 상위 설정
- 중지한 후 상위 프로세스를 디버깅합니다. 이는 기본값입니다.
follow-fork-mode 하위 설정
- 중지한 후 하위 프로세스를 디버깅합니다.
show follow-fork-mode
-
follow-fork-mode
의 현재 설정을 표시합니다.
설정된 detach-on-fork
설정은 GDB가 다른(후로) 프로세스를 계속 제어하거나 실행되도록 유지할지 여부를 제어합니다.detach-on-fork on 설정
-
따르지 않는 프로세스(
follow-fork-mode
값에 따라 다름)는 분리되고 독립적으로 실행됩니다. 이는 기본값입니다. detach-on-fork off 설정
-
GDB는 두 프로세스를 모두 제어합니다. 뒤에 오는 프로세스(
follow-fork-mode
값에 따라)는 정상적으로 디버그되지만 다른 프로세스는 일시 중지됩니다. show detach-on-fork
-
detach-on-fork
의 현재 설정을 표시합니다.
GDB를 사용하여 스레드 프로그램 디버깅
GDB는 개별 스레드를 디버그하고 독립적으로 조작 및 검사할 수 있습니다. GDB가 검사된 스레드만 중지하도록 하려면 명령 집합을 사용하지 않고 에서
target-async를 설정합니다.
이러한 명령을 .gdbinit
파일에 추가할 수 있습니다. 해당 기능이 켜진 후 GDB는 스레드 디버깅을 수행할 준비가 되었습니다.
GDB는 현재 스레드 의 개념을 사용합니다. 기본적으로 명령은 현재 스레드에만 적용됩니다.
정보 스레드
-
id
및gid
숫자가 있는 스레드 목록을 표시하고 현재 스레드를 나타냅니다. 스레드 ID
-
지정된 id를 현재 스레드로 사용하여 스레드를 설정합니다.Sets the thread with the specified
id
as the current thread. thread apply ids 명령
-
ids
가 나열된 모든 스레드에command
명령을 적용합니다.ids
옵션은 공백으로 구분된 스레드 ID 목록입니다. 특수 값all
은 모든 스레드에 명령을 적용합니다. 조건인 경우 위치 스레드 ID 중단
-
스레드 번호
id
에 대해서만 특정조건이
있는 특정위치에
정지됨을 설정합니다. 조사 표현식 스레드 ID
-
스레드 번호
ID
에 대해서만표현식
으로 정의된 감시 지점을 설정합니다. 명령&
-
명령
명령을
실행하고 GDB 프롬프트(gdb)
로 즉시 돌아가 백그라운드에서 코드 실행을 계속합니다. interrupt
- 백그라운드에서 실행을 중지합니다.
추가 리소스
- GDB를 사용한 디버깅 - 여러 스레드로 4.10 디버깅 프로그램
- GDB를 사용한 디버깅 - 4.11 Forks 디버깅