gdb: "Left operand of assignment ist kein lvalue."
Ich bin Debuggen von ARM-mikrocontroller aus der Ferne und versucht sich zu ändern, eine variable mit gdb wurde in den folgenden code-block:
for (int i = 0; i < 100; i++) {
__asm__("nop");
}
Wenn ich ausführen print i
ich kann sehen, dass der Wert der Variablen
(gdb) print i
$1 = 0
Ausführung whatis i
gibt diese
whatis i
~"type = int\n"
Aber wenn ich versuche, die variable ändern bekomme ich folgende Fehlermeldung
(gdb) set variable i=99
Left operand of assignment is not an lvalue.
Was mache ich hier falsch?
UPDATE: hier ist der assembler-code
! for (int i = 0; i < 100; i++) {
main+38: subs\tr3, #1
main+40: bne.n\t0x80001d0 <main+36>
main+42: b.n\t0x80001c4 <main+24>
main+44: lsrs\tr0, r0, #16
main+46: ands\tr2, r0
! __asm__("nop");
main+36: nop
- Zur info ich bekomme das gleiche Verhalten mit gcc 4.8.1 auf amd64 ubuntu, wenn ich kompilieren mit
-O3
aber nicht mit-O0
, so versuchen Sie es zu kompilieren, ohne Optimierungen. - Ich habe versucht zu kompilieren, das ohne Optimierungs - kein Glück
- Können Sie ändern alle Variablen? Wie wäre es, wenn Sie machen
i
flüchtigen? Sie könnte sich auch eine Auflistung der generierten assembler-code (mit debugging-Informationen enthalten, d.h.gcc -S
oder gleichwertig). - Seltsam, nach dem Wechsel
i
flüchtige gdb tut mir erlauben, es zu ändern ' s Wert - Scheint, wie gdb lassen Sie nicht setzen Sie die variable Werte, es sei denn, die variable ist ein Speicher (die
volatile
Gewalt in). In Ihrem ursprünglichen Fall können Sie die entsprechenden CPU-register statt. In diesem Fall denke ich, dass wäreset $r3 = 1
( da es aussieht wie es ist, herunter zu zählen und mitr3
. ). - Sie haben Recht, ich kann erreichen dies durch ändern
r3
registrieren. Eine weitere seltsame Sache: ich bin in der Lage, um eine variable zu ändern, wenn ich verkünde, daß es außerhalb der main () - Bereich. - Ich denke, @user786653 sollte Beitrag eine Antwort.
- Ich kann nicht scheinen zu finden, eine gute Quellen zu zitieren, Geldautomaten, so dass jeder (auch der OP) ist frei zu geben, eine Antwort.
- Sind Sie mit einer compiler-Optimierung? Ich hatte das exakt gleiche problem wie du. Etwas mehr info ist hier: stackoverflow.com/questions/1345338/... -- ich würde empfehlen, das ausschalten der Optimierung vor dem Debuggen.
- die Deaktivierung der Optimierungen war das erste, was ich versucht habe. Ich Tat es herausfinden, irgendwann - kann mich nicht erinnern, alle details, aber das problem wurde im Zusammenhang mit der GNU-toolchain, die ich verwendet.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich hatte das gleiche problem und die variable
volatile
geholfen.volatile
löste dieses problem für mich.Wäre der Befehl nur
set i = 99
Ambiguous set command \"i=99\"
Versuchen Sie es auf diese Weise:
Gibt es zwei Problem-hier ändern Sie den Namen der Variablen aus
i
zuvar_i
da gibt es einige set-Befehl, beginnend miti
so eingestellti=6
gibt den zweideutigen Befehl set Fehler.Den "Linken Operanden-Zuordnung ist nicht ein lvalue." kann behoben werden mit den code-änderungen, wie unten gezeigt.