Forum: Compiler & IDEs Breakpoint mitten im Macro


von I. E. (anfaenger69)


Lesenswert?

Kann es sein, daß AVR Studio nicht damit zurecht kommt, wenn ich ein 
Breakpoint mitten im Macro setze? Beim Starten des Simulators kommt 
immer die Meldung, daß der Breakpoint ignoriert wird. Wenn ich diesen in 
einer CALL Unterroutine setze, funktioniert es, auch in iclude Dateien, 
aber nicht im Macro.

AVR Studio müsste doch heraus finden können, wo das Macro gestartet 
wird, vor allen wurde das Macro nur einmal benutzt.

Konfiguration: ATGEMA128, STK600 zum brennen, JTAGICE MKII für in 
circuit debugging

von Dieter (Gast)


Lesenswert?

Versteh ich das richtig, dass du den Breakpoint in der Definition des 
Macros verwenden möchtest, nicht im "Aufruf"?

von Phantomix (Gast)


Lesenswert?

@Igor
Deine Frage lässt durchblicken, dass du im Grunde nicht verstanden hast, 
wie ein Makro funktioniert.

Grundlegendes zu Funktionen und Makros:

Eine Funktion ist nichts weiter als ein Stück Code, zu dem per 
CALL-Aufruf gesprungen wird. Von welcher Stelle aus das Programm zur 
Funktion springt ist dabei nicht relevant, denn der gegenwärtige 
Instuction Pointer wird dabei auf den Stack gepackt und am Ende 
wiederhergestellt.

Ein Makro ist auch ein Stück Code, jedoch mit dem Unterschied, dass du 
ein Makro zur Laufzeit nicht "aufrufst", sondern zur Compilierzeit wird 
das Makro an die Aufrufstelle kopiert. Makros sollten daher kurz sein 
oder nur selten verwendet werden. Der Vorteil des Makros liegt darin, 
dass der Overhead des CALL wegfällt, und einfach linear im code 
weitergemacht werden kann, was Rechenzyklen spart.


Dein Makro-Breakpoint kann also gar nicht funktionieren, denn der 
Debugger weiß gar nicht, welchen "Makroaufruf" du damit gemeint hast, 
respektive wo der Instruction Pointer gerade steht!

von I. E. (anfaenger69)


Lesenswert?

Ja, Dieter, mitten in der Definition selbst.

@ Phantomix
Soweit kapiert. Wenn ich nun also z.B. dieses Macro im Programm 2 mal 
aufrufen würde, würde ich zwei Breakpoints erzeugen. Spätestens beim 
kompilieren würde er die Adressen kennen, damit er diese zum JTAGICE 
übertragen könnte.

Aber soweit scheint AVR Studio nicht zu denken, oder?

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Wird denn dwarf-3 schon komplett in GCC und im Debugger unterstützt?

von Dieter (Gast)


Lesenswert?

Wie gesagt, geht ein Breakpoint in der Definition einen Makros nicht, da 
das Makro nach dem Compilieren im Code nicht mehr existiert.

Als alternative wäre es möglich in den Zeilen der Benutzung des Makros 
Breakpoints zu legen. Oder das Makro zu Debugzwecken stattdessen als 
Funktion zu definieren.

von ... (Gast)


Lesenswert?

@Dieter:
Fast richtig. Genau genommen existiert das Makro bereits vor dem 
Compilieren nicht mehr! Es wird bereits vom Präprozessor ersetzt.


Ansonsten sollte man sich den Begriff "Aufruf" (oder "Call") im 
Zusammenhang mit Makros unbedingt abgewöhnen. Ein Makro wird eben NICHT 
aufgerufen, ein Makro wird ersetzt!

CU

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

... wrote:
> @Dieter:
> Fast richtig. Genau genommen existiert das Makro bereits vor dem
> Compilieren nicht mehr! Es wird bereits vom Präprozessor ersetzt.

Nicht unbedingt. Mit -g3 löst gcc (bzw. der Präprozessor) die Makros 
zwar auf, lässt sie aber in der Quelle stehen. Er fügt sogar defines 
hinzu, nämlich solche, die per -D oder -U von der Kommansozeile kommen 
sowie Builtin-Defines wie
1
# 1 "display.c"
2
# 1 "/home/john/projects/avr/dcf/"
3
# 1 "<built-in>"
4
#define __STDC__ 1
5
#define __STDC_VERSION__ 199901L
6
#define __STDC_HOSTED__ 1
7
#define __GNUC__ 4
8
#define __GNUC_MINOR__ 3
9
#define __GNUC_PATCHLEVEL__ 0
10
#define __SIZE_TYPE__ unsigned int
11
#define __PTRDIFF_TYPE__ int
12
...
13
# 1 "<command-line>"
14
#define F_CPU 8000000
15
...

Ebenso befinden sich im Präcompilat Anmerkungen darüber, aus welcher 
Include-Datei nachfolgende Zeilen stammen, obwohl der Präprozessor 
#include aufgelöst hat:
1
# 1 "/home/john/install/avr/lib/gcc/../../avr/include/avr/io.h" 1 3
2
# 92 "/home/john/install/avr/lib/gcc/../../avr/include/avr/io.h" 3
3
#define _AVR_IO_H_ 
4
5
# 1 "/home/john/install/avr/lib/gcc/../../avr/include/avr/sfr_defs.h" 1 3
6
# 36 "/home/john/install/avr/lib/gcc/../../avr/include/avr/sfr_defs.h" 3
7
#define _AVR_SFR_DEFS_H_ 1
8
# 121 "/home/john/install/avr/lib/gcc/../../avr/include/avr/sfr_defs.h" 3
9
#define _SFR_ASM_COMPAT 0

von Stefan N. (stefan_n)


Lesenswert?

Auch wenn dieser Beitrag uralt ist. Für jeden, der diesen über Google 
findet wie ich:

Man kann keine breakpoints im Makro setzen, zumindest nicht im 
Quellcode. Allerdings kann man im Fenster "Disassembly" die einzelnen 
Instruktionen des Makros aufgelöst sehen und dort auch Breakpoints 
setzen oder im Einzelschrittmodus durchgehen.

von Klaus W. (mfgkw)


Lesenswert?

Stefan Noack schrieb:
> Man kann keine breakpoints im Makro setzen, zumindest nicht im
> Quellcode.

Das gilt für welche Compileroptionen und welche -version?

von Peter D. (peda)


Lesenswert?

Breakpoints kann man nur zeilenweise setzen, nicht aber auf eine 
Anweisung innerhalb der Zeile.
Und ein Macro ist ja immer nur eine Zeile lang.


Peter

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.