Tester Debugging

Da der Tester derzeit keine Debugging-Funktionalität wie Single-Stepping enthält, ist Debugging nur indirekt möglich. Diese Seite beschreibt daher einige Debugging-Möglichkeiten

Lokal testen

Das lokale Testen, auch unter Zuhilfenahme eines Debuggers wie GDB, ist ist die empfehlenswerteste Methode – und insbesondere als Vorbereitung auf die Projektphase sehr zu empfehlen. Für einige Aufgaben werden bereits Rahmenprogramme bereit gestellt, die hierfür verwendet werden können.

Wenn derselbe Code auf denselben Testfällen lokal funktioniert, aber nicht im Simulator, kann es sein, dass ein Bug des Simulators getroffen wurde – in diesem Fall ist der Code entsprechend anzupassen.

Segfault-Debugging

Mangels I/O-Funktionalität ist Print-Debugging im Aufgabentester nicht möglich. Man kann aber ausnutzen, dass bei einer Exception der Inhalt der General-Purpose-Register angezeigt wird, indem man die relevanten Daten in bestimmte Register schreibt und dann absichtlich eine Exception proviziert.

Assembly-Code

In Assembler kann man mit einer der Instruktionen int3/hlt/test al,[0]/… eine Exception erzeugen.

C-Code

In C lässt sich folgender Inline-Assembly-Aufruf verwenden, wobei die Namen rax/rcx… durch die Werte/Variablen zu ersetzen sind, die in den jeweiligen Registern stehen sollen. Die Zahl der Register-Constraints kann auch reduziert werden, bspw. falls weniger “Ausgaben” notwendig sind:

__asm__ volatile("hlt" :: "a"(rax), "c"(rcx), "d"(rdx), "b"(rbx), "S"(rsi), "D"(rdi) : "memory");