3.2. GDB를 사용하여 애플리케이션 내부 상태 검사
애플리케이션이 제대로 작동하지 않는 이유를 찾으려면 디버거를 사용하여 실행을 제어하고 내부 상태를 검사합니다. 이 섹션에서는 이 작업에 GNU Debugger(GDB)를 사용하는 방법에 대해 설명합니다.
3.2.1. GNU 디버거(GDB) 링크 복사링크가 클립보드에 복사되었습니다!
Red Hat Enterprise Linux에는 명령줄 사용자 인터페이스를 통해 프로그램 내에서 발생하는 상황을 조사할 수 있는 GNU 디버거(GDB)가 포함되어 있습니다.
GDB로 그래픽 프런트 엔드를 사용하려면 Eclipse 통합 개발 환경을 설치합니다. Eclipse 사용을 참조하십시오.
- GDB 기능
단일 GDB 세션은 다음 유형의 프로그램을 디버깅할 수 있습니다.
- 다중 스레드 및 포크 프로그램
- 한 번에 여러 프로그램
-
TCP/IP 네트워크 연결을 통해 연결된
gdbserver유틸리티가 있는 원격 머신 또는 컨테이너의 프로그램
- 디버깅 요구 사항
실행 가능한 코드를 디버깅하려면 GDB에 해당 특정 코드에 대한 디버깅 정보가 필요합니다.
- 사용자가 개발한 프로그램의 경우 코드를 빌드하는 동안 디버깅 정보를 생성할 수 있습니다.
- 패키지에서 설치된 시스템 프로그램의 경우 debuginfo 패키지를 설치해야 합니다.
3.2.2. 프로세스에 GDB 연결 링크 복사링크가 클립보드에 복사되었습니다!
프로세스를 검사하려면 GDB를 프로세스에 연결해야 합니다.
사전 요구 사항
프로세스
GDB로 프로그램을 시작합니다.
GDB를 사용하여 프로그램을 실행합니다.
$ gdb program프로그램을 프로그램 파일 이름 또는 경로로 바꿉니다.
GDB는 프로그램 실행을 시작하도록 설정합니다.
run명령으로 프로세스 실행을 시작하기 전에 Cryostat 및gdb환경을 설정할 수 있습니다.- 이미 실행 중인 프로세스에 GDB를 연결합니다.
ps명령을 사용하여 프로세스 ID(pid)를 찾습니다.$ ps -C program -o pid hpid프로그램을 프로그램 파일 이름 또는 경로로 바꿉니다.
GDB를 이 프로세스에 연결합니다.
$ gdb -p pidpid 를
ps출력의 실제 프로세스 ID 번호로 바꿉니다.
실행 중인 프로그램에 활성 GDB 세션을 연결합니다.
shellGDB 명령을 사용하여ps명령을 실행하고 프로그램의 프로세스 ID(pid)를 찾습니다.(gdb) shell ps -C program -o pid hpid프로그램을 프로그램 파일 이름 또는 경로로 바꿉니다.
attach명령을 사용하여 GDB를 프로그램에 연결합니다.(gdb) attach pidpid 를
ps출력의 실제 프로세스 ID 번호로 바꿉니다.참고경우에 따라 GDB가 해당 실행 파일을 찾지 못할 수 있습니다.
file명령을 사용하여 경로를 지정합니다.(gdb) file path/to/program
3.2.3. GDB를 사용하여 프로그램 코드를 단계별로 처리 링크 복사링크가 클립보드에 복사되었습니다!
GDB 디버거가 프로그램에 연결되면 여러 명령을 사용하여 프로그램 실행을 제어할 수 있습니다. 이러한 명령을 사용하면 디버깅 세션 중에 코드를 단계적으로 처리하고, Cryostat를 설정하고, 프로그램 흐름을 제어할 수 있습니다.
이러한 GDB 명령을 효과적으로 사용하려면 이러한 방법을 통해 디버깅 정보를 사용할 수 있어야 합니다. * 프로그램은 디버깅 정보를 사용하여 컴파일되고 빌드됩니다. * 관련 debuginfo 패키지가 설치됩니다.
GDB는 프로그램 실행을 단계별로 처리하고 제어하기 위한 명령 세트를 제공합니다.
R (run): 프로그램 실행을 시작합니다. 임의의 인수와 함께 run 을 실행하면 해당 인수가 프로그램이 정상적으로 시작된 것처럼 실행 파일에 전달됩니다. 사용자는 일반적으로 Cryostat를 설정한 후 이 명령을 실행합니다.
start: 프로그램의 실행을 시작하지만 프로그램의 주요 기능의 시작 부분에서 중지합니다. start 가 임의의 인수로 실행되면 프로그램이 정상적으로 시작된 것처럼 해당 인수가 실행 파일에 전달됩니다.
c (continue): 현재 상태에서 프로그램을 계속 실행합니다. 프로그램 실행은 다음 중 하나가 사실이 될 때까지 계속됩니다: * 구현에 도달합니다. * 지정된 조건이 충족됩니다. * 프로그램이 신호를 수신합니다. * 오류가 발생합니다. * 프로그램이 종료됩니다.
N (다음): 현재 소스 파일의 다음 코드에 도달할 때까지 현재 상태에서 프로그램을 계속 실행합니다. 프로그램 실행은 다음 중 하나가 사실이 될 때까지 계속됩니다: * 구현에 도달합니다. * 지정된 조건이 충족됩니다. * 프로그램이 신호를 수신합니다. * 오류가 발생합니다. * 프로그램이 종료됩니다.
s (단계): 단계 명령은 현재 소스 파일의 각 연속 코드 줄에서도 실행을 중지합니다. 그러나 함수 호출을 포함하는 소스 행에서 실행이 현재 중지된 경우 GDB는 함수 호출 을 입력한 후 실행을 중지합니다(실행하지 않는 경우).
위치 까지: 위치 옵션에 의해 지정된 코드 위치에 도달 할 때까지 계속 실행됩니다.
fini (finish): 프로그램의 실행을 다시 시작하고 함수에서 실행이 반환될 때 중지됩니다. 프로그램 실행은 다음 중 하나가 사실이 될 때까지 계속됩니다: * 구현에 도달합니다. * 지정된 조건이 충족됩니다. * 프로그램이 신호를 수신합니다. * 오류가 발생합니다. * 프로그램이 종료됩니다.
Q (quit): 실행을 종료하고 GDB를 종료합니다.
3.2.4. GDB를 사용하여 프로그램 내부 값 표시 링크 복사링크가 클립보드에 복사되었습니다!
프로그램의 내부 변수의 값을 표시하는 것은 프로그램이 무엇을 하는지 이해하는 데 중요합니다. GDB는 내부 변수를 검사하는 데 사용할 수 있는 여러 명령을 제공합니다. 다음은 이러한 명령 중 가장 유용합니다.
- P(인쇄)
지정된 인수의 값을 표시합니다. 일반적으로 인수는 단순한 단일 값부터 구조까지 모든 복잡성의 변수 이름입니다. 인수는 프로그램 변수 및 라이브러리 함수의 사용을 포함하여 현재 언어에서 유효하거나 테스트 중인 프로그램에 정의된 함수일 수도 있습니다.
인쇄 명령을 사용하여 데이터 구조(예: 클래스, 구조)를 사용자 지정하기 위해 매우적합한 Python 또는 Guile 스크립트로 GDB를 확장할 수 있습니다.BT(backtrace)현재 실행 지점에 도달하는 데 사용되는 함수 호출 체인 또는 실행이 종료될 때까지 사용되는 함수 체인을 표시합니다. 이는 악성 원인을 사용하여 심각한 버그(예: 분할 오류)를 조사하는 데 유용합니다.
backtrace명령에전체옵션을 추가하면 로컬 변수도 표시됩니다.bt및info frame 명령을 사용하여 표시되는 데이터의 사용자 지정 표시를 위해 프레임 필터Python 스크립트를 사용하여 GDB를 확장할 수 있습니다. 프레임은 단일 함수 호출과 연결된 데이터를 나타냅니다.infoinfo명령은 다양한 항목에 대한 정보를 제공하는 일반적인 명령입니다. 설명할 항목을 지정하는 옵션이 필요합니다.-
info args명령은 현재 선택된 프레임인 함수 호출의 옵션을 표시합니다. -
info locals명령은 현재 선택한 프레임에 로컬 변수를 표시합니다.
사용 가능한 항목 목록은 GDB 세션에서 명령
도움말 정보를실행합니다.(gdb) help info-
- L (list)
- 프로그램 소스 코드를 표시합니다. 프로그램이 시작되었지만 현재 중지된 경우 이 명령은 몇 가지 컨텍스트 행과 함께 프로그램이 현재 중지된 소스 코드를 나열합니다. 프로그램이 시작되기 전에 주요 기능이 나열됩니다. 내부 상태를 표시하는 명령은 엄격하게 아니지만, 목록은 사용자가 프로그램 실행의 다음 단계에서 발생할 내부 상태에 대한 변경 사항을 이해하는 데 도움이 됩니다.
3.2.5. GDB Cryostat를 사용하여 정의된 코드 위치에서 실행을 중지 링크 복사링크가 클립보드에 복사되었습니다!
종종 코드의 작은 부분만 조사됩니다. Cryostat는 GDB가 코드의 특정 위치에서 프로그램의 실행을 중지하도록 지시하는 마커입니다. Cryostat는 가장 일반적으로 소스 코드 행과 연결되어 있습니다. 이 경우 Cryostat를 배치하려면 소스 파일 및 행 번호를 지정해야 합니다.
프로세스
Cryostat 를 배치 하려면 다음을 수행합니다.
소스 코드 파일의 이름과 해당 파일에서 행을 지정합니다.
(gdb) br file:line파일이 없으면 현재 실행 시점에 있는 소스 파일의 이름이 사용됩니다.
(gdb) br line또는 함수 이름을 사용하여 Cryostat를 시작에 넣습니다.
(gdb) br function_name작업의 특정 반복 횟수 후에 프로그램에 오류가 발생할 수 있습니다. 실행을 중지하려면 추가 조건 을 지정하려면 다음을 수행합니다.
(gdb) br file:line if condition조건 을 C 또는 C++ 언어의 조건으로 바꿉니다. 파일 및 행의 의미는 위의 내용과 동일합니다.
모든 Cryostat 및 감시 지점의 상태를 검사하려면 다음을 수행합니다.
(gdb) info brinfo br의 출력에 표시된 대로 번호를 사용하여 Cryostat를 제거하려면 다음을 수행합니다.(gdb) delete number지정된 위치에서 Cryostat를 제거하려면 다음을 수행합니다.
(gdb) clear file:line
3.2.6. GDB 감시 지점을 사용하여 데이터 액세스 및 변경 시 실행을 중지 링크 복사링크가 클립보드에 복사되었습니다!
대부분의 경우 특정 데이터가 변경되거나 액세스될 때까지 프로그램이 실행되도록 하는 것이 좋습니다. Watchpoints는 특정 데이터 조건이 충족되면 GDB 에 프로그램 실행을 중지하도록 지시하는 마커입니다.
프로세스
데이터 변경(쓰기)에 대한 감시 지점을 배치하려면 다음을 수행합니다.
(gdb) watch expression조사할 항목을 설명하는 표현식으로 표현식을 바꿉니다. 변수의 경우 표현식 은 변수 이름과 동일합니다.
데이터 액세스에 대한 감시 지점을 배치하려면 다음을 수행합니다.
(gdb) rwatch expression모든 데이터 액세스에 대한 감시 지점을 배치하려면(읽기 및 쓰기 모두)
(gdb) awatch expression모든 감시 지점 및 Cryostat의 상태를 검사하려면 다음을 수행합니다.
(gdb) info br감시 지점을 제거하려면 다음을 수행합니다.
(gdb) delete numnum 옵션을
info br명령으로 보고된 번호로 바꿉니다.
3.2.7. GDB를 사용하여 포크 또는 스레드 프로그램 디버깅 링크 복사링크가 클립보드에 복사되었습니다!
일부 프로그램은 포크 또는 스레드를 사용하여 병렬 코드 실행을 수행합니다. 여러 동시 실행 경로를 디버깅하려면 특별한 고려 사항이 필요합니다.
프로세스 작성 및 스레드의 개념을 이해해야 합니다.
- GDB를 사용하여 분기된 프로그램 디버깅
Forking은 프로그램(부모)이 자체(하위)의 독립적인 복사본을 생성하는 상황입니다. 다음 설정 및 명령을 사용하여 포크가 발생할 때 GDB가 수행하는 작업에 영향을 미칩니다.
follow-fork-mode설정은 GDB가 포크 후 상위 또는 자식을 따르는지 여부를 제어합니다.follow-fork-mode 상위 설정- 포크 후 상위 프로세스를 디버깅합니다. 이는 기본값입니다.
follow-fork-mode 하위 설정- 포크 후 하위 프로세스를 디버깅합니다.
follow-fork-mode 표시-
follow-fork-mode의 현재 설정을 표시합니다.
set detach-on-fork설정은 GDB가 다른 프로세스를 계속 제어하거나 실행할지 여부를 제어합니다.detach-on-fork 설정-
따르지 않는 프로세스(Follow-fork-mode값에 따라 다름)는 분리되고 독립적으로 실행됩니다. 이는 기본값입니다. detach-on-fork off 설정-
GDB는 두 프로세스를 모두 제어합니다.
후속 프로세스(Follow-fork-mode값에 따라 다름)는 다른 프로세스가 일시 중단되는 동안 정상적으로 디버깅됩니다. detach-on-fork 표시-
detach-on-fork의 현재 설정을 표시합니다.
- GDB를 사용하여 스레드 프로그램 디버깅
-
GDB에는 개별 스레드를 디버그하고 독립적으로 조작하고 검사할 수 있습니다. GDB를 검사한 스레드만 중지하도록 하려면
중지되지 않은 명령 세트를사용하고target-async를 설정합니다. 이러한 명령을.gdbinit파일에 추가할 수 있습니다. 해당 기능을 켜면 GDB는 스레드 디버깅을 수행할 준비가 되었습니다.
GDB는 현재 스레드 의 개념을 사용합니다. 기본적으로 명령은 현재 스레드에만 적용됩니다.
정보 스레드-
현재 스레드를 나타내는 ID 및
gid번호가 있는 스레드 목록을 표시합니다. 스레드 ID-
지정된 ID가 있는 스레드를 현재 스레드로 설정합니다.
스레드 적용 ids 명령-
ids로 나열된 모든 스레드에command명령을 적용합니다.ids옵션은 공백으로 구분된 스레드 ID 목록입니다. 특수 값all은 명령을 모든 스레드에 적용합니다. 조건이있는 경우 위치 스레드 ID 중단-
스레드 번호 ID에 대해 특정
조건이있는 특정위치에서Cryostat를설정합니다. 워치 표현식 스레드 ID-
스레드 번호 ID에 대해서만
표현식으로 정의된 감시 지점을설정합니다. Command&-
command명령을 실행하고 gdb 프롬프트(gdb)로 즉시 돌아가 백그라운드에서 모든 코드 실행을 계속합니다. 인터럽트- 백그라운드에서 실행을 중지합니다.
추가 리소스