별도의 디버깅 정보가 누락되었습니다.

별도의 디버깅 정보가 누락되었습니다.

Fedora 시스템에서 GDB를 사용하여 코드를 디버깅하려고 합니다. 실행할 때마다 이 메시지가 생성됩니다.

Missing separate debuginfos, use: debuginfo-install glibc-2.18-12.fc20.x86_64 libgcc-4.8.3-1.fc20.x86_64 libstdc++-4.8.3-1.fc20.x86_64

내 질문:

  1. 이러한 패키지는 기본적으로 GDB에 있어야 합니까?
  2. 각 패키지의 기능은 무엇입니까?
  3. 실제 프로덕션 환경에서 GDB용으로 이러한 패키지를 설치해야 합니까?
  4. 이 패키지를 설치하지 않아도 괜찮나요? 어떤 효과가 있을까요?

답변1

  1. 아니요. gdb한 관리자가 패키지하고, glibc다른 관리자가 패키지하고, 모두 다른 관리자가 패키지합니다 gcc. libstdc이 디버깅 정보를 패키징하려면 gdb많은 조정이 필요합니다. 패키지 중 하나가 변경될 때마다 관리자는 gdb이를 다시 패키지하고 릴리스해야 합니다. 관리하기가 상당히 번거로울 수 있습니다. 예를 들어 나열된 라이브러리에 대한 디버깅 정보가 필요하지 않은 gdb다른 언어를 디버깅하는 것도 가능합니다 .java

  2. 이러한 debuginfo패키지에는 실행 파일에서 제거된 소스 코드와 기호가 포함되어 있습니다. 디버깅 중에만 필요하므로 일반적인 사용 중에는 중복됩니다. 꽤 많은 공간을 차지하므로 프로덕션 빌드 중에 제거되었습니다.

  3. 때에 따라 다르지. 대부분의 C 코드는 glibc등을 사용합니다. 그러나 패키지 X를 디버깅하고 내부를 자세히 조사할 필요가 없는 경우 패키지 glibcX를 설치하지 않고도 관리할 수 있습니다. 코드를 gdb맨 아래 까지 따라가거나 라이브러리 자체에 버그가 있다고 생각되면 glibc설치해야 합니다 . 반면에 일부 C 코드는 정적으로 링크될 수 있으며 자체 debuginfo 패키지에 필요한 모든 것을 포함해야 합니다. 그렇지 않으면 응용 프로그램이 다른 언어로 작성될 수 있습니다. 어느 쪽도 설치할 필요가 없습니다.

  4. 예. 이러한 패키지를 설치하지 않으면 해당 패키지가 제공하는 루틴을 효과적으로 디버깅할 수 없게 됩니다. 위의 3에 표시된 것처럼 모든 것은 해당 수준에서 디버깅해야 하는지 여부에 따라 다릅니다.

노트:-O많은 애플리케이션이 최적화되었지만( 컴파일러의 플래그를 사용하여) debuginfo를 사용하여 제대로 디버깅되지는 않는다는 것을 알게 될 것입니다 . 해결 방법은 최적화 없이 다시 컴파일하는 것입니다.

답변2

내 솔루션은 이 경고를 받는 사람들에게 도움이 될 수 있습니다.

  1. 그들은 페도라에서 다른 패키지로 포장되어 있습니다. 이 명령으로 dnf install debuginfo-install packagename이 경고를 해결할 수 있습니다.

내 운영 체제는 fedora 29 워크스테이션 x86_64입니다. 디버그 정보 패키지는 다음에서 찾을 수 있습니다.아카이브 저장소, 예를 들어glibc-debuginfo-2.28-9.fc29.x86_64.rpm,glibc-debuginfo-common-2.28-9.fc29.x86_64.rpm,libgcc-debuginfo-8.2.1-2.fc29.x86_64.rpm,libstdc++-debuginfo-8.2.1-2.fc29.x86_64.rpm.

다른 버전의 패키지는 여기에서 확인할 수 있습니다.보관된 버전또는최신 버전.

소스 코드:gcc-mirror는 github에서 온라인 상태입니다.,glibc 온라인 소스 소프트웨어,gcc 온라인 소스 코드의 libstdc++. 소스 코드 패키지에는 gcc, gdb, glibc가 포함됩니다.https://ftp.gnu.org/gnu/

  1. 바라보다gdb가 "별도의 디버깅 정보가 누락되었습니다"라는 메시지를 표시하는 이유는 무엇입니까?

