Dies ist eine alte Version des Dokuments!
The class StdStreams in the package ch.ntb.inf.deep.host defines three output streams.
For development assertions should be extensively used. Make sure that they are enabled in eclipse with -ea as argument for the VM.
Für ausführliche Debugausgaben während der Entwicklung und Fehlersuche wenden wir aus Effizienzgründen folgendes Verfahren an: Pro Klasse kann eine Konstante vom Typ boolean debug definiert werden. Wenn debug == true wird eine gewünschte Ausgabe auf den verbose-stream (StdStreams.vrb) geschrieben. Um Debugausgaben zu erhalten, muss also die Quelle editiert werden. Dafür wird im produktiven Einsatz bei ausgeschaltetem debug kein Code erzeugt.
Für die Fehler-Ausgabe sollte die Klasse ErrorReporter im Package ch.ntb.inf.deep.host verwendet werden. Bei jeder Ausgabe eines Fehlers wird die statische Variable nofErrors inkrementiert. Der Launcher überprüft vor jedem Schritt diese Variable und bricht nach einem Fehler ab.
Der ErrorReporter benötigt die Datei ErrorMsg.txt im rsc Ordner. In dieser Datei werden die Fehler-Nummern mit ihren Beschreibungen und möglichen Lösungen eingetragen.
Die Methoden error(int errNr) und error(int errNr, String additonalInfo) greifen auf ErrorMsg.txt zu. Die Methoden suchen in der Datei die übergebene Fehlernummer, und geben diese mit der Beschreibung und falls vorhanden mit den möglichen Lösungen aus. Die zusätzlichen Informationen, wie z.B. Datei- und Zeilennummerangaben, werden hinten angefügt.
Im Weitern gibt es noch die Methode error(String errMsg), diese gibt die Fehlermeldung direkt aus, ohne dass eine Fehlernummer dafür definiert werden muss.
Der Launcher prüft vor jedem weiteren Schritt, ob kein Fehler aufgetreten ist. Was aber passiert, wenn innerhalb eines Schrittes (z.B. der Berechnung der Codegenerierung) ein Fehler auftritt, und zwar so, dass dieser Teil nicht mehr abgeschlossen werden kann? Das ist z.B. der Fall, wenn kein Register mehr alloziert werden kann. Unter Umständen ist die Aufruferkette sehr gross und wir wollen nur im äussersten Rufer, dem Launcher jeweils nofErrors prüfen.
Alle Methoden sollen so geschrieben werden, dass im Fehlerfall der ErrorReporter aufgerufen wird, aber die Methode trotzdem einen brauchbaren Rückgabewert liefert (also z.B. einfach das Register 0 oder den Node 0) und so die äusseren Methoden durchlaufen. U.U. können auch spezielle Objekte extra dafür geschaffen werden.
Es macht trotzdem Sinn daneben auch Assertions einzubauen. Diese sind dann nützlich, wenn wir als Entwickler den Fehler genau zu lokalisieren versuchen.
ErrorNr | Description | Solution |
---|---|---|
10 | feature not yet implemented | |
11 | file not found |
ErrorNr | Description | Solution |
---|---|---|
200 | wrong number format | |
201 | missing right parenthesis | |
202 | missing right brace | |
203 | missing right bracket | |
204 | missing quotation mark | |
205 | IO-Exception | |
206 | Unexpected Symbol | |
207 | missing left brace | |
208 | missing left bracket | |
209 | missing semicolon | |
210 | missing assignment sign | |
220 | no such device | |
221 | no devices | create device before adding segments |
222 | syntax error | |
223 | inconsistent attributes | |
224 | invalid type | |
225 | invalid parameter | |
226 | overwrite protected | |
227 | undefined constant | |
228 | max number of reached | |
229 | missing tag | |
230 | no such register | |
231 | no default segment defined | |
232 | no system table segment defined | |
233 | to set an init value is not supported | |
234 | fix addresses for methods are only in exception methods supported | |
235 | no such segment |
ErrorNr | Description | Solution |
---|---|---|
300 | class file not found | |
301 | systemmethod not found | |
302 | id for Systemmethod out of range | |
303 | changing parent dirs of class files | |
304 | illegal parent dir of class files |
ErrorNr | Description | Solution |
---|---|---|
400 | cfgNode not found |
ErrorNr | Description | Solution |
---|---|---|
500 | generating of the linenumber tabel failed |
ErrorNr | Description | Solution |
---|---|---|
600 | no code generated | |
601 | method has too many parameters | |
602 | fixup out of range | |
603 | not enough GPR's for locals | |
604 | not enough FPR's for locals | |
610 | result of SSA instruction has wrong type | |
611 | operand of SSA instruction has wrong type | |
612 | operand of SSA new instruction has wrong type | |
620 | SSA return instruction not implemented | |
621 | SSA branch instruction not implemented | |
623 | sCcompl or sCcompg is not followed by branch instruction | |
625 | SSA instruction not implemented |
ErrorNr | Description | Solution |
---|---|---|
701 | Class not loaded | |
710 | Segment not found | |
711 | Segment size error | |
720 | Address not set | |
721 | Offset not set | |
722 | Index not set | |
723 | ID not set | |
724 | Base address not set | |
790 | Runtime System error |
ErrorNr | Description | Solution |
---|---|---|
800 | target not found!(USB connection failed) | |
801 | a error occurs while downloading!(Try to reopen) | |
802 | no target image to load | |
803 | connection to target lost | |
804 | reopen failed | |
805 | starting of Device failed | |
806 | bdi is not in Debug mode | |
807 | memmory writer is not implemented | |
808 | bypass is not unlocked | |
809 | programming failed |
ErrorNr | Description | Solution |
---|---|---|
900 | connection lost |