![별도의 디버깅 정보가 누락되었습니다.](https://linux55.com/image/41236/%EB%B3%84%EB%8F%84%EC%9D%98%20%EB%94%94%EB%B2%84%EA%B9%85%20%EC%A0%95%EB%B3%B4%EA%B0%80%20%EB%88%84%EB%9D%BD%EB%90%98%EC%97%88%EC%8A%B5%EB%8B%88%EB%8B%A4..png)
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
내 질문:
- 이러한 패키지는 기본적으로 GDB에 있어야 합니까?
- 각 패키지의 기능은 무엇입니까?
- 실제 프로덕션 환경에서 GDB용으로 이러한 패키지를 설치해야 합니까?
- 이 패키지를 설치하지 않아도 괜찮나요? 어떤 효과가 있을까요?
답변1
아니요.
gdb
한 관리자가 패키지하고,glibc
다른 관리자가 패키지하고, 모두 다른 관리자가 패키지합니다gcc
.libstdc
이 디버깅 정보를 패키징하려면gdb
많은 조정이 필요합니다. 패키지 중 하나가 변경될 때마다 관리자는gdb
이를 다시 패키지하고 릴리스해야 합니다. 관리하기가 상당히 번거로울 수 있습니다. 예를 들어 나열된 라이브러리에 대한 디버깅 정보가 필요하지 않은gdb
다른 언어를 디버깅하는 것도 가능합니다 .java
이러한
debuginfo
패키지에는 실행 파일에서 제거된 소스 코드와 기호가 포함되어 있습니다. 디버깅 중에만 필요하므로 일반적인 사용 중에는 중복됩니다. 꽤 많은 공간을 차지하므로 프로덕션 빌드 중에 제거되었습니다.때에 따라 다르지. 대부분의 C 코드는
glibc
등을 사용합니다. 그러나 패키지 X를 디버깅하고 내부를 자세히 조사할 필요가 없는 경우 패키지glibc
X를 설치하지 않고도 관리할 수 있습니다. 코드를gdb
맨 아래 까지 따라가거나 라이브러리 자체에 버그가 있다고 생각되면glibc
설치해야 합니다 . 반면에 일부 C 코드는 정적으로 링크될 수 있으며 자체 debuginfo 패키지에 필요한 모든 것을 포함해야 합니다. 그렇지 않으면 응용 프로그램이 다른 언어로 작성될 수 있습니다. 어느 쪽도 설치할 필요가 없습니다.예. 이러한 패키지를 설치하지 않으면 해당 패키지가 제공하는 루틴을 효과적으로 디버깅할 수 없게 됩니다. 위의 3에 표시된 것처럼 모든 것은 해당 수준에서 디버깅해야 하는지 여부에 따라 다릅니다.
노트:-O
많은 애플리케이션이 최적화되었지만( 컴파일러의 플래그를 사용하여) debuginfo를 사용하여 제대로 디버깅되지는 않는다는 것을 알게 될 것입니다 . 해결 방법은 최적화 없이 다시 컴파일하는 것입니다.
답변2
내 솔루션은 이 경고를 받는 사람들에게 도움이 될 수 있습니다.
- 그들은 페도라에서 다른 패키지로 포장되어 있습니다. 이 명령으로
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/
애플리케이션을 디버그하려면 소스 코드와 디버깅 기호를 시스템에 설치하여 시스템의 개별 프레임에 대한 자세한 정보를 얻어야 합니다.더미.
따라서 디버그하려는 바이너리의 모든 종속성에 대해 debuginfo 패키지를 설치해야 합니다.
debuginfo 패키지에는 .debug
파일과 소스 파일이 포함되어 있습니다. 이러한 패키지를 설치한 후 파일은 소스 파일이 저장될 .debug
fedora 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_debuglink
example.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
내 Fedora Workstation x86_64 배포판에서는 이러한 디버그 패키지가 기본적으로 설치되지 않습니다. 프로덕션 환경에 디버그 파일을 설치하면 안 된다고 생각합니다.
그건스택 추적.
스택 추적은 다음과 같아야 합니다.
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