2017-11-07 20 views
2

동적으로 링크 된 공유 라이브러리로 실행중인 C 응용 프로그램을 디버깅하고 있습니다. 이 프로그램은 우분투 14.04 64 비트에서 잘 돌아갑니다. 그러나 우분투 16.04에서 리눅스가 애플리케이션을 종료 할 때 공유 객체를 종료 할 때 세그멘테이션 오류가 발생합니다.gdb 정보 소스에 따라 소스 파일을 찾을 수 없음

gdb에서 세그먼테이션 오류가 발생하기 직전에 브레이크 포인트를 설정했습니다. 그럼 소스 파일 정보를 확인 info source를 사용

Thread 1 "test" hit Breakpoint 3, _dl_fini() at dl-fini.c:201 
(gdb) info source 
Current source file is dl-fini.c 
Compilation directory is /build/glibc-bfm8X4/glibc-2.23/elf 
Located in /build/glibc-bfm8X4/glibc-2.23/elf/dl-fini.c 
Source language is c. 
Producer is GNU C11 5.4.0 20160609 -mno-mmx -mtune=generic -march=x86-64 -g -O2 -O3 -std=gnu11 -fgnu89-inline -fno-stack-protector -fmerge-all-constants -frounding-math -fPIC -ftls-model=initial-exec. 
Compiled with DWARF 2 debugging format. 
Does not include preprocessor macro info. 

내가 지시 컴파일 디렉토리와 소스 파일의 위치를 ​​찾을 수 없습니다입니다.

디렉토리 /build/glibc-bfm8X4/glibc-2.23/elf가 존재하지 않습니다. 누구나 이런 상황에 대해 알고 있습니까?

미리 감사드립니다.

답변

3

이것은 glibc이 컴파일 된 컴퓨터의 디렉토리입니다. 우리 기계에는 존재하지 않습니다.

디버그 기호가 설치되도록 을 사용하여 관련된 패키지의 -dbg 버전을 설치하십시오 (sudo apt-get install 사용). 현재 소스 파일을 현재 디렉토리에 다운로드하려면 라이브러리의 소스 코드 (apt-get source 사용)를 가져옵니다.

  • 목록 모든 패키지 : 패키지에
  • 목록 파일 dpkg -l (특정 패키지 이름에 대한 목록에서 할 수있는 다음 grep)

    glibc 위해 그것은 sudo apt-get install libc6-dbgapt-get source libc6

    유용한 명령입니다 : dpkg -L <package name>

  • 해당 파일이 속한 패키지를 검색하십시오. dpkg -S <file path>

~/.gdbinit에있는 directory <path to source dir> 선언을 사용하여 gdb가 소스 코드가있는 올바른 디렉토리를 가리 키도록하십시오.

또한 valgrindrr 유틸리티를 사용해보십시오.