Domanda

Su una macchina del cliente (WinXP SP2) a cui non ho accesso, ho un Win32 EXE (non gestito C ++) che va in crash all'avvio. Credo che il modo migliore per risolvere questo è quello di ottenere una (mini) scaricare e analizzare in un secondo momento con WinDbg o simili.

Ora, io normalmente dire al cliente di installare strumenti di debug per Windows ed eseguire

cscript adplus.vbs -crash

Tuttavia, sembra che non è possibile utilizzare ADPlus per le applicazioni che si scontrano all'avvio ( http: //support.microsoft.com/kb/q286350/ dice che "non utilizzare ADPlus nelle seguenti situazioni: Se è necessario risolvere un programma o un processo che si chiude improvvisamente durante l'avvio"). Lo stesso articolo dice "processo in modalità uso dell'utilizzatore dump", ma non è riuscito a installare con successo.

Qualsiasi idea di come ottenere un dump di un processo che va in crash all'avvio su Win32?

È stato utile?

Soluzione

È possibile installare WinDBG sulla macchina client e quindi utilizzare " Immagine file Execution Options " e impostare WinDBG per aprire una volta che il processo è iniziato. Quindi eseguire il processo di crash e WinDBG si aprirà immediatamente. premi g (Go) e attendere che il processo in crash quindi digitare " .dump / mfh dumpFileName.dmp ". Ora avete file di dump che è possibile eseguire il debug.

Altri suggerimenti

In alternativa è possibile impostare il proprio quadro generazione discarica che crea automaticamente una discarica processo quando si incontra ogni eccezione non gestita. Ciò eviterebbe di dover installare client Windbg.

Usa SetUnhandledExceptionFilter Win32 API per registrare il gestore di eccezioni al livello di applicazione l'applicazione di avvio. La funzione di callback registrato viene chiamata ogni volta che si eccezione che non viene gestita. U può quindi creare il dump processo utilizzando MiniDumpWriteDump api da Dbghelp.dll.

Codice di esempio: -

LONG WINAPI My_UnhandledExceptionFilter(struct _EXCEPTION_POINTERS* ExceptionInfo)
{
    HANDLE hFile = CreateFile("FileName",
            GENERIC_WRITE,
            0,
            NULL,
            CREATE_ALWAYS,
            FILE_ATTRIBUTE_NORMAL,
            NULL);

    MINIDUMP_EXCEPTION_INFORMATION aMiniDumpInfo;
    aMiniDumpInfo.ThreadId = GetCurrentThreadId();
    aMiniDumpInfo.ExceptionPointers = ExceptionInfo;
    aMiniDumpInfo.ClientPointers = TRUE;

    MiniDumpWriteDump(GetCurrentProcess(),
            GetCurrentProcessId(),
            hFile,
            (MINIDUMP_TYPE) (MiniDumpWithFullMemory|MiniDumpWithHandleData),
            &aMiniDumpInfo,
            NULL,
            NULL);

    CloseHandle(hFile);

    return EXCEPTION_EXECUTE_HANDLER;
}


int main(int argc, char* argv[])
{
    SetUnhandledExceptionFilter(&My_UnhandledExceptionFilter);

    // User code throwing exception..

    return 0; 
}

NB: - Il filtro di eccezione registrato non viene chiamato quando si esegue il debug del processo. Quindi, durante il debug se si mette punto di interruzione nella funzione filtro di eccezione Non essere sorpreso se non ha colpito nemmeno dopo aver causato un'eccezione non gestita.

Ecco un bel modo per raccogliere Vista SP1 si blocca:

http://msdn.microsoft.com/ it-it / library / bb787181 (VS.85) aspx

Non c'è bisogno di installare nulla sul computer!

Installazione di strumenti di sviluppo su una macchina client sarebbe la mia ultima risorsa, devo ammettere che odio l'idea soprattutto dove ci sono alternative che lavorerà per voi.

Per prima iscriversi a Winqual . Potrai ora ottenere l'accesso ai crash dump e altro errore dai vostri clienti automaticamente. Se non ricordo che questo è un servizio gratuito, alcun motivo per non usarlo.

Dal Winqual probabilmente vorrà un po 'per il crash dump per arrivare a voi, ed è sempre bello essere un po' più reattivo per i clienti, soprattutto quando si va in crash dell'applicazione, utilizzare Dott. Watson . Se non ricordo male quando si verifica l'incidente, prima di fare clic nella finestra di dialogo è possibile eseguire drwatsn32 da Start-> Esegui o la riga di comando e il dottor Watson si aprirà. A questo punto chiudere la finestra di schianto genererà un file di dettagli di blocco. Se questo fallire, installare Dr Watson eseguendo con il -i il parametro sulla riga di comando.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top