Suche eine Programmiersprache!
-
Das ist eben ein gutes Zusatzfeature. So etwas unterscheidet eben gute Debugger von gewöhnlichen Debuggern. Deswegen hab ich ja auch beim VC++ Debugger nach einem Killerfeature gefragt
Gute Frontends für den GDB sind Insight, KDbg und DDD.
Ansonsten bieten die GCC kompatiblen IDEs idr. auch GDB Support an. zB GNU/Emacs
-
Oh, ich hätte vielleicht dazu schreiben sollen, dass ich was für Windows suche.
-
groovemaster schrieb:
Wenn man sich zB mal einen puren, nicht sprachspezifischen Debugger anschaut, zB Olly, wie will man denn dort sowas implementieren?
Ein Sprachunabhängiger Debugger liest einfach die Debug-Segmente aus dem ausführbaren Programm aus. Bei zeilenweisen Debug-Informationen steht dann z.B. der Quelltext der Programmzeile, die den Fehler erzeugt hat, mit im Debug-Segment (bzw. ein Verweise auf die Quelldatei und eine Zeilennumer).
Symbolinformationen stehen auch im Debug-Segment (manchmal auch im Code-/Datensegment). D.h. der Debugger kann dann die Adressen von globalen Variablen und Funktionen ermitteln (nur, die keine static linkage haben).
Das kann durchaus reichen, um einen halbwegs vernünftigen Debugger auf die Beine zu stellen. Man kommt halt dann nicht an lokale Variable dran, außer man vergleicht manuell den Source und den jeweiligen Stackframe / Registersatz. Aber es lassen sich z.B. ein Call-Stack anlegen und auch globale Variable auslesen (über einen Memory Dump).
Manche Debug-Formaten können auch weitergehende Debuginformationen sprachunabhängig codieren.
Oder ein Debugger bringt Syntax Analyzer für die gängigsten Sprachen mit und parst die in der Debug-Information angegebene Quelldatei.
(so oder so ähnlich dürften andere Debugger wie GDB oder der MS Debugger auch funktionieren)
-
Erstmal ein teilweises nö. Eine Executable muss keine Debug Infos enthalten, zudem sind diese nicht standardisiert. Und zweitens, was hat das mit der Implementation eines Interpreters zu tun?
-
groovemaster schrieb:
Erstmal ein teilweises nö. Eine Executable muss keine Debug Infos enthalten, zudem sind diese nicht standardisiert. Und zweitens, was hat das mit der Implementation eines Interpreters zu tun?
Ein Syntax Analyzer ist kein Interpreter. Er zerlegt den Quelltext in eine interne Form, meist einen Syntax-Baum.
Wenn im Executable keine Debug-Infos vorhanden sind, können alle Debugger nur noch den Assembler-Code von Code-Segment bzw. die Rohdaten in Datensegmenten anzeigen. Benutzer von IDEs merken das meist nicht, weil sie ihre Projekte immer als Debug-Projekte compilieren.
Die Debug-Informationen sind sehr wohl standardisiert. Z.B. Microsoft VC++ verwendet ein von COFF abgeleitetes Format, kann aber auch andere Formate erzeugen.
-
Power Off schrieb:
Ein Syntax Analyzer ist kein Interpreter.
Ich dachte es geht darum, benutzerdefinierten Code ausführen zu lassen? Davon war zumindest die Rede. Einen "Syntax Analyzer" besitzt der VC++ Debugger zB auch.
Power Off schrieb:
Die Debug-Informationen sind sehr wohl standardisiert. Z.B. Microsoft VC++ verwendet ein von COFF abgeleitetes Format
Was aber nicht COFF kompatibel ist, afaik. Ergo, es gibt kein einheitliches Debug Format
also kein einheitlicher Standard. Letztendlich macht das jeder Compiler wie er lustig ist, auch wenn man natürlich ein definiertes Format verwenden kann, wie zB COFF.
-
hab hier zwei Sachen gelesen, die der VC++ haben soll:
Memory-Breakpoint: Wo, wie? Unterbricht er, wenn sich der Wert an einer Adresse ändert? Wie mach man das???
Profiler: Wie schalt ich bei VC++ 7.1 (professional) den Profiler an? Weiß nur, dass der 6er einen hatte, hab jahrelang mit dem BCB gearbeitet und mich gefreut, als wir auf VC++7.1 umgestiegen sind. Jetzt find ich aber nirgends den Profiler.
-
kartoffelsack schrieb:
hab hier zwei Sachen gelesen, die der VC++ haben soll:
Memory-Breakpoint: Wo, wie? Unterbricht er, wenn sich der Wert an einer Adresse ändert? Wie mach man das???
Profiler: Wie schalt ich bei VC++ 7.1 (professional) den Profiler an? Weiß nur, dass der 6er einen hatte, hab jahrelang mit dem BCB gearbeitet und mich gefreut, als wir auf VC++7.1 umgestiegen sind. Jetzt find ich aber nirgends den Profiler.
kann ich dir beides nur beim 6er erklärn
-
Dann erklär mir mal memory-Breakpoint beim 6er. Soviel anders wirds beim 7.1er schon nicht sein. Ganz schön traurig, dass ich nicht weiß, wie man das macht
-
Im VC 6 mit Strg+B den Dialog für Breakpoints öffnen und bei Data eine Expression wie DW(0xabcdefg) eingeben, ich glaub mal so war die Syntax für ein DWORD an der enstprechenden Adresse.
-
so wie musicman es beschrieben hat
außer, dass ich immer nur ne adresse oben reinschreib und dann unten bei number of elements die anzahl von bytes die ich überwachen will
im fall von musicmans beispiel also 4 unten rein weil unsigned long ( DWORD ) 4 bytes hat
du kannst bei expression aber auch sowas reinschreiben wie
( ( ( ( unsigned long ) 0xabcdefg ) == 100 ) && ( ( ( int ) 0xdfghjk ) == 50 ) )
dann hält er an wenn der ulong an adresse 0xabcdefg den wert 100 und der int an adresse 0xdfghjk den wert 50 hat
das is besonders im debugmodus geil, weil die variablen im debugmodus immer an den gleichen adressen stehn
d.h. du kannst einen breakpunkt drauf setzen ohne dass dich dergültigkeitsbereich interessieren brauch ( z.b. bei membervariablen interessant )