www.mikrocontroller.net

Forum: Compiler & IDEs Breakpoint mitten im Macro


Autor: I. E. (anfaenger69)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Dieter (Gast)
Datum:

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

Autor: Phantomix (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: I. E. (anfaenger69)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

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

Autor: Dieter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: ... (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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 "display.c"
# 1 "/home/john/projects/avr/dcf/"
# 1 "<built-in>"
#define __STDC__ 1
#define __STDC_VERSION__ 199901L
#define __STDC_HOSTED__ 1
#define __GNUC__ 4
#define __GNUC_MINOR__ 3
#define __GNUC_PATCHLEVEL__ 0
#define __SIZE_TYPE__ unsigned int
#define __PTRDIFF_TYPE__ int
...
# 1 "<command-line>"
#define F_CPU 8000000
...

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 "/home/john/install/avr/lib/gcc/../../avr/include/avr/io.h" 1 3
# 92 "/home/john/install/avr/lib/gcc/../../avr/include/avr/io.h" 3
#define _AVR_IO_H_ 

# 1 "/home/john/install/avr/lib/gcc/../../avr/include/avr/sfr_defs.h" 1 3
# 36 "/home/john/install/avr/lib/gcc/../../avr/include/avr/sfr_defs.h" 3
#define _AVR_SFR_DEFS_H_ 1
# 121 "/home/john/install/avr/lib/gcc/../../avr/include/avr/sfr_defs.h" 3
#define _SFR_ASM_COMPAT 0

Autor: Stefan Noack (stefan_n)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Klaus Wachtler (mfgkw)
Datum:

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

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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.