1

상황입니다 :도움말 postmorten 디버깅 Win32 응용 프로그램 여기

배경

나는 혼합 모드 .NET/네이티브 응용 프로그램을 Visual Studio에서 개발 한 내 말은 무엇 2008 년

혼합 모드는 프런트 엔드가 C++ .NET으로 작성되어 네이티브 C++ 라이브러리를 호출한다는 것입니다. 네이티브 코드는 새로운 스레드를 필요에 따라 시작하는 등 응용 프로그램에서 대부분의 작업을 수행합니다. .NET 코드는 UI 용도로만 사용할 수 있습니다 (양식 획득).

테스터의 컴퓨터에서 실행중인 응용 프로그램의 릴리스 빌드가 있습니다.

기본 라이브러리는 완전한 최적화로 컴파일되었지만 디버깅이 가능하도록 컴파일되었습니다 ("디버그 정보 형식"이 "프로그램 데이터베이스"로 설정 됨).

이것이 의미하는 바는 PDB 파일의 응용 프로그램에 대한 디버깅 기호가 있음을 의미합니다.

문제

어쨌든, 테스터 중 하나는 가끔 XP에 충돌 응용 프로그램에 문제가있다. 나는 왓슨 박사를 여러 번 사용하여 충돌 사고의 미니 덤프를 얻을 수있었습니다.

미니 덤프를 사용하여 디버깅 할 때 (실제 앱을 실제로 디버깅하지는 않음) 모든 디버깅 기호가 올바르게로드됩니다. 모든 원시 스레드의 전체 스택 추적을 올바르게 볼 수 있습니다. 다른 스레드 (아마도 .NET 스레드)는 스택 추적을 가지고 있지 않지만, 적어도 스레드가 시작된 dll (즉, ntdll.dll)을 보여줍니다. 내가 스레드에 갈 때 유용 아무것도 표시되지 않습니다

.

그것은 제대로 (액세스 위반 읽기 위치를 0x00000000 :가 0xc0000005 (5) 된 .dmp 사용자의 0x0563d652에서 "처리되지 않은 예외) 실패 스레드를보고합니다. 스택 추적에는 메모리 주소가 "0563d652()"(심지어 "ntldll.dll"이 아님) 인 단일 항목이 있습니다.

dissasembly에 들어가면 약 30 개의 명령어가 무작위로 표시됩니다. 메모리 주소의 양쪽은 그냥 "???"입니다. 내 소스 코드의 일부가 아닌 것처럼 보입니다. (바이너리가 메모리에 순차적으로로드되지 않습니까? 미 아무데도 안 되니?).

내 질문에

은 그래서 기본적으로 내 질문 threfold된다.

1) 누구든지 디버거의 정보 부족을 설명 할 수 있습니까? 마음에 베어링

2), 나는 나를이 현재의 문제를 진단하기 위해 다른 작업을 수행 할 수) 사람이 실패

3에 대한 이유를 제안 할 수 있습니다, 오류가 내 코드에서 발생 표시 할 수 없습니다 미래?

도움말!

업데이트 : 여기

# ChildEBP RetAddr 
WARNING: Frame IP not in any known module. Following frames may be wrong. 
00 099bf414 02d0e7fc 0x563d652 
01 00000000 00000000 0x2d0e7fc 

이상한 허 WinDBG로

에서 실패한 스레드에 대한 스택 덤프는? 심지어 DLL을 표시하지 않습니다.

스택/힙이 손상되어 스레드가 손상된 것일 수 있습니다 ...?

답변

3

WinDbg를 사용하고 있습니까? 그렇다면 파업 연장의 아들을 사용하고 있습니까?

Bugslayer: Son-of-Strike

- 또는

Drill Into .NET Framework Internals to See How the CLR Creates Runtime Objects ?

+0

아니요, Visual Studio 2008 통합 디버거를 사용하십시오. 나는 WinDbg를 시도해 보겠다 - 좋은 제안, 고마워. – John

+0

WinDBG와 동일한 결과가 나타납니다. SOS의 경우 미니 덤프 대신 전체 덤프를 사용하는 것이 좋습니다. 내가 덤프를 시도해 볼 수 있는지 알 겠어. – John

+0

글쎄, 미니 덤프는 어떤 의미에서 풀 덤프가 될 수도 있습니다 - 생성 된 옵션에 달려 있습니다. 게다가, windbg를 사용하는 것은 항상 좋은 생각입니다 o) – deemok

1

MSVC2K5 SP1에서 코드 버그가 침묵하고있는 곳과 비슷한 문제가 발생했지만 MSVC2K5 SP2 런타임을 설치 한 경우 유효한 코드를 가리 키지 않은 오류가 발생했습니다.

코드의 데이터 실행을 시작할 때 무엇이든 할 수 있으므로 유효한 스택 추적으로 돌아갈 수 없기 때문에 충돌 위치가 쓸모 없게됩니다.

새 .Net 런타임 설치가 SxS 디렉토리에 최신 버전의 MSVC C++ 런타임을 설치했을 때 이러한 일이 발생했습니다.

결국이 문제를 해결하기위한 방법은 충돌을 자주 발생시키고 필요한만큼 로깅을 추가하여 지역화하는 것입니다.

+0

좋은 제안 - 나는 VC2008 SP1 재검토가있는 반면에 시험 기계에는 VC2008 (SP가 아님)이 있다고 의심됩니다. 기계를 업그레이드하여 도움이되는지 확인하십시오. – John

1

일단 windbg를 가져 와서 덤프 파일을 열면 오류가있는 스레드 스택을 게시 할 수 있습니까? 우리가 거기에서 시작할 수 있습니다.

+0

매우 친절한 제안 - 업데이트 된 질문을 참조하십시오. – John

+1

글쎄,별로 스택에서. 기호 (개인 및 공공 시스템 모두)를 수정 했습니까? 레지스터의 상태는 무엇입니까 (windbg의 'r')? 유효한 코드를 가리 키지 않습니까? (windbg에서 'u eip')? – deemok

0

EIP가 손상되었습니다. ESP를 유효 가정
, 당신은 호출 스택을 볼 수 있습니다, 단지 형 :
DDS는 ESP [입력]
DDS는 [입력]

또한 메모리 창을 사용할 수 있습니다에
설정 주소 : ESP
형식을 설정하십시오. 포인터 & 기호