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