Forum: Mikrocontroller und Digitale Elektronik Funktion wird nur aufgerufen, wenn ein Breakpoint gesetzt ist


von Bernd (Gast)


Lesenswert?

Hallo.
Ich habe eine Globale Variable GV und eine Funktion resetGV, in der 
diese = 0 gesetzt wird.
Programmablauf:
1
struct myGlobalStruct globaleVariable;
2
main {
3
init();
4
setGV();
5
resetGV();
6
}

Problem: Wenn ich einen Breakpoint in die Funktion resetGV setze, mit 
dem Debugger dorthin springe und dann einfach nur auf "weiter" drücke, 
wird die Funktion einwandfrei ausgeführt. Wenn ich einen Breakpoint NACH 
der Funktion setze, wird die Funktion nicht ausgeführt, die GV ist also 
nicht 0. In der Funktion setGV wird allerdings die Variable beschrieben.

Wieso wird die Funktion ausgeführt, wenn ich einen Breakpoint reinsetze 
und sonst nicht?

Ich benutze einen AT32UC3B0256, Atmel Studio 6 und JTAG MKII.

Ich steh total auf dem Schlauch und weiß nichtmal, nach was für 
Begriffen ich googlen kann. Irgendwelche Tips?

Grüße

von Karl H. (kbuchegg)


Lesenswert?

Mach da
1
main {
2
init();
3
setGV();
4
resetGV();
5
}

noch irgendeine ANweisung nach dem Funktionsaufruf, so dass du einen 
Punkt hast, der sicher noch zur main-Funktion gehört und auf die du 
einen Breakpoint setzen kannst.

von Felix A. (madifaxle)


Lesenswert?

Es könnte sein, dass dein Compiler die Funktion wegoptimiert, weil ein 
volatile fehlt oder dass der Compiler in der Funktion eine neue Instanz 
der Variable erzeugt und danach wegschmeißt.

Was passiert, wenn du einen Breakpoint in die Funktion und einen danach 
setzt? Wie ist der Zustand in der Funktion und der danach?

von Peter D. (peda)


Lesenswert?

Man kann Programme in Prosa beschreiben, was man denkt, was sie so 
machen würden.

Nur hilft das für eine Fehlersuche genau 0,nix.
Da zählt nur der exakte und compilierbare Code als Attachment.

von Bernd (Gast)


Lesenswert?

Karl H. schrieb:
> Mach damain {
> init();
> setGV();
> resetGV();
> }
>
> noch irgendeine ANweisung nach dem Funktionsaufruf, so dass du einen
> Punkt hast, der sicher noch zur main-Funktion gehört und auf die du
> einen Breakpoint setzen kannst.

Hab ich ausprobiert, hilft nichts. Die Funktion wird nicht ausgeführt, 
wenn IN der Funktion kein Breakpoint ist.

> Es könnte sein, dass dein Compiler die Funktion wegoptimiert, weil ein
> volatile fehlt oder dass der Compiler in der Funktion eine neue Instanz
> der Variable erzeugt und danach wegschmeißt.

Wie kann ich das prüfen? Die globale Variable hab ich mal als static und 
als volatile gehabt, hat beides nichts geändert.

von Bernd (Gast)


Lesenswert?

Felix A. schrieb:
> Was passiert, wenn du einen Breakpoint in die Funktion und einen danach
> setzt? Wie ist der Zustand in der Funktion und der danach?

Wenn ich einen Breakpoint IN die Funktion und DANACH setze, wird die 
Funktion genau so ausgeführt, wie man das erwarten würde und alles ist 
0. Setze ich nur einen Breakpoint danach, wird die Funktion NICHT 
ausgeführt, die globale Variable ist also != 0.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Bernd schrieb:
> Setze ich nur einen Breakpoint danach, wird die Funktion NICHT
> ausgeführt, die globale Variable ist also != 0.

Wo steht denn in Deinem obigen Codefetzen, dass Du die Funktion (welche 
überhaupt???) nur dann aufrufst, wenn die Variable == 0 ist? Ich sehe da 
keine Bedingung, sondern nur unbedingte Funktionsaufrufe.

Poste den kompletten Source, mit Deinen paar Zeilen kann man NICHTS 
anfangen.

von Peter D. (peda)


Lesenswert?

Bernd schrieb:
> Wenn ich einen Breakpoint IN die Funktion und DANACH setze, wird die
> Funktion genau so ausgeführt, wie man das erwarten würde und alles ist
> 0. Setze ich nur einen Breakpoint danach, wird die Funktion NICHT
> ausgeführt, die globale Variable ist also != 0.

Dein um den heißen Brei reden nervt nur.

von Felix A. (madifaxle)


Lesenswert?

Eine mögliche Prüfung wäre in das .lss-File zu schauen. Kommt die 
Funktion vor, dann wurde sie nicht wegoptimiert. Viele Compiler 
schreiben den C-Code vor die Assemnblerzeilen.

von Klaus (Gast)


Lesenswert?

Folge am besten der Netiquette und poste vollständig compilierbaren, 
aber minimalen Code der das Problem zeigt.

Dein Code, den Du gepostet hast und die Beschreibung wirft noch mehr 
Probleme auf.

1. Du kannst nach ResetGV garkeinen Breakpoint setzen, da dort keine 
Anweisung steht.
2. Eine Variable GV ist im Code nicht vorhanden. Soweit damit 
globaleVariable gemeint ist, könnte der Compiler das wegoptimiert haben, 
da offensichtlich dieser Wert nicht mehr verwendet wird.
3. An eine Struktur lässt sich ein literales 0 nicht zuweisen.

von Bernd (Gast)


Lesenswert?

