programing

libc의 디버그 버전을 사용하는 방법

projobs 2021. 1. 15. 07:31
반응형

libc의 디버그 버전을 사용하는 방법


짧은 버전의 질문 : gdb가 libc에 대한 디버깅 기호를 사용하도록하려면 어떻게해야합니까?

더 긴 버전 : gdb로 프로그램을 디버깅 중이며 libc에서 사용하는 퓨 텍스에 대한 정보를보고 싶습니다. 그러나 디버깅 중 어느 시점에서 다음과 같은 출력이 나타납니다.

Catchpoint 2 (call to syscall futex), 0x00007ffff772b73e in ?? () from /lib/libc.so.6
(gdb) bt
#0  0x00007ffff772b73e in ?? () from /lib/libc.so.6
#1  0x00007ffff767fb90 in ?? () from /lib/libc.so.6
#2  0x00007ffff767a4c0 in vfprintf () from /lib/libc.so.6
#3  0x00007ffff768565a in printf () from /lib/libc.so.6
....

info sharedlibrary중단 점에서 gdb를 실행하면 다음 과 같이 표시됩니다.

(gdb) info sharedlibrary
From                To                  Syms Read   Shared Object Library
0x00007ffff7dddaf0  0x00007ffff7df6704  Yes (*)     /lib64/ld-linux-x86-64.so.2
0x00007ffff7bc53e0  0x00007ffff7bd1388  Yes (*)     /lib/libpthread.so.0
0x00007ffff79ba190  0x00007ffff79bd7d8  Yes (*)     /lib/librt.so.1
0x00007ffff76538c0  0x00007ffff7766c60  Yes (*)     /lib/libc.so.6
0x00007ffff6c1fd80  0x00007ffff6c303c8  Yes (*)     /lib/libgcc_s.so.1
(*): Shared library is missing debugging information.

그리고 내가 달릴 때 나는 ldd본다.

linux-vdso.so.1 =>  (0x00007ffff7fde000)
libpthread.so.0 => /lib/libpthread.so.0 (0x00007ffff7dbf000)
librt.so.1 => /lib/librt.so.1 (0x00007ffff7bb6000)
libc.so.6 => /lib/libc.so.6 (0x00007ffff7833000)
/lib64/ld-linux-x86-64.so.2 (0x00007ffff7fdf000)

Ubuntu 10.04를 사용하고 있으며 디버그 기호가있는 libc 버전이 /usr/lib/debug/lib. 나는 LD_LIBRARY_PATH이것을 경로의 맨 앞에 두도록 변수를 설정하려고 시도했지만 차이를 만들지 않는 것 같습니다.

프로그램이로드 할 공유 라이브러리를 선택하는 방법에 대해 완전히 명확하지 않습니다. 이것이 런타임에 설정 되든 컴파일 시간에 설정되어 있든 상관 없습니다. 따라서 gdb가 libc의 디버그 버전을 사용하도록하는 방법에 대한 정보는 감사합니다.


디버그 기호가있는 libc 버전은 / usr / lib / debug / lib에 있다고 생각합니다. 내 LD_LIBRARY_PATH 변수를 경로 앞에 두도록 설정하려고 시도했지만 차이가없는 것 같습니다.

이들은 당신이 찾고있는 드로이드 아닙니다 .

/ usr / lib / debug의 라이브러리 실제 라이브러리 가 아닙니다 . 오히려,이 포함 된 경우에만 디버그 정보 만 포함하지 않는 .text.data실제의 섹션 libc.so.6. 여기 에서 별도의 debuginfo 파일에 대해 읽을 수 있습니다 .

의 파일 /usr/lib/debuglibc6-dbg패키지에서 가져 오며 GDB는 설치된 버전 과 일치 하는 한 자동으로 로드합니다 libc6. 귀하의 경우 libc6와는 libc6-dbg일치하지 않는, 당신은 GDB에서 경고를해야한다.

를 설정하여 GDB가 읽으려는 파일을 관찰 할 수 있습니다 set verbose on. 다음은 일치하는 시기 libc6libc6-dbg일치 항목입니다.

(gdb) set verbose on
(gdb) run
thread_db_load_search returning 0
Reading symbols from /lib64/ld-linux-x86-64.so.2...Reading symbols from /usr/lib/debug/lib/ld-2.11.1.so...done.
thread_db_load_search returning 0
done.
thread_db_load_search returning 0
Loaded symbols for /lib64/ld-linux-x86-64.so.2
Reading symbols from system-supplied DSO at 0x7ffff7ffb000...done.
WARNING: no debugging symbols found in system-supplied DSO at 0x7ffff7ffb000.
thread_db_load_search returning 0
Reading in symbols for dl-debug.c...done.
Reading in symbols for rtld.c...done.
Reading symbols from /lib/librt.so.1...Reading symbols from /usr/lib/debug/lib/librt-2.11.1.so...done.
thread_db_load_search returning 0
... etc ...

최신 정보:

예를 들어 나는 본다
Reading symbols from /lib/libc.so.6...(no debugging symbols found)...done

그것은 당신의 GDB가 검색하지 않는다는 것을 의미합니다 /usr/lib/debug. 발생할 수있는 한 가지 방법은 잘못 설정 debug-file-directory경우 .gdbinit입니다.

다음은 기본 설정입니다.

(gdb) show debug-file-directory
The directory where separate debug symbols are searched for is "/usr/lib/debug".

libc에 대한 디버그 기호를 설치했는지 확인하십시오.

sudo apt-get install libc6-dbg

x64 시스템에서 x86 코드를 디버깅하는 경우 :

sudo apt-get install libc6:i386
sudo apt-get install libc6-dbg:i386

참조 URL : https://stackoverflow.com/questions/10000335/how-to-use-debug-version-of-libc

반응형