The memory could not be "written"
-
Hallo an alle,
ich habe gerade eine schwierige Mission zu erfüllen.
Ich bin auf der Ursache nach einem Programmabsturz. Dies tritt zwar sehr
selten auf, ist aber trotzdem ziehmlich ärgerlich.
Dummerweise kann ich den Fehler nicht provozieren, sondern es tritt nur
sporadisch in Langzeit- Tests auf. Und zwar mit folgender Windows Error Meldung:The instruction at "0x0040a1b0" referenced memory at "0x00761644". The memory
could not be "written"Nun meine Frage an euch, kann man anhand der Speicheradressen Rückschlüsse
ziehen an welcher Stelle im Programm das Prblem liegen könnte
Danke schonmal für jeden Hinweis oder linkGruß Ulli
PS: Wenn jmd nen guten Christallkugelverkäufer kennt, bitte auch melden
-
Ich würde einen Debugger benutzen - im Notfall halt beim Crash den Debugger attachen oder noch einen Schritt weiter... Schreibe einen Minidump beim Crash und führe so Post-Mortem Debugging durch.
Edit:
Hier gibt es sogar einen Thread zur Minidump Thematik: http://www.c-plusplus.net/forum/261827-full
-
Wenn das ein Vista oder Windows 7 Rechner ist (oder entsprechede Server Version), dann kann man im Falle des Crashes auch einen vollen Speicher Dump erzeugen lassen.
Den kann man gut Debuggen.http://blog.m-ri.de/index.php/2009/03/12/memory-dumps-on-the-fly/
http://blog.m-ri.de/index.php/2011/01/13/minidumps-ganz-einfach/
-
Vielen Dank euch beiden für die Tipps
Jetzt hab ich wenigstens mal nen neuen Ansatz.
Das muss ich mir mal anschauen, evtl. bringt
mich das ein Stück weiter.Gruß Ulli
-
Ist das dein eigenes Programm?
Wenn ja, dann übersetz das Programm neu auf deinem Entwickler-PC, und ändere danach nichts mehr an dem Verzeichnis in dem du übersetzt hast.Also wirklich nichts, nichtmal ein Leerzeichen in einem Kommentar - die Prüfsumme der Source-Files muss gleich bleiben. Und schon gar nicht nochmal kompilieren.
Zieh dir evtl. eine frische Working-Copy dafür in einem eigenen Verzeichnis.
Wenn das so kompilierte Programm dann crasht, und du einen Crash-Dump davon hast, dann kannst du diesen Dump im Debugger "starten", und siehst dann genau wo das Programm gecrasht ist. Also inklusive Callstack aller Threads und so. Evtl. sogar ein paar lokale Variablen.
Da es praktisch ist wenn man sowas ohne Vorbereitungen und neu Übersetzen machen kann, könnte es Sinn machen das gesamte Projektverzeichnis wo man eine Release-Version (bzw. Beta/Release-Candidate) baut irgendwo zu sichern. Idealerweise in ein Archiv verpackt - spart Platz und schützt vor Verwechslungen mit Working-Copies die modifiziert werden dürfen.
Dann hast du immer den exakten Source-Stand inklusive .exe und .pdb Files parat mit dem eine Version gebaut wurde, und kannst bei Bedarf Crash-Dumps aufmachen.Die "schönere" Lösung wäre nen eigenen Symbol-Server zu verwenden. Nur ist das ziemlich aufwendig und für kleinere Projekte fast sicher Overkill.
-
Hallo Hustbaer,
ja ist mein eigenes Programm ( bzw. mein geerbtes ).
Ich hab alle Sources usw. zur Verfügung. Daher klingt
dein Vorschlag schonmal ziehmlich gut. Danke für den Hinweis.Gruß Ulli