2017-11-25 14 views
2

리눅스 시스템에서 실행되는 공유 라이브러리 (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"로 빌드됩니다.

+0

디버깅에 사용중인 것과 동일한 버전의 라이브러리에서 코어 덤프가 생성되었는지 여부를 확인하십시오. – duskwuff

+0

@ duskwuff, 네, 그렇습니다. 그것은 hlapi.so의 동일한 버전으로 우리는 고객에게 릴리스했습니다. –

답변

0

잠시 동안 질문을 조사한 결과 제 생각에는 GDB가 실행 파일없이 전역 변수를 구문 분석 할 수 있다고 생각합니다.

시험에서

, 다음과 같은 코드가 hlapi.cpp에 : 그것은 때문이다

static int hlapiInitialized = 0; 

void hlapiInit() 
{ 
    if (hlapiInitialized == 0) 
    { 
     // do something else 
    } 

    hlapiInitialized = 1; 
} 

은 objdump를 어셈블리 코드를 보여줍니다

00000000000009a2 <_Z9hlapiInitv>: 
9a2: 55      push %rbp 
9a3: 48 89 e5    mov %rsp,%rbp 
9a6: c7 05 98 06 20 00 01 movl $0x1,0x200698(%rip) # 201048 <_ZL16hlapiInitialized> 
9ad: 00 00 00 
9b0: 90      nop 
9b1: 5d      pop %rbp 
9b2: c3      retq 

응용 프로그램을 실행하는 동안, 나는 코어를 생성 그것을 덤프. GDB에서 solib 검색 경로를 지정하기 전에, 내가 얻을 : 검색 경로를 지정

(gdb) disas hlapiInit 
No symbol table is loaded. Use the "file" command. 

되면, 출력은 다음과 같습니다

(gdb) disas hlapiInit 
Dump of assembler code for function hlapiInit(): 
    0x00007ffff7bd59a2 <+0>: push %rbp 
    0x00007ffff7bd59a3 <+1>: mov %rsp,%rbp 
    0x00007ffff7bd59a6 <+4>: movl $0x1,0x200698(%rip)  # 0x7ffff7dd6048 <_ZL16hlapiInitialized> 
    0x00007ffff7bd59b0 <+14>: nop 
    0x00007ffff7bd59b1 <+15>: pop %rbp 
    0x00007ffff7bd59b2 <+16>: retq 
End of assembler dump. 

hlapi.so로부터의 출력을 비교 한 후 코어 파일의 경우 공유 라이브러리가 프로세스에로드되면 전역 변수의 주소가 재 할당되고 전역 변수의 주소가 명확하다는 것을 알 수 있습니다. 따라서 일단 공유 라이브러리의 심볼 정보를 가지고 있으면 gdb는 변수를 매핑 할 수 있습니다.