문제
Adplus 또는 Debugdiag로 충돌 덤프 파일을 생성하는 방법을 알고 있지만 이러한 도구를 설치하지 않고 고객의 컴퓨터 에서이 작업을 수행 할 수있는 방법이 있는지 궁금합니다. 구체적으로는 응용 프로그램을 구성 할 수 있습니다 ( 예를 들어 레지스트리 값을 사용하여 임계 실패의 경우 충돌 덤프를 생성합니다. 보다 구체적으로, 나는 c# 응용 프로그램에서 이것을 할 수 있어야하지만 필요한 경우 p/insing을 신경 쓰지 않습니다. 감사!
해결책
"실패한"프로세스 (또는 스레드) 자체 내부에서 미니 덤프를 만드는 것은 사소하거나 정확하지 않을 수 있습니다 (또한 MinidumpWritedump 기능의 발언).
게다가, 당신의 과정이 당신이 충돌 덤프를 쓸 필요가있는 분노에 있다면, 전체 상황은 일반적으로 너무 호스이어서 충돌 덤프를 만들려고 시도하더라도 또 다른 충돌을 일으킬 수 있습니다 (그러나 그와 같은 상황은 옆으로 - 심지어는 그 일 수도 있습니다. 현재 프로세스 내에서 "잡기"가 더 어렵다).
클라이언트 시스템에 별도의 애플리케이션을 설치할 수없는 경우 "최상의"작업은 외부 프로세스를 시작하는 것입니다 (중요한 상황에서도 실패 할 수 있음). John Robbins의 SuperAssert.net). 외부 바이너리를 앱 리소스에 넣고 시작시 (중요한 장착의 고장을 최소화하기 위해) 디스크 (감히)로 추출 할 수도 있습니다.
다른 팁
다음 레지스트리 스크립트를 사용하여 특정 디렉토리에서 충돌 덤프를 만들기 위해 WER (Windows Error Reporting)을 구성 할 수 있습니다.
Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps] "DumpFolder"="C:\\Dumps" "DumpCount"=dword:00000064 "DumpType"=dword:00000002 "CustomDumpFlags"=dword:00000000
덤프는 충돌 한 프로세스의 이름을 반영하는 이름으로 C : 덤프로 들어갑니다. Dumptype = 2는 전체 메모리 덤프를 제공합니다. Dumptype = 1은 미니 덤프를 제공합니다. 64 개의 비트 머신에서는 WOW32 노드에이를 넣을 필요가 없습니다. WER는 위에 지정된 비직 레지스트리 키 만 사용합니다.
충돌 유형에 따라이 방법은 작동하지 않을 수 있습니다. 나는 왜 그런 충돌 유형이 잡히지 않는지 또는 어떤 충돌 유형을 찾지 못했습니다. 누구나?
당신의 앱이 호드라면 미니 덤프 파일을 만들 때 촬영할 수 있다고 생각합니다. 최악의 상황은 무엇입니까? 어쨌든 그렇게하고 있으므로 시도해 볼 수도 있습니다.
코드 무효가 언급 한 MSDN 포럼 꽤 견고 해 보입니다. vb.net 버전이 필요 했으므로 여기에 필요한 사람을위한 VB 버전이 있습니다.
Friend Class MiniDump
'Code converted from C# code found here: http://social.msdn.microsoft.com/Forums/en-US/clr/thread/6c8d3529-a493-49b9-93d7-07a3a2d715dc
Private Enum MINIDUMP_TYPE
MiniDumpNormal = 0
MiniDumpWithDataSegs = 1
MiniDumpWithFullMemory = 2
MiniDumpWithHandleData = 4
MiniDumpFilterMemory = 8
MiniDumpScanMemory = 10
MiniDumpWithUnloadedModules = 20
MiniDumpWithIndirectlyReferencedMemory = 40
MiniDumpFilterModulePaths = 80
MiniDumpWithProcessThreadData = 100
MiniDumpWithPrivateReadWriteMemory = 200
MiniDumpWithoutOptionalData = 400
MiniDumpWithFullMemoryInfo = 800
MiniDumpWithThreadInfo = 1000
MiniDumpWithCodeSegs = 2000
End Enum
<Runtime.InteropServices.DllImport("dbghelp.dll")> _
Private Shared Function MiniDumpWriteDump( _
ByVal hProcess As IntPtr, _
ByVal ProcessId As Int32, _
ByVal hFile As IntPtr, _
ByVal DumpType As MINIDUMP_TYPE, _
ByVal ExceptionParam As IntPtr, _
ByVal UserStreamParam As IntPtr, _
ByVal CallackParam As IntPtr) As Boolean
End Function
Friend Shared Sub MiniDumpToFile(ByVal fileToDump As String)
Dim fsToDump As IO.FileStream = Nothing
If (IO.File.Exists(fileToDump)) Then
fsToDump = IO.File.Open(fileToDump, IO.FileMode.Append)
Else
fsToDump = IO.File.Create(fileToDump)
End If
Dim thisProcess As Process = Process.GetCurrentProcess()
MiniDumpWriteDump(thisProcess.Handle, _
thisProcess.Id, _
fsToDump.SafeFileHandle.DangerousGetHandle(), _
MINIDUMP_TYPE.MiniDumpNormal, _
IntPtr.Zero, _
IntPtr.Zero, _
IntPtr.Zero)
fsToDump.Close()
End Sub
End Class
통화를 견고하게 처리 해야하는지 확인하면 비교적 안전해야합니다.
당신은 p/호출 할 수 있습니다 dbghelp.dll
'에스 MiniDumpWriteDump
기능 AppDomain.UnhandledException
이벤트.
이 경우 .NET 예외 데이터의 로그를 버리고 파일에 미니 덤프를 작성할 수 있습니다.
또한 a MSDN 포럼에 실 P/Invoke 서명 및 적절한 사용법을 설명합니다.
어떤 종류의 정보가 필요한지에 따라 처리기를 추가 할 수 있습니다. AppDomain.UnhandledException
이벤트? (정확히 당신이 찾고있는 것이 아니라는 것을 알고 있지만 클라이언트 기계에서 확실히 사용할 수 있습니다.)
log4net과 같은 로깅 프레임 워크를 사용하십니까? 일반적으로 릴리스의 디버그 레벨 메시지를 끄십시오. 그러나 특정 경우 (충돌과 같은)에만 파일에 로그인하는 특수 애착자를 작성하는 것에 대해 생각할 수 있습니다. 이 Appender는 처음에는 메모리 전용 Ringbuffer에 씁니다.이 링거퍼는 파일에 쓸 수 있으며 나중에 280Z28이 제안한 예외 핸들러에 의해 트리거됩니다.
전화해도됩니다 환경, 그것은 :
Failfast 메소드는 메시지 문자열을 Windows 응용 프로그램 이벤트 로그에 쓰고 응용 프로그램의 덤프를 생성 한 다음 현재 프로세스를 종료합니다. 메시지 문자열은 Microsoft에 오류보고에도 포함되어 있습니다.
다른 것들 사이.