Forum: PC-Programmierung Fehler-Offset (Windows)


von Walter T. (nicolas)


Lesenswert?

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?

von Oliver S. (oliverso)


Lesenswert?

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
von Walter T. (nicolas)


Lesenswert?

Danke für den Link!

von udok (Gast)


Lesenswert?

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.

von Jim M. (turboj)


Lesenswert?

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.

von realist (Gast)


Lesenswert?

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

von Walter T. (nicolas)


Lesenswert?

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.)

von udok (Gast)


Lesenswert?

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?

von Walter T. (nicolas)


Lesenswert?

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.

von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

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.

von Rolf M. (rmagnus)


Lesenswert?

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)

von Walter T. (nicolas)


Lesenswert?

Ben B. schrieb:
> Tangens 90° löst glaube ich auch eine division by zero aus

tanf() ist da sicher.

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
Noch kein Account? Hier anmelden.