gdb的行为:价值优化掉 [英] gdb behavior : value optimized out

查看:117
本文介绍了gdb的行为:价值优化掉的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

谁能解释GDB的这种行为?

Can anyone explain this behavior of gdb?

900         memset(&new_ckpt_info,'\0',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?

另外一个事情是发现布尔型变量,那么为什么它显示价值优化掉了
我不能够设置的值发现以及

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 );我怎么能仍然设置的值发现

This seems to be a compiler optimization (in this case its -O2); how can I still set the value of found?

推荐答案

要调试优化code,学习汇编/机器语言。

To debug optimized code, learn assembly/machine language.

使用GDB的TUI模式。我GDB的副本使得它当我输入负和Enter键。然后键入C-X 2(即按住控制和preSS X,松开两个,然后preSS 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.

您可以通过使用GDB命令如点$ EAX

You can display the value of a register by using a GDB command like p $eax

这篇关于gdb的行为:价值优化掉的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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