2012-12-03 7 views
2

응용 프로그램을 디버깅 할 때 GDB를 중단하고 errno를 검사하는 함수 내부에서조차도 errno를 인쇄하려고하면 다음 오류가 발생합니다 GDB에서 :gdb에서 errno를 인쇄 할 수없고 공유 라이브러리가 누락되었다고 불평하지만 존재합니다.

(gdb) print errno 
Cannot find shared library `/usr/lib/debug/lib/libc-2.11.1.so' in dynamic linker's load module list 

것들 나는 시도했다 : 파일이 존재

  1. 체크하면 수행하고 7.3MB에 관한 것입니다.
  2. LD_LIBRARY_PATH 앞에/usr/lib/debug/lib /를 추가하십시오. 효과가 없습니다.
  3. LD_PRELOAD =/usr/lib/debug/lib/libc-2.11.1.so를 설정하면 시작할 때 내 앱이 segfault로 설정됩니다.
  4. 바이너리에서 ldd를 실행하면 '/lib/libc.so.6'을 사용하고 있고 aptitude (저는 Ubuntu를 사용하고 있습니다)라고 나와 libc6-dbg를 말합니다. 입니다.
  5. .gdbinit에 사용자 정의 lib 경로가 설정되어 있지 않은지 확인했는데, 그렇지 않습니다.

응용 프로그램이 정상적으로 실행되는 것처럼 보이므로 libc 자체가 망가 졌다고 상상할 수 없습니다. 어떤 아이디어?

+0

은 껍질처럼 보이는 LD_LIBRARY_PATH를 건드리지 파일을 시작합니다. 이 링크 [http://ipucu.enderunix.org/view.php?id=1720&lang=en]를 확인하십시오. 희망은 유용합니다. –

+0

@SunEric : AFAICT,/usr/lib와 같은 시스템 경로는 항상 자동으로 검색됩니다. 또한 # 2에서 LD_LIBRARY_PATH에 경로를 명시 적으로 추가해도 오류가 해결되지 않는다고 지적했습니다. –

답변

9

파일 /usr/lib/debug/lib/libc-2.11.1.so이 아니며에는 glibc의 디버그 버전이 포함되어 있습니다. 의 libc 디버그 부분 만 포함되지만 실제 실행 코드는입니다. LD_PRELOAD 또는 LD_LIBRARY_PATH에 넣는 것은 잘못된 할 일입니다. 그거 하지마.

별도의 디버그 파일 here에 대해 읽을 수 있습니다.

은 errno를
동적 링커의로드 모듈 목록에`/usr/lib/debug/lib/libc-2.11.1.so '공유 라이브러리를 찾을 수 없습니다

(GDB) 인쇄

이것은이다 GDB의 버그 렛.

GDB가 변수 errno을 찾을 것임을 알아야합니다. 그러나 응용 프로그램은 그러한 변수를 사용하지 않습니다. 오히려 errno#define d 매크로이고, 이는 *(__errno_location())으로 확장되며 GDB는 이에 대해 알지 못합니다.

대신을 시도해보십시오

(gdb) p __errno_location() 
$1 = (int *) 0x7ffff78396a8 

(gdb) x/x $1 
0x7ffff78396a8: 0x00000000