Hallo zusammen, ich habe ein (selbst geschriebenes) Windows-Programm, das ohne Fehlermeldung abstürzt. Der Fehlercode ist 0xc0000094 (Integer-Division durch Null) und einen Fehler-Offset liefert mir die Ereignisanzeige ebenfalls. Kann mir der Fehler-Offset irgendwie dabei weiterhelfen, die entsprechende Stelle im Quelltext/Map File/Disassembly zu finden?
Wenn du den Quelltext hast, lass das Programm im Debugger laufen, oder lass den Post-Mortem drauf los. Über den Offset kannst du die Stelle im Diassembly finden, aber ob die dich dann zur Stelle im Sourcecode führt, ist fraglich (falls nicht eh in Assembler geschrieben) https://stackoverflow.com/questions/1319234/analyzing-a-crash-in-windows-what-does-the-error-message-tell-us Oliver
:
Bearbeitet durch User
Mach dir eine map Datei (cl -FeMyProg.exe *.obj -link -map). In der Map Datei siehst du die Addressen aller Funktionen, relativ zur Program Startaddresse (__ImageBase). Damit kennst du schon mal die Funktion mit der Division durch 0. Dann machst du dir ein Disassembly (mit dumpbin -disasm oder mit objdump). Damit weisst du den Assemblerbefehl, der die Division durch 0 verursacht hat. Beachte, dass Windows das Program heutzutage an einer zufälligen Addresse startet. Den Offset zu den Werten im Map File musst du daher rausrechnen. Wenn das ganze reproduzierbar auftritt, hast du es leichter. Einfach im Debugger ausführen, und warten bis es passiert.
Früher(tm) hatte man dafür das addr2line tool. Bei modernen Compilern/debuggern ist sowas in die IDE integriert. Division durch Null kann man aber auch mit Lesen des Source Code finden.
udok schrieb: > (cl -FeMyProg.exe *.obj -link -map) Und wenn sein Pascal-Compiler diese Zeile nicht frisst? ;-) Zugegeben, das war etwas provokant, aber man sollte nicht davon ausgehen, daß ALLE Programmierer nur C verwenden (es gibt auch andere Sprachen)... Nichts für ungut
Danke für die weitere Beschreibung. Den konkreten Fehler habe ich gefunden. (Allerdings auf die traditionelle Art - Subversion-Stand mit letzter Woche verglichen und alle neuen Divisionen mit Assertions garniert.)
Jim M. schrieb: > Früher(tm) hatte man dafür das addr2line tool. Unter Windows kenne ich das nicht? > Bei modernen Compilern/debuggern ist sowas in die IDE integriert. Ja, aber das nützt dir nichts, wenn der Fehler beim Anwender auftritt... > Division durch Null kann man aber auch mit Lesen des Source Code finden. grep 'Division durch Null'`*.cpp, oder wie meinst du das konkret?
udok schrieb: > grep 'Division durch Null'`*.cpp, oder wie meinst du das konkret? Die einzige Chance, die ich mir da vorstellen kann, wäre nach allen / und % zu suchen.
Tangens 90° löst glaube ich auch eine division by zero aus, da gibts so einige Möglichkeiten, sich ins Bein zu schießen. Mit Assembler wäre die Fehlersuche deutlich einfacher, da passt alles mit dem Offset.
Ben B. schrieb: > Tangens 90° löst glaube ich auch eine division by zero aus, Ein Tangens für Integer? Walter T. schrieb: > Der Fehlercode ist 0xc0000094 (Integer-Division durch Null)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.