在 LLDB 中更改 const 变量的值
Change value of const variables in LLDB
常量变量很好。但是,有时我想在调试时动态更改它们的值以跟踪某些特定行为。
当我 po flag = NO
收到此错误时:
error: <user expression 0>:1:34: cannot assign to variable 'flag' with const-qualified type 'const BOOL &' (aka 'const bool &')
有什么解决方法吗?
您可以使用const_cast使表达式成功,但很可能达不到您的要求。例如:
(lldb) run
Process 32640 launched: '/tmp/foo' (x86_64)
Process 32640 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
frame #0: 0x0000000100003f66 foo`main at foo.c:7
4 main()
5 {
6 const int foo = 10;
-> 7 printf("%d\n", foo);
^
8 return 0;
9 }
Target 0: (foo) stopped.
(lldb) expr foo = 20
error: <user expression 0>:1:5: cannot assign to variable 'foo' with const-qualified type 'const int &'
foo = 20
~~~ ^
note: variable 'foo' declared const here
const_cast 救援:
(lldb) expr *(const_cast<int*>(&foo)) = 20
(int) = 20
我们确实更改了 foo 插槽中的值,如您所见:
(lldb) expr foo
(const int) = 20
和:
(lldb) frame var foo
(const int) foo = 20
但是编译器可以自由地内联 const 变量的值,即使在 -O0 (*) 时它也可以非常自由地内联。例如,调用在 x86_64 at -O0 上编译的 printf 到:
-> 0x100003f66 <+22>: leaq 0x39(%rip), %rdi ; "%d\n"
0x100003f6d <+29>: movl [=14=]xa, %esi
0x100003f72 <+34>: movb [=14=]x0, %al
0x100003f74 <+36>: callq 0x100003f86 ; symbol stub for: printf
注意它没有引用任何变量,它只是将0xa直接放入第二个参数传递寄存器。不出所料:
(lldb) c
Process 33433 resuming
10
(*) 在更高的优化级别上,可能甚至不会在框架上为 const 变量分配变量。该值会像上面一样立即插入,调试信息也会记录它以供调试器显示,但内存中不会有任何内容可以从旧值更改为新值。
常量变量很好。但是,有时我想在调试时动态更改它们的值以跟踪某些特定行为。
当我 po flag = NO
收到此错误时:
error: <user expression 0>:1:34: cannot assign to variable 'flag' with const-qualified type 'const BOOL &' (aka 'const bool &')
有什么解决方法吗?
您可以使用const_cast使表达式成功,但很可能达不到您的要求。例如:
(lldb) run
Process 32640 launched: '/tmp/foo' (x86_64)
Process 32640 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
frame #0: 0x0000000100003f66 foo`main at foo.c:7
4 main()
5 {
6 const int foo = 10;
-> 7 printf("%d\n", foo);
^
8 return 0;
9 }
Target 0: (foo) stopped.
(lldb) expr foo = 20
error: <user expression 0>:1:5: cannot assign to variable 'foo' with const-qualified type 'const int &'
foo = 20
~~~ ^
note: variable 'foo' declared const here
const_cast 救援:
(lldb) expr *(const_cast<int*>(&foo)) = 20
(int) = 20
我们确实更改了 foo 插槽中的值,如您所见:
(lldb) expr foo
(const int) = 20
和:
(lldb) frame var foo
(const int) foo = 20
但是编译器可以自由地内联 const 变量的值,即使在 -O0 (*) 时它也可以非常自由地内联。例如,调用在 x86_64 at -O0 上编译的 printf 到:
-> 0x100003f66 <+22>: leaq 0x39(%rip), %rdi ; "%d\n"
0x100003f6d <+29>: movl [=14=]xa, %esi
0x100003f72 <+34>: movb [=14=]x0, %al
0x100003f74 <+36>: callq 0x100003f86 ; symbol stub for: printf
注意它没有引用任何变量,它只是将0xa直接放入第二个参数传递寄存器。不出所料:
(lldb) c
Process 33433 resuming
10
(*) 在更高的优化级别上,可能甚至不会在框架上为 const 变量分配变量。该值会像上面一样立即插入,调试信息也会记录它以供调试器显示,但内存中不会有任何内容可以从旧值更改为新值。