Domanda

Ho sviluppato un programma da un cliente che sta vivendo quando esegue una certa operazione.Questo non sta succedendo sempre nello stesso posto e sugli stessi dati e, inoltre, non sta succedendo né nella mia macchina per lo sviluppo locale né nella mia macchina virtuale di prova (che è priva di tutte le attrezzature in via di sviluppo).

Data queste condizioni, ho deciso di compilare con la mappa (abilitata nella configurazione delle proprietà-> Linkeer-> Debugger con opzione / mappa) per vedere quale funzione sta causando il crash.

Se ho capito correttamente, quando il programma si blocca di controllare l'errore offset e, quindi cercare nella mia mappa sotto la colonna RVA + Base:

     Address                         Publics by Value                                      Rva+Base       Lib:Object
 0001:00037af0       ?PersonalizzaPlancia@CDlgGestioneDatiProgetto@MosaicoDialogs@@IAEXXZ 00438af0 f   DlgGestioneDatiProgetto.obj
 0001:00038000       ?SalvaTemporanei@CDlgGestioneDatiProgetto@MosaicoDialogs@@IAEXXZ 00439000 f   DlgGestioneDatiProgetto.obj
.

In realtà, il mio incidente avviene in offset:

00038C90
quindi dovrei pensare che sia da qualche parte nel metodo:

MosaicoDialogs::CDlgGestioneDatiProgetto::PersonalizzaPlancia
.

Ma questo non è assolutamente possibile, quindi supponendo che il computer non possa essere sbagliato, sono quello che lo sta facendo male.

Qualcuno può spiegarmi come leggere la mappa in modo corretto?

È stato utile?

Soluzione

Lettura dei file della mappa per scoprire che la posizione di arresto anomalo è spiegata piacevolmente in questo articolo del progetto Articolo.

http://www.codeproject.COM / ARTICOLI / 3472 / Finding-Crash-Information-using-the-map-file

La speranza aiuta.

Altri suggerimenti

Non preoccuparti - invece, costruisci il progetto con i simboli abilitati e li strisce in un file PDB.

Modifica il programma un po ', per scrivere un minidoppio quando si blocca usando un Gestore di eccezione non gestito

Dare il programma appena compilato al cliente, e quando si blocca chiamare Minidumpwrikemponmp.

Chiedi al cliente di inviare questo file .dmp a te, e quindi è sufficiente caricarlo in Visual Studio (o Windbg) e corrisponderà ai simboli del programma e corrisponderà anche al codice. Dovresti essere in grado di vedere la linea esatta di codice e alcune delle variabili coinvolte. (Se si utilizza VS, quando si carica il file .DMP, l'angolo in alto a destra sarà un'opzione per "avviare il debug", fare clic su ciò come "avvia il debug" nel punto del crash)

Provalo prima localmente - Metti un div per zero errore da qualche parte nel tuo programma e vedi se è possibile eseguire il debug della discarica dopo che è stato eseguito. Si noti che è necessario mantenere lo stesso file di simboli identico per ogni build del tuo programma - corrispondono esattamente. Non puoi aspettarti un file di simboli per una build per abbinare un'altra build, anche se nulla è cambiato.

Ci sono tutorial per questo tipo di cosa, come questo Da CodeProject Sembra che descrive ciò che ti serve.

Per il debug di Postmortmem, c'è un'alternativa che non richiedeva l'uso di un file di mappa. Piuttosto, richiederebbe di creare un semplice script di registro per abilitare alcuni wer (segnalazione di errori di Windows) per intrappolare il file dump del crash. Innanzitutto, costruisci la tua applicazione con i simboli di debug. Quindi, segui le istruzioni per raccogliere Discarica di modalità utente . Fondamentalmente, si crea una chiave secondaria sotto il tasto "localdumps". Questa chiave secondaria deve essere il nome della tua applicazione, ad esempio "myapplication.exe". Quindi, crea i tasti "DumpCount", "DumpType" e "Dumpfolder". Avere l'utente eseguire lo script del registro. Questo consentirà di intrappolare la discarica localmente. Quindi, l'utente forza il crash per raccogliere il file di dump. L'utente può quindi inviare il file dump a voi a debug utilizzando i simboli che hai creato in precedenza. Infine, è necessario creare uno script di registro che rimuove i tasti / valori aggiunti al registro.

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