3.2. GDB를 사용하여 애플리케이션 내부 상태 검사
애플리케이션이 제대로 작동하지 않는 이유를 찾으려면 해당 실행을 제어하고 내부 상태를 디버거로 검사합니다. 이 섹션에서는 이 작업에 GNU Debugger(GDB)를 사용하는 방법을 설명합니다.
3.2.1. GNU 디버거(GDB)
Red Hat Enterprise Linux에는 명령줄 사용자 인터페이스를 통해 프로그램 내에서 발생하는 상황을 조사할 수 있는 GNU 디버거(GDB)가 포함되어 있습니다.
GDB 기능
단일 GDB 세션은 다음 유형의 프로그램을 디버깅할 수 있습니다.
- 멀티스레딩 및 forking 프로그램
- 여러 프로그램 한 번에
-
TCP/IP 네트워크 연결을
통해 연결된
원격 시스템 또는 컨테이너의 프로그램
디버깅 요구 사항
실행 가능한 코드를 디버깅하려면 GDB에서 해당 특정 코드에 대한 디버깅 정보가 필요합니다.
- 사용자가 개발한 프로그램의 경우 코드를 빌드하는 동안 디버깅 정보를 생성할 수 있습니다.
- 패키지에서 설치된 시스템 프로그램의 경우 debuginfo 패키지를 설치해야 합니다.
3.2.2. 프로세스에 GDB 연결
프로세스를 검사하려면 GDB를 프로세스에 연결해야 합니다.
사전 요구 사항
GDB로 프로그램 시작
프로그램이 프로세스로 실행되지 않으면 GDB로 시작합니다.
$ gdb program
program 을 파일 이름 또는 프로그램의 경로로 바꿉니다.
GDB는 프로그램의 실행을 시작하도록 설정합니다. run
명령으로 프로세스 실행을 시작하기 전에 중단점 및 the gdb
환경을 설정할 수 있습니다.
이미 실행 중인 프로세스에 GDB 연결
GDB를 프로세스로 이미 실행 중인 프로그램에 연결하려면 다음을 수행합니다.
ps
명령을 사용하여 PID(프로세스ID)를 찾습니다.$ ps -C program -o pid h pid
program 을 파일 이름 또는 프로그램의 경로로 바꿉니다.
이 프로세스에 GDB를 연결합니다.
$ gdb -p pid
ps
출력의 실제 프로세스 ID 번호로 pid 를 바꿉니다.
이미 실행 중인 GDB를 이미 실행 중인 프로세스에 연결
이미 실행 중인 GDB를 이미 실행 중인 프로그램에 연결하려면 다음을 수행합니다.
쉘
GDB 명령을 사용하여ps
명령을 실행하고 프로그램의 프로세스 ID(pid)를 찾습니다.(gdb) shell ps -C program -o pid h pid
program 을 파일 이름 또는 프로그램의 경로로 바꿉니다.
attach
명령을 사용하여 GDB를 프로그램에 연결합니다.(gdb) attach pid
ps
출력 의 실제 프로세스 ID 번호로 바꿉니다.
경우에 따라 GDB가 해당 실행 파일을 찾지 못할 수 있습니다. file
명령을 사용하여 경로를 지정합니다.
(gdb) file path/to/program
추가 리소스
- GDB - 2.1 GDB 호출
- GDB를 사용한 디버깅 - 4.7 Already 실행 프로세스 디버깅
3.2.3. GDB를 이용한 프로그램 코드 단계
GDB 디버거가 프로그램에 연결되면 여러 명령을 사용하여 프로그램의 실행을 제어할 수 있습니다.
사전 요구 사항
필요한 디버깅 정보를 사용할 수 있어야 합니다.
- 프로그램은 디버깅 정보로 컴파일 및 구축되거나
- 관련 debuginfo 패키지가 설치됨
- 디버깅하려면 GDB를 프로그램에 첨부해야 합니다.
코드를 단계별로 GDB 명령
R
(run)-
프로그램 실행을 시작합니다.
run
을 인수와 함께 실행하면 해당 인수가 프로그램이 정상적으로 시작된 것처럼 실행 파일에 전달됩니다. 일반적으로 사용자는 중단점을 설정한 후 이 명령을 실행합니다. start
-
프로그램의 실행을 시작하되, 프로그램의 메인 함수가 시작될 때 중지됩니다.
start
가 인수와 함께 실행되면 해당 인수는 프로그램이 정상적으로 시작된 것처럼 실행 파일에 전달됩니다.
c
(계속)현재 상태에서 프로그램을 계속 실행합니다. 프로그램 실행이 다음 중 하나가 true가 될 때까지 계속됩니다.
- 중단에 도달했습니다.
- 지정된 조건이 충족됩니다.
- 프로그램에 의해 신호가 수신됩니다.
- 오류가 발생합니다.
- 프로그램이 종료됩니다.
N
(next)현재 소스 파일의 다음 코드 줄에 도달할 때까지 현재 상태에서 프로그램을 계속 실행합니다. 프로그램 실행이 다음 중 하나가 true가 될 때까지 계속됩니다.
- 중단에 도달했습니다.
- 지정된 조건이 충족됩니다.
- 프로그램에 의해 신호가 수신됩니다.
- 오류가 발생합니다.
- 프로그램이 종료됩니다.
s
(단계)-
또한
step
명령은 현재 소스 파일의 각 코드 줄에서 실행을 중지합니다. 그러나 함수 호출이 포함된 소스 줄에서 현재 실행이 중지된 경우 GDB는 함수 호출 을 입력한 후 실행을 중지합니다(실행하는 대신). - 위치
까지
- 위치 옵션으로 지정한 코드 위치에 도달할 때까지 실행을 계속합니다.
Fini
(마지막)프로그램 실행을 재개하고 함수가 반환되면 중지됩니다. 프로그램 실행이 다음 중 하나가 true가 될 때까지 계속됩니다.
- 중단에 도달했습니다.
- 지정된 조건이 충족됩니다.
- 프로그램에 의해 신호가 수신됩니다.
- 오류가 발생합니다.
- 프로그램이 종료됩니다.
Q
(quit)- 실행을 종료하고 GDB를 종료합니다.
추가 리소스
- 3.2.5절. “GDB 중단점을 사용하여 정의된 코드 위치에서 실행 중지”
- GDB로 디버깅 - 프로그램 시작
- GDB를 사용한 디버깅 - 연속 및 단계
3.2.4. 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
를 사용하면 프로그램 실행의 다음 단계에서 내부 상태에 대한 변경이 어떻게 되는지 이해하는 데 도움이 됩니다.
추가 리소스
- GDB Python API - Red Hat Developers 블로그 항목
- GDB로 디버깅 - Pretty Printing
3.2.5. GDB 중단점을 사용하여 정의된 코드 위치에서 실행 중지
대개는 작은 코드 부분만 조사됩니다. 중단점은 GDB가 코드의 특정 위치에서 프로그램의 실행을 중지하도록 지시하는 마커입니다. 중단점은 소스 코드 행과 가장 일반적으로 연관됩니다. 이 경우 중단자를 배치하려면 소스 파일 및 행 번호를 지정해야 합니다.
중단을 배치하려면:
소스 코드 파일의 이름과 해당 파일의 행을 지정합니다.
(gdb) br file:line
파일이 없으면 현재 실행 지점에서 소스 파일의 이름이 사용됩니다.
(gdb) br line
또는 함수 이름을 사용하여 시작에 중단점을 둡니다.
(gdb) br function_name
작업에 대해 일정 횟수가 반복된 후 프로그램이 오류가 발생할 수 있습니다. 실행을 중단할 추가 조건을 지정하려면 다음을 수행합니다.
(gdb) br file:line if condition
C 또는 C++ 언어의 조건으로 조건을 바꿉니다. 파일과 행 의 의미는 위와 동일합니다.
모든 중단점 및 감시점의 상태를 검사 하려면 다음을 수행합니다.
(gdb) info br
정보 br
의 출력에 표시된 번호를 사용하여 중단점을 제거하려면 다음을 수행합니다.(gdb) delete number
지정된 위치에서 중단 항목을 제거하려면 다음을 수행합니다.
(gdb) clear file:line
추가 리소스
- GDB로 디버깅 - Breakpoints, Watchpoints, Catchpoints
3.2.6. GDB 감시 포인트를 사용하여 데이터 액세스 및 변경 시 실행을 중지합니다
대부분의 경우 특정 데이터가 변경되거나 액세스될 때까지 프로그램을 실행하도록 하는 것이 유리합니다. 다음 예제는 가장 일반적인 사용 사례입니다.
사전 요구 사항
- GDB이해
GDB에서 워치포인트 사용
Watchpoints는 GDB 가 프로그램의 실행을 중지하도록 지시하는 마커입니다. Watchpoints는 데이터와 연결되어 있습니다. 감시 지점을 배치하려면 변수, 여러 변수 또는 메모리 주소를 설명하는 식을 지정해야 합니다.
데이터 변경에 대한 감시 지점을 배치 하려면 다음을 실행합니다 (쓰기).
(gdb) watch expression
보고자 하는 내용을 설명하는 표현식 으로 표현식을 바꿉니다. 변수의 경우 표현식 은 변수 이름과 동일합니다.
데이터 액세스를 위한 감시 지점을 배치 하려면(읽기:).
(gdb) rwatch expression
데이터 액세스(읽기 및 쓰기) 에 대한 감시 지점을 배치 하려면 다음을 수행하십시오.
(gdb) awatch expression
모든 감시점 및 중단점의 상태를 검사 하려면 다음을 수행합니다.
(gdb) info br
감시 지점을 제거하려면 다음을 수행합니다.
(gdb) delete num
num 옵션을
info br
명령으로 보고된 번호로 바꿉니다.
추가 리소스
- 디버깅 with GDB - Watchpoints 설정
3.2.7. 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
andgid
번호를 사용하여 현재 스레드를 나타내는 스레드 목록을 표시합니다. 스레드 ID
-
지정된
id
를 현재 스레드로 사용하여 스레드를 설정합니다. thread apply ids 명령
-
id로 나열된 모든 스레드에
명령 명령을
적용합니다.ids
옵션은 공백으로 구분된 스레드 ID 목록입니다. 특수 값all
이 모든 스레드에 명령을 적용합니다. 조건인 경우 위치 스레드 ID 중단
-
스레드 번호
ID
에 대해서만 특정조건이
있는 특정위치에서
중단점을 설정합니다. 조사 표현식 스레드 ID
-
스레드 번호
ID
에 대해서만식에
의해 정의된 감시 지점을 설정합니다. 명령&
-
명령
명령을
실행하고 gdb 프롬프트(gdb)
로 즉시 돌아가 백그라운드에서 코드 실행을 계속합니다. interrupt
- 백그라운드에서 실행을 중지합니다.
추가 리소스
- GDB를 사용한 디버깅 - 여러 스레드로 4.10 디버깅 프로그램
- GDB를 사용한 디버깅 - 4.11 Forks 디버깅