2013-03-09 6 views
1

디버깅에 도움이되는 자체 프로세스 덤프를 작성하려면 응용 프로그램 (.NET Framework 4.0 용으로 컴파일 된 VB.NET)을 가져 오려고합니다. 이를 위해 저는 Sysinternals에서 Procdump를 사용하고 있습니다.응용 프로그램 내에서 procdump를 실행하여 응용 프로그램 자체를 덤프로 만듭니다.

Dim p As New Process 
p.StartInfo.FileName = "C:\procdump.exe" 
p.StartInfo.Arguments = "-accepteula -ma " & Process.GetCurrentProcess.Id 
p.Start() 
p.WaitForExit() 
p.Dispose()  ' Breakpoint 

마지막 줄에도 중단 점입니다 :

가 시작하려면 단순히 클릭 이벤트에 다음 코드를 실행 (그래서 호출 스택에 대한 인식 무언가가 있어야한다).

덤프를 만들려면 VS 2010에서 디버그 모드로 응용 프로그램을 시작하고 버튼을 클릭하여이 코드를 실행하십시오. 중단 점에 도달하면 덤프가 작성되었음을 알 수 있습니다. 이 시점에서 Visual Studio (Debug -> Save Dump As ..)를 사용하여 또 다른 덤프 파일을 생성합니다.

이렇게하면 Procdump.exe로 만든 크기와 Visual Studio에서 만든 크기가 거의 같은 두 개의 덤프 파일 (400 Mb)을 볼 수 있습니다. 빌드 된 코드를 건드리지 않고도 덤프 파일을 열었습니다 (빌드 된 코드가 열려 있고 Ctrl + O를 누름). 심볼 폴더 옵션에 디버그 출력 폴더를 지정합니다.

Visual Studio에서 만든 덤프에서 "Debug with mixed"를 클릭하면 인식 가능한 메서드 이름이있는 호출 스택이 생기고 디버거는 소스 코드의 위치에 멋지게 배치합니다 중단 점이 있던 곳.

그러나 Procdump에서 만든 덤프에서 "Debug with mixed"를 클릭하면 호출 스택 (주 스레드)에 clr.dll! 6cb34e46(), KERNELBASE.dll! 75106a8e()와 같은 내용 만 포함됩니다. ntdll.dll! 76f07094() 맨 위. 눈에 띄는 코드는 없으며 시계와 관련이 없습니다.

왜 그렇습니까? 사실,이 두 덤프가 거의 같을 것으로 기대하고있었습니다 (몇 줄의 코드 만 제외). [디버거가 연결되어 있어야합니다. 아래 수정을 참조하십시오.]

심볼은 두 경우 모두 올바르게로드되었습니다. 디버그 -> Windows -> 모듈에서 얻은 목록은 두 덤프 모두에로드 할 동일한 심볼을 보여줍니다. 또한 두 덤프에서 백그라운드 스레드로 전환하면 두 덤프에서 이들에 대한 올바른 호출 스택을 얻습니다 (변수 값 등).

EDIT I 결합 디버거 않고 응용 프로그램을 실행함으로써, I는 (1 행, 즉, 비주얼 스튜디오에서 촬영 된 것과 동일하지만, 해제) 예상 프로세스 덤프를 얻을 것으로 확인

. 문제 해결됨. 그러나 나는 왜 내가 디버거가 첨부 된 결과를 얻지 못했는지 궁금하다.

답변

1

procdump 자체는 디버거입니다. 현재 디버깅중인 프로세스를 덤프하도록 요청하는 것이므로 덤프 파일의 차이점입니다.