为什么 GDB 在行之间不可预测地跳转并将变量打印为“<value optimization out>"? [英] Why GDB jumps unpredictably between lines and prints variables as "<value optimized out>"?

查看:16
本文介绍了为什么 GDB 在行之间不可预测地跳转并将变量打印为“<value optimization out>"?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

谁能解释一下 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 类型的变量,那么为什么它显示 value optimization out?我也无法设置 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 模式.当我输入减号并 Enter 时,我的 GDB 副本会启用它.然后输入 C-x 2 (即按住 Control 并按 X,同时松开然后按 2).这将把它放入拆分源和反汇编显示.然后使用 stepinexti 一次移动一条机器指令.使用 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 在行之间不可预测地跳转并将变量打印为“&lt;value optimization out&gt;"?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