Funktion wird nur aufgerufen, wenn ein Breakpoint gesetzt ist

Gast #4312154
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
#4312161
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?
Gast #4312172
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.
Gast #4312176
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.
Moderator Persönliche Seite #4312187
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.
Gast #4312203
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.
Gast #4312206
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?
#4312211
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.
#4312215
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.
#4312262
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
Moderator Persönliche Seite #4312277
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.

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.