Funktion wird nur aufgerufen, wenn ein Breakpoint gesetzt ist

Gast #4312154
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
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
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
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
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.
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.
Gast
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
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?
Gast
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.
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.
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.
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).
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
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

Eine eigene Frage? Dieser Thread ist über 11 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.