어떻게 앞에 추가 디렉토리에 라이브러리 경로를 적재할 때 core 파일에서 리눅스에서는 gdb
문제
나는 코어 파일이 생성되는 원격 시스템에서는 직접 액세스할 수 없습니다.또한이 지역의 사본은 라이브러리 파일을 원격에서 시스템의 실행 파일을 충돌 프로그램입니다.
고 싶 분석이 핵심에서 덤프 gdb.
예를 들어:
gdb path/to/executable path/to/corefile
내 라이브러리는 현재 디렉토리에 있습니다.
과거에는 본 디버거를 구현하이 제공하여"옵션이다"또는"-p/=.";그래서 제 질문은:
는 방법을 지정할 수 있는 라이브러리로드를 처음부터 상대적인 경로로는 나의 현재 디렉토리면 분석 corefile 에 gdb?
해결책
시작 gdb 를 지정하지 않고 실행 또는 코어 파일,다음과 같은 명령을 입력하십시오:
set solib-absolute-prefix ./usr
file path/to/executable
core-file path/to/corefile
당신이 필요가 있는지 확인하는 거울이 당신의 라이브러리 경로에서 정확하게 타겟 시스템입니다.위의 의미한 디버깅을 위한 목표와 일치하지 않는 호스트하는 이유는,그것의 중요한 복제의 루트 파일 시스템을 포함하는 구조의 라이브러리입니다.
면 디버깅을 원격 서버에 동일한 건물과 리눅스/glibc 버전으로 귀하의 호스팅,당신은 할 수 있습니다 fd 제안:
set solib-search-path <path>
하려고 하는 경우 재정의 라이브러리의 일부이지만,모든 복사 할 수 있습니다 대상 라이브러리의 디렉토리 구조로 임시 배치 및 사용 solib-absolute-prefix
솔루션 설명한다.
다른 팁
나는 확실하지 않다 이것이 가능한 모든 내 gdb 그러나 나는 아무 전문가입니다.
그러나 내가에 댓글을 달 수 있습니다 Linux 동적 링커.다음과 같은 인쇄의 경로를 모두 해결하 공유 라이브러리 및 해결되지 않은 것들입니다.
ldd path/to/executable
우리는 방법을 알아야 공유 라이브러리에 연결되어 있었으로 귀하의 실행 파일을 실행합니다.이렇게 하려면 다음 명령어를 사용합니다.
readelf -d path/to/executable | grep RPATH
해야의 명령을 인쇄 아무것도,동적 링커가 사용하여 기준 위치를 더한 환경변수 LD_LIBRARY_PATH 을 찾기 위해 공유 라이브러리입니다.
면 명령 출력 라인,동적 링커를 무시 LD_LIBRARY_PATH 사용 하드 코딩된 rpaths 대신 합니다.
는 경우 나열 rpaths 은 절대자,유일한 솔루션을 내가 알고있는 사본(또는 심볼릭 링크)라이브러리에 나열된 위치.
는 경우 나열 rpaths 은 상대적이,그들이 포함됩$원래는 대체될 것입니다에서 실행 시간의 경로를 실행 파일을 실행합니다.이동 중 하나는 실행 파일이나 라이브러리를 일치합니다.
추가 정보를 위해,당신은 시작할 수 있다:
man ld.so
이 발췌에 developer.apple.com
set solib-search-path path
이 변수를 설정한 경우에는,경로입니다 콜론으로 구분한 목록의 디렉토리 검색에 대한 공유 라이브러리입니다.
solib-search-path' is used after
solib-absolute-접두사'실패를 를 찾거나 라이브러리 경로를 라이브러리 대신 상대 절대적이다.을 사용하려는 경우solib-search-path' instead of
solib-absolute-접두사',야 set`solib-absolute-접두사'a 존재 디렉터리를 방지하 GDB 에서 발견에서 당신의 호스트의 라이브러리입니다.
편집:
나는 생각하지 않을 사용하여 위의 설정을 추가합 디렉토리를 추가했지만,그것은 보인다 추가하는,그래서 파일을 찾을 수 없에서 현재 시스템이 선택한 길을 내가 추가됩니다.나는 설정 solib-absolute-접두사가 가짜이며 추가하는 디렉토리에서 solib-검색-경로에서 순서 내가해야 할 수도 있습니다.전체 솔루션입니다.
할 수도 있습니다 설정 LD_PRELOAD 각각의 라이브러리 또는 LD_LIBRARY_PATH 현재 디렉터리를 호출할 때 gdb.이 경우 문제가 발생 gdb 자체를 사용하려고 어떤 라이브러리 당신은 미리로.
하나의 중요 사항:
만약 당신이 하고 있는 크로스 컴파일하려고 디버깅 gdb,다음
한 후에 당신 file ECECUTABLE_NAME
당신이 볼야.다음과 같:
Using host libthread_db library "/lib/libthread_db.so.1"
음이 있는지 여부를 확인 libthread_db 대상에 대한 시스템입니다.내가 찾는 많은 유사한 문제이다.이러한 문제를 해결할 수 없습니다만"을 사용하여 설정 solib-",당신을 구축 libthread_db 를 사용하여 당신의 크로스 컴파일러로습니다.