Red Hat Training

A Red Hat training course is available for RHEL 8

16.4. GDB의 호환성 발생 변경 사항

Red Hat Enterprise Linux 8에서 제공되는 GDB 버전에는 특히 Terminal에서 직접 GDB 출력을 읽는 경우의 다양한 변경 사항이 포함되어 있습니다. 다음 섹션에서는 이러한 변경 사항에 대해 자세히 설명합니다.

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

gdbserver가 쉘을 사용하여 유추자 시작

inferior 명령줄 인수에서 확장 및 변수 대체를 활성화하기 위해 GDB와 동일한 쉘에서 inferior를 시작합니다.

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

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

예 16.1. remote GDB inferiors의 쉘 확장 예

이 예에서는 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 Compiler 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에서 글로벌 스레드 번호 지정만 사용했습니다. numbering은ferior에 의해,ferior _num.thread_num, (예: 2.1 ) 의 형태로 표시되도록 확장되었다. 결과적으로 $_thread convenience variable의 스레드 번호 및 InferiorThread.num Python 속성은 더 이상 페이오버 간에 고유하지 않습니다.

GDB는 이제 이전 릴리스의 새로운 스레드 번호인 전역 스레드 ID라고 하는 스레드당 두 번째 스레드 ID를 저장합니다. 글로벌 스레드 번호에 액세스하려면 $_gthread convenience variable 및 InferiorThread.global_num Python 속성을 사용합니다.

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

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

On 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

On 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는 너무 큰 값을 표시하지는 않지만 대신 값이 너무 클 것으로 보고됩니다.

예를 들어 character s[128*1024] 로 정의된 값을 출력하면 다른 결과가 생성됩니다.

  • Red Hat Enterprise Linux 7에서 $1 = 'A' <repeats 131072 times>
  • Red Hat Enterprise Linux 8에서 값을 사용하려면 max-value-size 이상의 131072 바이트가필요합니다.

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

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

sysroot 처리 변경

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

지정된 시스템 루트는 기본 실행 파일의 파일 이름 앞에 있거나 GDB가 원격으로 프로세스를 시작할 때 또는 이미 실행 중인 프로세스(로컬 및 원격)에 연결되는 경우입니다. 즉, 원격 프로세스의 경우 기본 값 target: GDB가 항상 원격 시스템에서 디버깅 정보를 로드하려고 시도합니다. 이 문제를 방지하려면 대상 원격 명령 앞에 set sysroot 명령을 실행하여 원격 기호 파일보다 먼저 로컬 기호 파일을 찾습니다.

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

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

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

완료 제한 추가

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

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

  • RHEL 7에서: 29863 가능성을 모두 표시? (y 또는 n)
  • RHEL 8에서: 200개의 가능성을 모두 표시합니까? (y 또는 n)

HP-UX XDB 호환성 모드 제거

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

스레드에 대한 신호 처리

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

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

정지 모드 항상 삽입 및 자동 병합

Breakpoint always-inserted 설정이 변경되었습니다. auto 값과 해당 동작이 제거되었습니다. 기본값은 OFF입니다.The default value is off. 또한 off 값으로 인해 GDB는 모든 스레드가 중지될 때까지 대상에서 정지하지 않도록 합니다.

remotebaud 명령은 더 이상 지원되지 않습니다.

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