【问题标题】:gdb: "Left operand of assignment is not an lvalue."gdb:“赋值的左操作数不是左值。”
【发布时间】:2014-03-10 19:03:36
【问题描述】:

我正在远程调试 ARM 微控制器,并尝试在以下代码块中使用 gdb 修改变量:

for (int i = 0; i < 100; i++) {
    __asm__("nop");
}

当我执行print i我可以看到变量的值

(gdb) print i
$1 = 0

执行whatis i 会返回这个

whatis i
~"type = int\n"

但是当我尝试更改变量时,出现以下错误

(gdb) set variable i=99
Left operand of assignment is not an lvalue.

我在这里做错了什么?

更新:这是汇编代码

!        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    

【问题讨论】:

  • 仅供参考,当我使用-O3 编译但不是-O0 时,我在amd64 ubuntu 上使用gcc 4.8.1 得到相同的行为,因此请尝试不优化编译。
  • 我尝试编译没有优化 - 没有运气
  • 你能修改任何变量吗?如果你让i volatile 怎么样?您还可以包含生成的汇编代码的列表(包含调试信息,即gcc -S 或等效项)。
  • 似乎 gdb 不会让你设置变量值,除非变量有一个内存位置(volatile 强制它进入)。在您原来的情况下,您可以改为设置相关的 CPU 寄存器。在这种情况下,我认为应该是set $r3 = 1(因为它看起来正在倒计时并使用r3。)。
  • @oLas - 禁用优化是我尝试的第一件事。我最终还是弄明白了——不记得所有细节,但问题与我使用的 GNU 工具链有关。

标签: c debugging gdb arm


【解决方案1】:

我遇到了同样的问题,并且使变量 volatile 有所帮助。

【讨论】:

  • 我就是这种情况。尝试打印变量,并检查它是否被编译器“优化”。
  • 宾果游戏。将变量声明为 volatile 为我解决了这个问题。
【解决方案2】:

命令只是set i = 99

【讨论】:

  • 我已经尝试过了,但出现以下错误:Ambiguous set command \"i=99\"
【解决方案3】:

试试这个方法:

(gdb) print i
$1 = 3
(gdb) set var i=6
(gdb) print i
$2 = 6

【讨论】:

    【解决方案4】:

    这里有两个问题,将变量名从i 更改为var_i,因为有一些以i 开头的设置命令,所以设置i=6 将给出模糊命令集错误。

    “赋值的左操作数不是左值”。可以通过如下所示的代码更改来修复。

    volatile int var_i = 1;
      TRACE((2255, 0, NORMAL, "Ravi I am sleeping here........."));
      do
      {
              sleep(5);
              var_i = 1;
      }while(var_i);
    
    (gdb)bt
    #1  0x00007f67fd7b9404 in sleep () from /lib64/libc.so.6
    #2  0x00000000004cd410 in pgWSNVBUHandleGetUser (warning: Source file is more recent than executable.
    ptRequest=<optimized out>, oRequest=<optimized out>,
    
    (gdb) finish
    Run till exit from #0  0x00007f67fd7b9550 in __nanosleep_nocancel () from /lib64/libc.so.6
    0x00007f67fd7b9404 in sleep () from /lib64/libc.so.6
    (gdb) finish
    Run till exit from #0  0x00007f67fd7b9404 in sleep () from /lib64/libc.so.6
    0x00000000004cd410 in pgWSNVBUHandleGetUser (ptRequest=<optimized out>, oRequest=<optimized out>,
        pptResponse=0x7fff839e8760) at /root/Checkouts/trunk/source/base/webservice/provnvbuuser.c:376
        (gdb)
          │372       volatile int var_i = 1;                                                                                           │
           │373       TRACE((2255, 0, NORMAL, "Ravi I am sleeping here........."));                                            │
           │374       do                                                                                                       │
           │375       {                                                                                                        │
          >│376         sleep(5);                                                                                              │
           │377         var_i = 1;                                                                                             │
           │378       }while(var_i);        
    
    (gdb) set var_i=0
    (gdb) n
    (gdb) p var_i
    $1 = 1
    (gdb) set var_i=0
    (gdb) p var_i
    $2 = 0
    (gdb) n
    (gdb) n
    

    【讨论】:

      猜你喜欢
      • 2016-09-03
      • 2011-09-03
      • 2011-03-12
      • 2018-10-19
      • 1970-01-01
      相关资源
      最近更新 更多