리눅스 시스템에서 실행되는 공유 라이브러리 (hlapi.so)가 있습니다. 이 hlapi.so에는 많은 모듈이 있습니다 (저는 .c 파일을 의미합니다). 물론GDB는 실행 파일없이 xx.so에서 글로벌 데이터를 파싱 할 수 있습니까?
static int hlapiInitialized = FALSE;
static struct hlapi_data app_sp;
이 hlapi.c 모듈의 많은 다른 코드가 있습니다 : 그 중 하나는 다음과 같이 두 개의 글로벌 datas를 정의 hlapi.c로 지정됩니다. hlapi.so는 hlapi.so 기반의 자체 응용 프로그램 (appbasehlapi라는 이름)을 작성하는 고객에게 공개됩니다.
이제 코어 덤프가 있는데 고객이 파싱 한 백 트레이스를 통해 코드가 코어에 있음을 보여줍니다. 그러나 고객은 코어 덤프 파일 만 제공 할 수 있습니다. appbasehlapi 실행 파일은 우리와 공유되지 않습니다. 그래서 내 손에는 코어 덤프 파일 + hlapi.so 만 있습니다.
이 코어를 디버깅하기 위해, 나는 명령
gdb --core=mycoredumpfile
하여 코어 덤프 파일을로드 한 후 GDB에, 나는 hlapi.so 그렇게 들어있는 폴더를 지정
set solib-search-path .
를 사용 gdb는 hlapi.so에서 심볼을로드 할 수 있습니다. 그리고 난 다음을 사용합니다 :
print hlapiInitialized
print app_sp
우리 모듈의 전역 데이터를 구문 분석하려면 다음을 사용하십시오. 그러나 출력 값은 매우 비정상입니다.
gdb를 통해 실행 파일없이 hlapi.so에 정의 된 전역 데이터를 구문 분석 할 수 있다면 저의 질문은 여기에 있습니다. gdb를 통해 얻은 결과가 믿을 만하다면? 나는 모든 의견에 감사드립니다.
BTW, hlapi.so는 gcc 옵션 "-g -fPIC"로 빌드됩니다.
디버깅에 사용중인 것과 동일한 버전의 라이브러리에서 코어 덤프가 생성되었는지 여부를 확인하십시오. – duskwuff
@ duskwuff, 네, 그렇습니다. 그것은 hlapi.so의 동일한 버전으로 우리는 고객에게 릴리스했습니다. –