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를 프로세스로 이미 실행 중인 프로그램에 연결하려면 다음을 수행합니다.

  1. ps 명령을 사용하여 프로세스 ID(pid )를 찾습니다.

    $ ps -C program -o pid h
     pid

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

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

    $ gdb program -p pid

    프로그램을 프로그램의 파일 이름 또는 경로로 교체하고 pidps 출력의 실제 프로세스 ID 번호로 바꿉니다.

Already running GDB를 Already Running Process에 연결

이미 실행 중인 GDB를 이미 실행 중인 프로그램에 연결하려면 다음을 수행합니다.

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

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

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

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

    (gdb) attach pid

    ps 출력의 실제 프로세스 ID 번호로 pid 를 교체합니다.

참고

경우에 따라 GDB가 해당 실행 파일을 찾지 못할 수 있습니다. file 명령을 사용하여 경로를 지정합니다.

(gdb) file path/to/program
추가 리소스

20.2.3. GDB를 사용하여 프로그램 코드를 단계별로 실행

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.4. GDB를 사용하여 프로그램 내부 값 표시

프로그램의 내부 변수의 값을 표시하는 것은 프로그램이 무엇을 하는지 이해하는 데 중요합니다. GDB는 내부 변수를 검사하는 데 사용할 수 있는 여러 명령을 제공합니다. 이 섹션에서는 이러한 명령을 가장 유용하게 설명합니다.

사전 요구 사항
  • GDB 디버거에 대한 이해
GDB 명령 프로그램의 내부 상태를 표시
p (인쇄)

지정된 인수의 값을 표시합니다. 일반적으로 인수는 간단한 단일 값에서 구조까지 복잡한 변수의 이름입니다. 인수는 프로그램 변수 및 라이브러리 함수 또는 테스트 중인 프로그램에 정의된 함수 사용을 포함하여 현재 언어로 유효한 표현식일 수도 있습니다.

출력 명령을 사용하여 데이터 구조(예: 클래스, groups)의 사용자 지정 표시를 위해 GDB를 Python 또는 Guile 스크립트로 확장할 있습니다.

BT( backtrace)

현재 실행 지점에 도달하는 데 사용되는 함수 호출 체인 또는 실행이 전송될 때까지 사용되는 함수의 함수 체인을 표시합니다. 이는 제거 원인과 같은 심각한 버그(예: 분할 오류)를 조사하는 데 유용합니다.

backtrace 명령에 전체 옵션을 추가하면 로컬 변수도 표시됩니다.

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

info

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

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

가능한 항목 목록은 GDB 세션에서 명령 도움말 정보를 실행하십시오.

(gdb) help info
l (list)
프로그램이 중지된 소스 코드에서 행을 표시합니다. 이 명령은 프로그램 실행이 중지된 경우에만 사용할 수 있습니다. 내부 상태를 표시하는 명령은 엄격하게 아니지만 list 는 사용자가 프로그램 실행의 다음 단계에서 내부 상태에 대한 변경 사항을 이해하는 데 도움이 됩니다.
추가 리소스

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는 현재 스레드 의 개념을 사용합니다. 기본적으로 명령은 현재 스레드에만 적용됩니다.

정보 스레드
idgid 숫자가 있는 스레드 목록을 표시하고 현재 스레드를 나타냅니다.
스레드 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
백그라운드에서 실행을 중지합니다.
추가 리소스
Red Hat logoGithubRedditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다.

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

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

Red Hat 소개

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

© 2024 Red Hat, Inc.