Frank M. schrieb:
> Bernd schrieb:
>> Setze ich nur einen Breakpoint danach, wird die Funktion NICHT
>> ausgeführt, die globale Variable ist also != 0.
>
> Wo steht denn in Deinem obigen Codefetzen, dass Du die Funktion (welche
> überhaupt???) nur dann aufrufst, wenn die Variable == 0 ist? Ich sehe da
> keine Bedingung, sondern nur unbedingte Funktionsaufrufe.
>
> Poste den kompletten Source, mit Deinen paar Zeilen kann man NICHTS
> anfangen.

Der komplette code ist mittlerweile recht groß und posten will ich den 
auch nicht. Es geht mir auch nicht um ein spezielles Problem in meinem 
Code.

Nochmal deutlich: Ich habe eine Funktion, die nur aufgerufen wird, wenn 
ein Breakpoint in dieser Funktion gesetzt wird. Ansonsten wird diese 
Funktion nicht ausgeführt. Setze ich einen Breakpoint DAVOR und einen 
DANACH und debugge das durch, wird die Funktion nicht ausgeführt. Setze 
ich einen Breakpoint IN die Funktion, wird diese normal ausgeführt. 
Kennt irgendwer dieses Verhalten? Hatte das jemand schonmal? Wie kann 
ich vorgehen, um mehr Infos über mein Problem zu finden?

von Bernd (Gast)


Lesenswert?

Felix A. schrieb:
> Eine mögliche Prüfung wäre in das .lss-File zu schauen. Kommt die
> Funktion vor, dann wurde sie nicht wegoptimiert. Viele Compiler
> schreiben den C-Code vor die Assemnblerzeilen.

Danke. Das werde ich mal machen und mich dann wieder melden.

von Karl H. (kbuchegg)


Lesenswert?

Bernd schrieb:
> Frank M. schrieb:
>> Bernd schrieb:
>>> Setze ich nur einen Breakpoint danach, wird die Funktion NICHT
>>> ausgeführt, die globale Variable ist also != 0.
>>
>> Wo steht denn in Deinem obigen Codefetzen, dass Du die Funktion (welche
>> überhaupt???) nur dann aufrufst, wenn die Variable == 0 ist? Ich sehe da
>> keine Bedingung, sondern nur unbedingte Funktionsaufrufe.
>>
>> Poste den kompletten Source, mit Deinen paar Zeilen kann man NICHTS
>> anfangen.
>
> Der komplette code ist mittlerweile recht groß

Dann specke auf ein Minimalbeispiel ab.

Das ist dir zuzumuten.

von Peter D. (peda)


Lesenswert?

Bernd schrieb:
> Nochmal deutlich: Ich habe eine Funktion, die nur aufgerufen wird, wenn
> ein Breakpoint in dieser Funktion gesetzt wird.

Nein, daran ist absolut nichts deutlich!

Sie macht vermutlich was anderes, wenn sie sofort oder erst nach einem 
Breakpoint ausgeführt wird.
Aber ohne sie zu kennen, bleibt alles nur Kaffeesatzleserei.

von Dumdi D. (dumdidum)


Lesenswert?

Bernd schrieb:
> Ich habe eine Funktion, die nur aufgerufen wird, wenn
> ein Breakpoint in dieser Funktion gesetzt wird. Ansonsten wird diese
> Funktion nicht ausgeführt.

Wie überprüfst Du ob die Funktion aufgerufen wird? Wenn es der Wert in 
der Debug-Umgebungung ist: manchmal wird der nicht richtig angezeigt 
(wenn Zugriffe optimiert wurden).

von Felix A. (madifaxle)


Lesenswert?

Könntest du zumindest die Funktionen setGV() und resetGV() sowie den 
Struct posten?

von Klaus (Gast)


Lesenswert?

Nochmal deutlich:

Klaus schrieb:
> Folge am besten der Netiquette und poste vollständig compilierbaren,
> aber minimalen Code der das Problem zeigt.

von Thomas H. (Firma: CIA) (apostel13)


Lesenswert?

..ich weiss nicht ob Du es schon mal probiert hast alle Optimierungen 
auszuschalten vor dem Debuggen  und während des Debugging  bitte mal den 
Focus dem Dissassemby Fenster geben. Und nochmal prüfen

von Max B. (theeye)


Lesenswert?

Du kannst sich kein unvollständiges Minimalbeispiel erstellen und darauf 
bestehen, dass das so reichen muss und der eigentliche Code viel zu groß 
ist. Natürlich musst du den hier nicht posten. Aber ein kompilierbares 
Minimalbeispiel ist nicht zu viel verlangt, sondern das Minimum. Peter 
hat das ja auch nochmal deutlich gemacht.

Dass man dir hier gerne helfen möchte sollte aus den bisherigen 
Antworten hervor gegangen sein.

Gruß Max

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Bernd schrieb:
> Der komplette code ist mittlerweile recht groß und posten will ich den
> auch nicht. Es geht mir auch nicht um ein spezielles Problem in meinem
> Code.

Doch. Du hast das Problem nur mit Deinem Code. Zum Beispiel könnte 
eine ganz andere Funktion, die Du noch gar nicht im Fokus hast, Deine 
globale Variable durch Buffer-Overflow überschreiben.

Ein simples Beispiel:
1
static char buf[2];
2
static unsigned char flag;
3
4
int main ()
5
{
6
   flag = 1;
7
8
   strcpy (buf, "AB");    // <--- Hier Buffer-Overflow!
9
10
   if (flag)
11
   {
12
      funktion();
13
   }
14
}

Ich wette, dass zumindest auf einem AVR funktion() NICHT aufgerufen 
wird.

Schau also mal auf die globalen Variablen VOR Deiner mysteriösen 
globalen geheimen Variablen.

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.