2017-01-26 12 views
0

나는 windbg에서 새롭고 windows에서 메모리를 분석한다. x64 시스템의 메모리 덤프 (크래시 덤프)를 분석하려고합니다.일부 기호 경고가있는 경우 windbg analyze 결과를 사용할 수 있습니까?

는 모든 기호 (내와 마이크로 소프트) 를로드 한 후에 나는이 출력의 일부입니다 !analyze -v

입력 :

...... 
FAULTING_SOURCE_CODE: <some code here> 

SYMBOL_STACK_INDEX: 6 

SYMBOL_NAME: rtplogic!CSRTPStack::Finalize+19d 

FOLLOWUP_NAME: MachineOwner 

MODULE_NAME: RTPLogic 

IMAGE_NAME: RTPLogic.dll 

DEBUG_FLR_IMAGE_TIMESTAMP: 58542837 

STACK_COMMAND: ~544s; .ecxr ; kb 

FAILURE_BUCKET_ID: WRONG_SYMBOLS_c0000374_RTPLogic.dll!CSRTPStack::Finalize 

BUCKET_ID: X64_APPLICATION_FAULT_WRONG_SYMBOLS_rtplogic!CSRTPStack::Finalize+19d 
...... 

WRONG_SYMBOLS 나를 걱정.

FAULTING_SOURCE_CODE의 코드는 충돌과 관련된 코드 일 수 있습니까?

답변

2

아니요, 불행히도 당신은 그것을 믿을 수 없습니다. 디버거가 스택을 올바르게 푸는 경우 디버거가 100 % 확실하지 않은 콜 스택 분석에 적어도 한 가지 포인트가 있습니다.

~544s; .ecxr; k을 입력하면 호출 스택이 표시됩니다. 해당 호출 스택에는 불확실한 지점에서 경고가 포함됩니다. 이미 도움이 될 수있는 모든 것을 신뢰할 수 있지만 경고 아래의 스택 프레임을 신뢰할 수는 없습니다.

출력을 dps @ebp과 비교할 수 있습니다. 충분하지 않은 경우 L fff을 추가하면 디버거에서 추측 할 수있는 내용을 확인할 수 있습니다.

dps의 출력에서 ​​우연히 스택에 대한 계산 중 하나가 기호로 해석 될 수있는 값을 얻은 경우 완전히 관련없는 내용이 표시 될 수 있습니다.

2

c0000374STATUS_HEAP_CORRUPTION입니다. 일반 덤프를 보면 손상이 발생한 후에 만 ​​코드가 표시됩니다.

이 EXE에 대한 gflags.exe를 가진 Pageheap을 활성화

enter image description here

PageHeap Windows가 할당 이상으로 메모리에 액세스하려는 시도를 탐지하기 위해 각 할당의 경계에서 그 예비 메모리를 제공 할 수 있습니다. 이것은 응용 프로그램을 더 빨리 크래시 할 것이고 여기서 크래시의 실제 원인을 볼 수 있습니다. dmp를 열고 !analyze -v을 실행하여 손상된 부분을 확인합니다.

+0

소리가 들리는 지경입니다. 내가 이해하는 것처럼'gflags'는 이미 실행 된 프로세스의 일부 설정을 변경하는 도구입니다. 하지만 제 경우에는 메모리 덤프가 내 PC가 아니므로 문제가있는 원격 PC에 직접 액세스하지 않았습니다. 이 기능을 다른 방식으로 활성화 할 수 있습니까? 예를 들어, 컴파일하는 동안 디버그 플래그와 같은가? –

+0

앱이 충돌하는 PC에서이 설정을 활성화해야합니다. – magicandre1981

+0

@StepanLoginov : 전체 페이지 힙은 힙의 모든 단일 'int'에 대해 8kB의 메모리 (2 페이지, 데이터에 대해 1 개의 액세스 가능한 페이지 및 디버거를 트리거하는 1 개의 액세스 할 수없는 페이지)를 할당합니다. 따라서이 접근법은 4kB를 초과하는 누출만을 발견합니다. 나는 실제 문제가 발생하기 전에 모두 메모리 부족으로 고통 받기 때문에 32 비트 프로그램에서는 거의 작동하지 않는 것으로 나타났습니다. 64 비트 프로그램에서 잘 작동 할 수 있습니다. –