애플리케이션을 디버그하려면 소스 코드와 디버깅 기호를 시스템에 설치하여 시스템의 개별 프레임에 대한 자세한 정보를 얻어야 합니다.더미.

따라서 디버그하려는 바이너리의 모든 종속성에 대해 debuginfo 패키지를 설치해야 합니다.

debuginfo 패키지에는 .debug파일과 소스 파일이 포함되어 있습니다. 이러한 패키지를 설치한 후 파일은 소스 파일이 저장될 .debugfedora 29에 저장됩니다 . 그리고 연결 부분이 glibc 라이브러리 파일에 추가됩니다./usr/lib/debug/lib64//usr/src/debug/.gnu_debuglink

예를 들어 /usr/lib/debug/lib64/libc-2.28.so.debug설치에서 glibc-debuginfo-2.28-39.fc29.x86_64.

[user@localhost myctest]$ rpm --query --list glibc-debuginfo-2.28-39.fc29.x86_64 | grep libc-2.28.so.debug
/usr/lib/debug/lib64/libc-2.28.so.debug
[user@localhost myctest]$ readelf -S /usr/lib64/libc-2.28.so | grep debug
  [73] .gnu_debuglink    PROGBITS         0000000000000000  002a6df0
[user@localhost myctest]$ readelf -S /lib64/libc-2.28.so | grep debug
  [73] .gnu_debuglink    PROGBITS         0000000000000000  002a6df0
[user@localhost myctest]$ readelf --debug-dump=links /usr/lib64/libc-2.28.so 
Contents of the .gnu_debuglink section:

  Separate debug info file: libc-2.28.so.debug
  CRC value: 0x9bd5ece3

및 소스 파일:

[user@localhost myctest]$ ls -l /usr/src/debug/
total 4
drwxr-xr-x. 60 root root 4096 Aug 10 18:36 glibc-2.28-110-g57922433fa

이러한 패키지를 생성하는 스크립트는 /usr/lib/rpm/find-debuginfo.sh입니다..

수동으로 자신만의 파일을 만들 수 있습니다 .debug.

예를 들어보세요:

#include <stdio.h> 

int main (int argc, char *argv[]) { 

    int n; 
    for (n=0; n<10; n++) { 
       printf("Print Number: %d\n", n); 
    } 
    return 0; 
} 

실행 파일을 디버깅하기 위해 컴파일

gcc example.c -o example.bin -g

파일을 생성하고 .debug파일에서 디버그 섹션을 제거합니다.example.bin

objcopy --only-keep-debug example.bin example.debug
strip -g example.bin

함께 연결하십시오. 에 추가하세요..gnu_debuglinkexample.bin

objcopy --add-gnu-debuglink=example.bin.debug example.bin

그렇다면 당신은:

[user@localhost myctest]$ readelf --debug-dump example.bin 
Contents of the .gnu_debuglink section:

  Separate debug info file: example.bin.debug
  CRC value: 0xefae614e

  1. 내 Fedora Workstation x86_64 배포판에서는 이러한 디버그 패키지가 기본적으로 설치되지 않습니다. 프로덕션 환경에 디버그 파일을 설치하면 안 된다고 생각합니다.

  2. 그건스택 추적.

스택 추적은 다음과 같아야 합니다.

Reading symbols from example.bin...done.
(gdb) start
Temporary breakpoint 1 at 0x401135: file example.c, line 6.
Starting program: /home/codc/works/cpp/example.bin 
warning: Loadable section ".note.gnu.property" outside of ELF segments

Temporary breakpoint 1, main (argc=1, argv=0x7fffffffd5d8) at example.c:6
6       for (n=0; n<10; n++) {
(gdb) break printf
Breakpoint 2 at 0x7ffff7e32100: file printf.c, line 28.
(gdb) commands 2
Type commands for breakpoint(s) 2, one per line.
End with a line saying just "end".
>backtrace
>continue
>end
(gdb) continue
Continuing.

Breakpoint 2, __printf (format=0x402010 "Print Number: %d\n") at printf.c:28
28  {
#0  __printf (format=0x402010 "Print Number: %d\n") at printf.c:28
#1  0x0000000000401152 in main (argc=1, argv=0x7fffffffd5d8) at example.c:7
Print Number: 0

Breakpoint 2, __printf (format=0x402010 "Print Number: %d\n") at printf.c:28
28  {
#0  __printf (format=0x402010 "Print Number: %d\n") at printf.c:28
#1  0x0000000000401152 in main (argc=1, argv=0x7fffffffd5d8) at example.c:7
Print Number: 1

관련 정보