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

查看:493
本文介绍了为什么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
赋值的左操作数不是左值。

为什么在执行903行后再次执行905 908 910?



另外一个是 found 是一个 bool -type变量,所以它是显示优化值
我无法将的值设置为



这似乎是编译器优化(在这种情况下,它的 -O2 );如何设置的值

解决方案

优化代码,学习程序集/机器语言。



使用GDB TUI模式。当我输入minus和Enter时,我的GDB副本可以启用它。然后键入C-x 2(即按住Control并按下X,释放两者,然后按下2)。这将把它分成拆分源和反汇编显示。然后使用 stepi nexti 一次移动一条机器指令。使用C-x o在TUI窗口之间切换。



下载有关CPU机器语言和函数调用约定的PDF。您可以快速学会识别正在使用的函数参数和返回值。



您可以使用GDB命令显示寄存器的值,如 p $ eax


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.

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.

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.

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.

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.

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

这篇关于为什么GDB在行间跳转不可预知并将变量打印为“&lt;值优化&gt;”?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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