问题描述
谁能解释一下 gdb 的这种行为?
Can anyone explain this behavior of gdb?
900 memset(&new_ckpt_info,'',sizeof(CKPT_INFO));
(gdb)
**903 prev_offset = cp_node->offset;**
(gdb)
**905 m_CPND_CKPTINFO_READ(ckpt_info,(char *)cb->shm_addr.ckpt_addr+sizeof(CKPT_** HDR),i_offset);
(gdb)
**903 prev_offset = cp_node->offset;**
(gdb)
**905 m_CPND_CKPTINFO_READ(ckpt_info,(char *)cb->shm_addr.ckpt_addr+sizeof(CKPT_ HDR),i_offset);**
(gdb)
**908 bitmap_offset = client_hdl/32;**
(gdb)
**910 bitmap_value = cpnd_client_bitmap_set(client_hdl%32);**
(gdb)
**908 bitmap_offset = client_hdl/32;**
(gdb)
**910 bitmap_value = cpnd_client_bitmap_set(client_hdl%32);**
(gdb)
**908 bitmap_offset = client_hdl/32;**
(gdb)
**910 bitmap_value = cpnd_client_bitmap_set(client_hdl%32);**
(gdb)
913 found = cpnd_find_exact_ckptinfo(cb , &ckpt_info , bitmap_offset , &offset , &prev_offset);
(gdb)
916 if(!found)
(gdb) p found
$1 = <value optimized out>
(gdb) set found=0
Left operand of assignment is not an lvalue.
为什么在执行第 903 行后,它再次对 905 908 910 执行相同的操作?
Why after executing line 903 it again executes the same for 905 908 910?
另一件事是found
是一个bool
类型的变量,那么为什么它显示值优化出来
?我也无法设置 found
的值.
Another things is found
is a bool
-type variable, so why it is showing value optimized out
?
I am not able to set the value of found
as well.
这似乎是一个编译器优化(在这种情况下是-O2
);我怎样才能设置 found
的值?
This seems to be a compiler optimization (in this case its -O2
); how can I still set the value of found
?
推荐答案
要调试优化的代码,学习汇编/机器语言.
To debug optimized code, learn assembly/machine language.
使用 GDB TUI 模式.当我输入减号并回车时,我的 GDB 副本会启用它.然后键入 C-x 2(即按住 Control 并按 X,同时松开,然后按 2).这将把它放入拆分源和反汇编显示.然后使用 stepi
和 nexti
一次移动一条机器指令.使用 C-x o 在 TUI 窗口之间切换.
Use the GDB TUI mode. My copy of GDB enables it when I type the minus and Enter. Then type C-x 2 (that is hold down Control and press X, release both and then press 2). That will put it into split source and disassembly display. Then use stepi
and nexti
to move one machine instruction at a time. Use C-x o to switch between the TUI windows.
下载关于您的 CPU 的机器语言和函数调用约定的 PDF.您将很快学会识别函数参数和返回值的作用.
Download a PDF about your CPU's machine language and the function calling conventions. You will quickly learn to recognize what is being done with function arguments and return values.
您可以使用像 p $eax
这篇关于为什么 GDB 在行之间不可预测地跳转并将变量打印为“<值优化输出>"?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,WP2