DebugBuild (pragma & interface)

Implementiert ab Version 2015.r1

Mit dem Pragma DebugBuild wird der Compiler angewiesen die Kompilierung mit Informationen zur aktuellen Code-Zeile und -Datei durchzuführen. Hierfür werden global (einmalig) 4 Bytes im Arbeitsspeicher reserviert. Jede Zeile einer Anweisung im Luna-Source resultiert in zumeist mehreren Maschinenbefehlen. Der Compiler fügt für jede Zeile im Luna-Code vor der Ausführung Code ein um die Informationen zu aktualisieren. Eine Aktualisierung benötigt 4 Takte.

  • #pragma DebugBuild true

Zur Abfrage ob DebugBuild aktiviert ist (0 = false), existiert folgende globale Konstante:

  • DEBUGBUILD

Die aktuelle Zeile und Datei kann gelesen werden mit:

  • word = DebugBuild.Row
  • string = DebugBuild.File

Die Aktualisierung einer Code-Zeile wird automatisch ausgesetzt unter folgenden Bedingungen:

  • Code in Exception-Handlern
  • Code in asm-endasm
  • Deklarationen bzw. Deklarationsblöcke wie „dim“, „struct“, „data“ usw.
  • Befehlszeilen bei denen der erzeugte Maschinencode keinen komplexen Ausdruck enthält bzw. keine Exception auslösen kann, wie .z.B „nop“, „portb.1 = 1“, „else“, „endif“, „endproc“, „endfunc“, „return“ (ohne Parameter), „default“, „endselect“, „class“, „endclass“, „do“, „wend“, „next“, „halt()“ usw.
  • Code-Zeilen welche DebugBuild.Row/File auslesen
#pragma DebugBuild true
 
const F_CPU = 16000000
 
avr.device = atmega328p
avr.clock  = F_CPU
avr.stack = 32
 
uart.baud = 19200
uart.recv.enable
uart.send.enable
 
dim m as MemoryBlock
 
print 12;"debugbuild example"
print
 
'allocate a memoryblock
m = new MemoryBlock(16)
 
'force the exception by writing out of bounds
m.byteValue(20) = 123
 
halt()
 
Exception OutOfBoundsMemory
  ' print error message
  #if DEBUGBUILD
    print "*** Exception OutOfBoundsMemory: line ";str(DebugBuild.Row);", in file: '";DebugBuild.File;"' ***"
  #else
    print "*** Exception OutOfBoundsMemory ***"
  #endif
EndException