| Autor |
Nachricht |
|
| Simson |
Verfasst am: 11 Feb 2011 21:36 |
|
|
|
Anmeldungsdatum: 23.10.2007
Beiträge: 55
|
| Wenn ich LinkedList.kg nach MIPS übersetze und dann JUnit mit SPIM starte, passiert einfach gar nichts mehr. Alle anderen Testfälle laufen fehlerfrei durch. Für LinkedList gibt es auch keinen Fehler, er stoppt nur einfach nicht =/ Ne Idee? |
|
|
| Nach oben |
|
| konrada |
Verfasst am: 13 Feb 2011 20:15 |
|
|
|
Anmeldungsdatum: 19.10.2009
Beiträge: 160
Wohnort: Freiburg
|
| Starte mal den Testfall im Debugger und unterbrech ihn, wenn er hängt (über die View, die man in der Debug-Perspektive links oben hat) |
|
|
| Nach oben |
|
| Simson |
Verfasst am: 14 Feb 2011 19:00 |
|
|
|
Anmeldungsdatum: 23.10.2007
Beiträge: 55
|
Hm, hab leider grad nur ein Win-System zu Hand und da bekomm ich das nicht zum Laufen.
Aber qtSpim sagt mir:Code: Exception occurred at PC=0x00400220
Bad address in data/stack read: 0x00000000
Das seh ich ein.
Anscheinend passiert das hierbei:Code: [80000180] 0001d821 addu $27,$0,$1
; 90: move $k1 $at # Save $at
Der Code steht unter "Kernel Text Segment [80000000]..[80010000]". Aber ehrlich gesagt, versteh ich eh nicht so ganz, was das guiDing mit meinem Code anstellt... Vermutlich nicht besonders hilfreich =)
Edit: Was mich auch verwundert ist, dass das Programm wohl nicht immer an der gleichen Stelle crasht. Jedenfalls kommt Spim bei verschiedenen Durchläufen mit der Ausgabe der LinkedList Ergebnisse unterschiedlich weit... |
|
|
| Nach oben |
|
| konrada |
Verfasst am: 15 Feb 2011 7:55 |
|
|
|
Anmeldungsdatum: 19.10.2009
Beiträge: 160
Wohnort: Freiburg
|
| Kannst Du mal ein crashendes MIPS-Programm posten? |
|
|
| Nach oben |
|
| Simson |
Verfasst am: 15 Feb 2011 10:38 |
|
|
|
Anmeldungsdatum: 23.10.2007
Beiträge: 55
|
|
| Nach oben |
|
| konrada |
Verfasst am: 15 Feb 2011 10:52 |
|
|
|
Anmeldungsdatum: 19.10.2009
Beiträge: 160
Wohnort: Freiburg
|
Au, lang. Hast Du ein kleineres Beispiel, das crasht?
Kurzdiagnose: nach etwa 4210 Instruktionen (Spim-Kommando "s 4210") wird in Zeile 1102 "lw $t1, 0($t0)" ausgefuehrt, waehrend $t0 eine 0 enthaelt. Die 0 ist irgendein Returnwert aus dem v0-Register der Proc, die in Zeile 519 returnt. |
|
|
| Nach oben |
|
| konrada |
Verfasst am: 15 Feb 2011 10:57 |
|
|
|
Anmeldungsdatum: 19.10.2009
Beiträge: 160
Wohnort: Freiburg
|
Und
im Proc-Prolog ist gefaehrlich: es kann jederzeit ein Interrupt kommen und ein paar Words auf den Stack pushen, dann ist in -8($sp) ploetzlich Dreck drin. |
|
|
| Nach oben |
|
| Simson |
Verfasst am: 15 Feb 2011 15:05 |
|
|
|
Anmeldungsdatum: 23.10.2007
Beiträge: 55
|
Danke schonmal für die Hinweise. Leider habe ich kein kleineres Programm, das crasht - es ist überhaupt das einzige, das nicht funktioniert.
konrada hat folgendes geschrieben:: Starte mal den Testfall im Debugger und unterbrech ihn, wenn er hängt (über die View, die man in der Debug-Perspektive links oben hat)
Hm, was genau meinst Du? Ich habe den Test jetzt im Debugmode gestartet. Wenn er hängt steht in der View links oben:
Code: KangaToMips [JUnit]
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner at localhost:49764
Thread [main] (Running)
Thread [ReaderThread] (Running)
Daemon Thread [process reaper] (Running)
/usr/local/soylatte16-i386-1.0.3/bin/java (15.02.2011 13:58:05)
Aber das ist ja nicht besonders hilfreich, oder?
Edit: Wenn ich 'suspend' mache sehe ich das hier:Code: KangaToMips [JUnit]
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner at localhost:49820 (Suspended)
Daemon System Thread [Signal Dispatcher] (Suspended)
Daemon System Thread [Finalizer] (Suspended)
Daemon System Thread [Reference Handler] (Suspended)
Thread [main] (Suspended)
Thread [ReaderThread] (Suspended)
Daemon Thread [process reaper] (Suspended)
/usr/local/soylatte16-i386-1.0.3/bin/java (15.02.2011 14:06:34)
|
Zuletzt bearbeitet von Simson am 15 Feb 2011 15:07, insgesamt ein Mal bearbeitet |
|
| Nach oben |
|
| konrada |
Verfasst am: 15 Feb 2011 15:07 |
|
|
|
Anmeldungsdatum: 19.10.2009
Beiträge: 160
Wohnort: Freiburg
|
| Die Geschichte mit dem Debugger hab ich unter der Annahme geschrieben, dass Spim bei Dir nicht korrekt gestartet wird (so hatte ich Deine Problembeschreibung aufgefasst). Das, was Du danach geschrieben hast, deutet darauf hin, dass Spim zwar korrekt gestartet wird, aber der Assemblercode irgendwo einen logischen Fehler enthaelt. |
|
|
| Nach oben |
|
| Simson |
Verfasst am: 15 Feb 2011 15:08 |
|
|
|
Anmeldungsdatum: 23.10.2007
Beiträge: 55
|
| Nachdem ich es jetzt mit spim unter linux, mac und windows getestet habe glaube ich das auch =) |
|
|
| Nach oben |
|
| Simson |
Verfasst am: 15 Feb 2011 15:24 |
|
|
|
Anmeldungsdatum: 23.10.2007
Beiträge: 55
|
|
| Nach oben |
|
| konrada |
Verfasst am: 15 Feb 2011 15:38 |
|
|
|
Anmeldungsdatum: 19.10.2009
Beiträge: 160
Wohnort: Freiburg
|
| Zeile 42 und 43: da werden Stack-frame-Daten mal mit $sp, mal mit $fp adressiert. Ob das Absicht ist, kann ich nicht erkennen. Ich empfehle dringend, Zugriffe auf Adressen im Stackframe alle mit $fp-relativen Adressangaben durchzufuehren. Sonst verwirrend und fehlertraechtig. |
|
|
| Nach oben |
|
| Simson |
Verfasst am: 15 Feb 2011 15:55 |
|
|
|
Anmeldungsdatum: 23.10.2007
Beiträge: 55
|
| Super, das wars. Danke! Ist natürlich keine Absicht... War ein klassischer c&p Fehler =/ |
|
|
| Nach oben |
|
| Simon2 |
Verfasst am: 15 Feb 2011 21:49 |
|
|
|
Anmeldungsdatum: 07.01.2011
Beiträge: 11
|
konrada hat folgendes geschrieben:: Und
im Proc-Prolog ist gefaehrlich: es kann jederzeit ein Interrupt kommen und ein paar Words auf den Stack pushen, dann ist in -8($sp) ploetzlich Dreck drin.
Was heißt das jetzt genau? Ich hab das auch so gemacht, und in den Beispielen von UCLA finden sich auch negative Offsets vorm $sp... Simuliert spim solche Interrupts? Ich habe das nämlich auch so und hielt das bis eben für unproblematisch. Ich hatte nämlich total die tolle Idee für mein Stack Layout, welche etwas von der Norm abweicht. |
|
|
| Nach oben |
|
| konrada |
Verfasst am: 16 Feb 2011 9:44 |
|
|
|
Anmeldungsdatum: 19.10.2009
Beiträge: 160
Wohnort: Freiburg
|
Wenn kein Interrupt kommt, kann man auch nach -8($sp) speichern. Bei uns kommen keine Interrupts. So gesehen ist es ungefährlich.
Aber wenn Ihr mal nen richtigen Compiler schreibt, fangt Ihr Euch nichtdeterministisch kaputtgehende Spills ein, graesslich. |
|
|
| Nach oben |
|
|
|