검색

3.5. GDB의 호환성 혁신적인 변경 사항

download PDF

Red Hat Enterprise Linux 8에서 제공되는 GDB 버전에는 호환성이 손상되는 여러 변경 사항이 포함되어 있습니다. 특히 GDB 출력을 터미널에서 직접 읽습니다. 다음 섹션에서는 이러한 변경 사항에 대해 자세히 설명합니다.

GDB의 출력 구문 분석은 권장되지 않습니다. Python GDB API 또는 GDB 머신 인터페이스(MI)를 사용하여 스크립트를 선호합니다.

gdbserver에서 쉘을 사용하여 inferiors를 시작합니다.

열등 명령줄 인수에서 확장 및 변수 대체를 활성화하기 위해 GDBserver는 이제 GDB와 같은 쉘에서 유추를 시작합니다.

쉘 사용을 비활성화하려면 다음을 수행합니다.

  • 타겟 extended-remote GDB 명령을 사용하는 경우 set startup-with-shell off 명령으로 쉘을 비활성화합니다.
  • 대상 원격 GDB 명령을 사용하는 경우 GDBserver의 --no-startup-with-shell 옵션으로 쉘을 비활성화합니다.

예 3.1. 원격 GDB 유추에서 쉘 확장의 예

다음 예에서는 GDBserver를 통해 /bin/echo /* 명령을 실행하는 것이 Red Hat Enterprise Linux 버전 7 및 8에서 어떻게 다른지 보여줍니다.

  • RHEL 7의 경우:

    $ gdbserver --multi :1234
    $ gdb -batch -ex 'target extended-remote :1234' -ex 'set remote exec-file /bin/echo' -ex 'file /bin/echo' -ex 'run /*'
    /*
  • RHEL 8의 경우:

    $ gdbserver --multi :1234
    $ gdb -batch -ex 'target extended-remote :1234' -ex 'set remote exec-file /bin/echo' -ex 'file /bin/echo' -ex 'run /*'
    /bin /boot (...) /tmp /usr /var

Gcj 지원 제거

GNU 컴파일러 for Java(gcj)로 컴파일된 Java 프로그램 디버깅 지원이 제거되었습니다.

유지 관리 명령을 덤프하는 기호의 새로운 구문

이제 기호 덤프 유지 관리 명령 구문에 파일 이름 앞에 옵션이 포함됩니다. 결과적으로 RHEL 7에서 GDB와 함께 작동하는 명령이 RHEL 8에서는 작동하지 않습니다.

예를 들어 다음 명령은 더 이상 파일에 기호를 저장하지 않지만 오류 메시지를 생성합니다.

(gdb) maintenance print symbols /tmp/out main.c

유지 관리 명령을 덤프하는 기호의 새 구문은 다음과 같습니다.

maint print symbols [-pc address] [--] [filename]
maint print symbols [-objfile objfile] [-source source] [--] [filename]
maint print psymbols [-objfile objfile] [-pc address] [--] [filename]
maint print psymbols [-objfile objfile] [-source source] [--] [filename]
maint print msymbols [-objfile objfile] [--] [filename]

스레드 번호가 더 이상 글로벌이 아닙니다.

이전에는 GDB가 글로벌 스레드 번호 지정만 사용했습니다. 2.1 과 같은ferior _num.thread_num 형식의 유추에 따라 번호 지정이 표시되도록 확장되었습니다. 결과적으로 $_thread 편의 변수 및Inferior Thread.num Python 속성의 스레드 번호는 더 이상 유추자 간에 고유하지 않습니다.

GDB는 이제 이전 릴리스의 스레드 번호와 새로 해당하는 새 스레드 ID인 스레드당 두 번째 스레드 ID를 저장합니다. 글로벌 스레드 번호에 액세스하려면 $_gthread 편의 변수와Inferior Thread.global_num Python 특성을 사용합니다.

이전 버전과의 호환성을 위해MI(Machine Interface) 스레드 ID에는 항상 글로벌 ID가 포함됩니다.

예 3.2. GDB 스레드 번호 변경 예

Red Hat Enterprise Linux 7의 경우:

# debuginfo-install coreutils
$ gdb -batch -ex 'file echo' -ex start -ex 'add-inferior' -ex 'inferior 2' -ex 'file echo' -ex start -ex 'info threads' -ex 'pring $_thread' -ex 'inferior 1' -ex 'pring $_thread'
(...)
  Id   Target Id         Frame
* 2    process 203923 "echo" main (argc=1, argv=0x7fffffffdb88) at src/echo.c:109
  1    process 203914 "echo" main (argc=1, argv=0x7fffffffdb88) at src/echo.c:109
$1 = 2
(...)
$2 = 1

Red Hat Enterprise Linux 8의 경우:

# dnf debuginfo-install coreutils
$ gdb -batch -ex 'file echo' -ex start -ex 'add-inferior' -ex 'inferior 2' -ex 'file echo' -ex start -ex 'info threads' -ex 'pring $_thread' -ex 'inferior 1' -ex 'pring $_thread'
(...)
  Id   Target Id         Frame
  1.1  process 4106488 "echo" main (argc=1, argv=0x7fffffffce58) at ../src/echo.c:109
* 2.1  process 4106494 "echo" main (argc=1, argv=0x7fffffffce58) at ../src/echo.c:109
$1 = 1
(...)
$2 = 1

값 컨텐츠에 대한 메모리를 제한할 수 있습니다.

이전에는 GDB가 값 콘텐츠에 할당된 메모리 양을 제한하지 않았습니다. 결과적으로 잘못된 프로그램을 디버깅하면 GDB에서 메모리를 너무 많이 할당할 수 있었습니다. 할당된 메모리 양을 제한하기 위해 max-value-size 설정이 추가되었습니다. 이 제한의 기본값은 64KiB입니다. 결과적으로 Red Hat Enterprise Linux 8의 GDB는 너무 큰 값을 표시하지 않지만 값이 너무 크다고 보고합니다.

예를 들어, char s[128*1024]로 정의된 값을 인쇄하고 다른 결과를 생성합니다.

  • Red Hat Enterprise Linux 7에서 $1 = 'A' <repeats 131072번>
  • Red Hat Enterprise Linux 8에서 값은 131072 바이트가 필요하며, 이는 max-value-size보다큽니다.

Stab 형식의 Sun 버전은 더 이상 지원되지 않습니다.

stabs 디버그 파일 형식의 Sun 버전에 대한 지원이 제거되었습니다. gcc -gstabs 옵션을 사용하여 RHEL에서 GCC에서 생성된 stab 형식 은 여전히 GDB에서 지원합니다.

sysroot 변경 처리

set sysroot path 명령은 디버깅에 필요한 파일을 검색할 때 시스템 루트를 지정합니다. 이제 이 명령에 제공된 디렉토리 이름을 앞에 target target이 붙을 수 있습니다. 를 추가하여 GDB가 대상 시스템(로컬 및 원격 모두)의 공유 라이브러리를 읽도록 할 수 있습니다. 이전에 사용 가능한 remote: 접두사는 이제 target: 로 처리됩니다. 또한 기본 시스템 루트 값은 이전 버전과의 호환성을 위해 빈 문자열에서 target 으로 변경되었습니다.

지정된 시스템 루트는 기본 실행 파일의 파일 이름 앞에 추가되며, GDB가 원격으로 프로세스를 시작하거나 이미 실행 중인 프로세스(로컬 및 원격 모두)에 첨부된 경우입니다. 즉, 원격 프로세스의 경우 기본값 target: 는 GDB가 항상 원격 시스템의 디버깅 정보를 로드하려고 시도합니다. 이를 방지하려면 대상 원격 명령 앞에 set sysroot 명령을 실행하여 로컬 기호 파일이 원격 명령 앞에 배치되도록 합니다.

HISTSIZE는 더 이상 GDB 명령 기록 크기를 제어하지 않습니다.

이전에는 GDB에서 HISTSIZE 환경 변수를 사용하여 명령 기록을 유지해야 하는 기간을 결정했습니다. GDB가 대신 GDBHISTSIZE 환경 변수를 사용하도록 변경되었습니다. 이 변수는 GDB에만 고유합니다. 가능한 값과 해당 영향은 다음과 같습니다.

  • 양수 - 이 크기의 명령 이력을 사용합니다.
  • -1 또는 빈 문자열 - 모든 명령의 기록을 유지합니다.
  • 숫자가 아닌 값 - 무시됨.

완료 제한 추가

이제 완료 중에 고려되는 최대 후보 수를 set max-completions 명령을 사용하여 제한할 수 있습니다. 현재 제한을 표시하려면 show max-completions 명령을 실행합니다. 기본값은 200입니다. 이 제한은 GDB가 과도하게 큰 완료 목록을 생성하고 응답하지 않는 것을 방지합니다.

예를 들어 p <tabtab> 입력 후의 출력은 다음과 같습니다.

  • RHEL 7의 경우: 모든 29863 옵션을 표시하시겠습니까? (y 또는 n)
  • RHEL 8의 경우: 200 가능성을 모두 표시하시겠습니까? (y 또는 n)

HP-UX XDB 호환 모드 제거

HP-UX XDB 호환성 모드의 -xdb 옵션이 GDB에서 제거되었습니다.

스레드 신호 처리

이전에는 GDB가 신호가 실제로 전송된 스레드 대신 현재 스레드에 신호를 전달할 수 있었습니다. 이 버그가 수정되어 GDB가 실행을 다시 시작할 때 항상 올바른 스레드로 신호를 전달합니다.

또한 signal 명령은 요청된 신호를 현재 스레드에 항상 올바르게 전달합니다. 프로그램이 신호에 대해 중지되고 사용자가 전환 스레드를 전환하면 GDB에서 확인을 요청합니다.

중단 모드 - 항상 삽입 해제 및 자동 병합

always-inserted 설정이 변경되었습니다. auto 값과 해당 동작이 제거되었습니다. 이제 기본값은 off 입니다. 또한 off 값은 이제 GDB가 모든 스레드가 중지될 때까지 대상에서 중단점을 제거하지 않도록 합니다.

remotebaud 명령은 더 이상 지원되지 않음

set remotebaudshow remotebaud 명령은 더 이상 지원되지 않습니다. set serial baud 를 사용하고 대신 직렬 baud 명령을 표시합니다.

Red Hat logoGithubRedditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

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

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

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

Red Hat 소개

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

© 2024 Red Hat, Inc.