문제

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에 오류보고에도 포함되어 있습니다.

다른 것들 사이.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top