2011-03-01 4 views
2

좀 이해해 주시겠습니까? -GDB + 코어 파일 덤프

다음은 gdb에서 발췌 한 것입니다. 내 프로그램이 충돌 후, 나는 GDB의 바이너리 및 핵심 파일을 열어 명령 info frame 발행 :

(gdb) info frame 
Stack level 0, frame at 0xb75f7390: 
eip = 0x804877f in base::func() (testing.cpp:16); saved eip 0x804869a 
called by frame at 0xb75f73b0 
source language c++. 
Arglist at 0xb75f7388, args: this=0x0 
Locals at 0xb75f7388, Previous frame's sp is 0xb75f7390 
Saved registers: 
    ebp at 0xb75f7388, eip at 0xb75f738c 

"에서 지역 주민"선 "EBP", "EIP는"및 "이전 프레임의 SP가"무슨 소리를 ? 코어 파일을 분석하기 위해

+0

가능한 [GDB "정보 프레임"출력을 해석하는 방법?] (http : //stackoverflow.com/questions/5144727/how-to-interpret-gdb-info-frame-output) –

+0

정확한 http의 중복 : //stackoverflow.com/questions/5144727/how-to-interpret-gdb-info-frame-output. 같은 질문을 계속하는 이유는 무엇입니까? –

+3

그는 아마 더 많은 설명적인 대답을 얻으려고 노력하고있을 것입니다. 아마 모든 위키피디아 링크를 읽는 데 그 노력을 기울이기를 원하지 않았을 것입니다. – anio

답변

0

을 설명해주십시오, 실행 :

$ gdb를 실행의 핵심

gdb를 $의 BT - 역 추적

또는 gdb를 $의 FR 0 - 런타임에서 맨 프레임 stack gdb $ fr 1 & 이렇게하면 Seg 오류가 발생한 함수 호출 순서를 알 수 있습니다. 여기

, gdb를 $ 정보 프레임은 프레임에 대해 당신에게 정보를 제공하고 0

5

는 위키 백과 문서 Call stack에서이 그림은 도움이 될 수 Stack frame layout

GDB의 info frame 런타임에 프로그램에서 호출되는 함수에 해당 . 출력에서, 우리는 스택 프레임 레이아웃에 대한이를 추론 할 수 있습니다

  • 0xb75f7388을 : 4 바이트 여기에서 시작하는 옛 EBP에게 값, 0xb75f73a8를 저장합니다. base::func()
  • 0xb75f738c 기능 프롤로그에 밀려 제 값 : 4 바이트 여기서 시작은 반환 주소 0x804869a을 저장한다. base::func()에 내재 this 인수 을 0x00000000는 4 바이트 여기서부터 저장 : 이전 프레임
  • 0xb75f7390call 명령에 의해 푸시.

나는 라인에 의해 info frame 출력 라인을 설명 할 것이다 :

Stack level 0, frame at 0xb75f7390: 

스택 레벨 0이가 최신 프레임을 의미합니다. frame at 이후의 주소를 Canonical Frame Address (CFA)라고합니다. x86에서는 명령이 실행되기 전에 이전 프레임의 스택 포인터 (ESP)의 값으로 정의됩니다.

eip = 0x804877f in base::func() (testing.cpp:16); saved eip 0x804869a 

EIP는 x86 명령어 포인터이다. saved eip은 반송 주소입니다. 0x804869a이 포함 된 함수를 info symbol 0x804869a으로 찾으려면 함수 호출 내에서 base::func()을 가리켜 야합니다.

called by frame at 0xb75f73b0 

called by은 이전 프레임의 표준 프레임 주소를 보여줍니다. 스택 포인터가 두 프레임 사이에서 32 바이트 (0xb75f73b0 - 0xb75f7390 = 32)를 앞당겼 음을 알 수 있습니다.

source language c++. 

Arglist at 0xb75f7388, args: this=0x0 
Locals at 0xb75f7388, Previous frame's sp is 0xb75f7390 

x86 ABI는 스택에 인수를 전달합니다. base::func()에는 암시적인 this 인수가 하나만 있습니다. 0x0NULL이라는 증상이 있습니다. 참고로 ArglistLocals은 x86과 x86-64의 경우 항상 info frame에서 같은 값을 갖는 것으로 보입니다.

Saved registers: 
    ebp at 0xb75f7388, eip at 0xb75f738c 

Saved registers은 기능 입력시 저장된 레지스터를 반영합니다. 이전 레지스터 값이 스택에 저장된 위치를 나열합니다. EIP은 반송 주소이므로 0xb75f738c에 저장된 주소를 x/a 0xb75f738c으로 검사하면 0x804869a이됩니다. 프레임 역할을 EBP을 설정 base::func()의 매우 구걸에

push %ebp 
movl %esp, %ebp 

: EBP가 여기에 나열되어 있다는 사실은 코드가 아마 -fomit-frame-pointer 컴파일 및 표준 함수 프롤로그를 가지고되지 않았 음을 의미한다 바늘.

관련 문제