Hallo.
Ich habe eine Globale Variable GV und eine Funktion resetGV, in der
diese = 0 gesetzt wird.
Programmablauf:
1
structmyGlobalStructglobaleVariable;
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
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.
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?
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.
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.
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.
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.
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.
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.
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?
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).
..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
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
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
staticcharbuf[2];
2
staticunsignedcharflag;
3
4
intmain()
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.