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로 프로그램을 시작합니다.

    1. GDB를 사용하여 프로그램을 실행합니다.

      $ gdb program

      프로그램을 프로그램 파일 이름 또는 경로로 바꿉니다.

      GDB는 프로그램 실행을 시작하도록 설정합니다. run 명령으로 프로세스 실행을 시작하기 전에 Cryostat 및 gdb 환경을 설정할 수 있습니다.

    2. 이미 실행 중인 프로세스에 GDB를 연결합니다.
    3. ps 명령을 사용하여 프로세스 ID(pid)를 찾습니다.

      $ ps -C program -o pid h
       pid

      프로그램을 프로그램 파일 이름 또는 경로로 바꿉니다.

    4. GDB를 이 프로세스에 연결합니다.

      $ gdb -p pid

      pidps 출력의 실제 프로세스 ID 번호로 바꿉니다.

  • 실행 중인 프로그램에 활성 GDB 세션을 연결합니다.

    1. shell GDB 명령을 사용하여 ps 명령을 실행하고 프로그램의 프로세스 ID(pid)를 찾습니다.

      (gdb) shell ps -C program -o pid h
       pid

      프로그램을 프로그램 파일 이름 또는 경로로 바꿉니다.

    2. attach 명령을 사용하여 GDB를 프로그램에 연결합니다.

      (gdb) attach pid

      pidps 출력의 실제 프로세스 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 명령에 전체 옵션을 추가하면 로컬 변수도 표시됩니다.

btinfo frame 명령을 사용하여 표시되는 데이터의 사용자 지정 표시를 위해 프레임 필터 Python 스크립트를 사용하여 GDB를 확장할 수 있습니다. 프레임은 단일 함수 호출과 연결된 데이터를 나타냅니다.

info

info 명령은 다양한 항목에 대한 정보를 제공하는 일반적인 명령입니다. 설명할 항목을 지정하는 옵션이 필요합니다.

  • info args 명령은 현재 선택된 프레임인 함수 호출의 옵션을 표시합니다.
  • info locals 명령은 현재 선택한 프레임에 로컬 변수를 표시합니다.

사용 가능한 항목 목록은 GDB 세션에서 명령 도움말 정보를 실행합니다.

(gdb) help info
L (list)
프로그램 소스 코드를 표시합니다. 프로그램이 시작되었지만 현재 중지된 경우 이 명령은 몇 가지 컨텍스트 행과 함께 프로그램이 현재 중지된 소스 코드를 나열합니다. 프로그램이 시작되기 전에 주요 기능이 나열됩니다. 내부 상태를 표시하는 명령은 엄격하게 아니지만, 목록은 사용자가 프로그램 실행의 다음 단계에서 발생할 내부 상태에 대한 변경 사항을 이해하는 데 도움이 됩니다.

3.2.5. GDB Cryostat를 사용하여 정의된 코드 위치에서 실행을 중지

종종 코드의 작은 부분만 조사됩니다. Cryostat는 GDB가 코드의 특정 위치에서 프로그램의 실행을 중지하도록 지시하는 마커입니다. Cryostat는 가장 일반적으로 소스 코드 행과 연결되어 있습니다. 이 경우 Cryostat를 배치하려면 소스 파일 및 행 번호를 지정해야 합니다.

프로세스

  • Cryostat 를 배치 하려면 다음을 수행합니다.

    1. 소스 코드 파일의 이름과 해당 파일에서 행을 지정합니다.

      (gdb) br file:line
    2. 파일이 없으면 현재 실행 시점에 있는 소스 파일의 이름이 사용됩니다.

      (gdb) br line
    3. 또는 함수 이름을 사용하여 Cryostat를 시작에 넣습니다.

      (gdb) br function_name
    4. 작업의 특정 반복 횟수 후에 프로그램에 오류가 발생할 수 있습니다. 실행을 중지하려면 추가 조건 을 지정하려면 다음을 수행합니다.

      (gdb) br file:line if condition

      조건 을 C 또는 C++ 언어의 조건으로 바꿉니다. 파일행의 의미는 위의 내용과 동일합니다.

  • 모든 Cryostat 및 감시 지점의 상태를 검사하려면 다음을 수행합니다.

    (gdb) info br
  • info br 의 출력에 표시된 대로 번호를 사용하여 Cryostat를 제거하려면 다음을 수행합니다.

    (gdb) delete number
  • 지정된 위치에서 Cryostat를 제거하려면 다음을 수행합니다.

    (gdb) clear file:line

대부분의 경우 특정 데이터가 변경되거나 액세스될 때까지 프로그램이 실행되도록 하는 것이 좋습니다. Watchpoints는 특정 데이터 조건이 충족되면 GDB 에 프로그램 실행을 중지하도록 지시하는 마커입니다.

프로세스

  • 데이터 변경(쓰기)에 대한 감시 지점을 배치하려면 다음을 수행합니다.

    (gdb) watch expression

    조사할 항목을 설명하는 표현식으로 표현식을 바꿉니다. 변수의 경우 표현식 은 변수 이름과 동일합니다.

  • 데이터 액세스에 대한 감시 지점을 배치하려면 다음을 수행합니다.

    (gdb) rwatch expression
  • 모든 데이터 액세스에 대한 감시 지점을 배치하려면(읽기 및 쓰기 모두)

    (gdb) awatch expression
  • 모든 감시 지점 및 Cryostat의 상태를 검사하려면 다음을 수행합니다.

    (gdb) info br
  • 감시 지점을 제거하려면 다음을 수행합니다.

    (gdb) delete num

    num 옵션을 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) 로 즉시 돌아가 백그라운드에서 모든 코드 실행을 계속합니다.
인터럽트
백그라운드에서 실행을 중지합니다.
Red Hat logoGithubredditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 문서 정보

Legal Notice

Theme

© 2026 Red Hat
맨 위로 이동