有人能解释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执行相同的操作?

另一件事是found是一个bool类型的变量,那么为什么它显示的是value optimized out呢? 我也不能将值设置为found.

这似乎是一个编译器优化(在本例中为-O2);我怎样才能设置found的值?

推荐答案

要调试优化的代码,请学习汇编语言/机器语言.

使用GDB TUI模式.当我输入减号并输入时,我的GDB副本将启用它.然后键入C-x 2(即按住Control键并按x键,同时松开这两个键,然后按2键).这将把它放入拆分源和反汇编显示中.然后使用stepinexti一次移动一条机器指令.使用C-x o在TUI窗口之间切换.

下载一份关于CPU机器语言和函数调用约定的PDF文件.您将很快学会如何识别函数参数和返回值.

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

C++相关问答推荐

为什么这个select()会阻止?

C/C++中的状态库

为什么这个C程序代码会产生以下结果?

sizeof结果是否依赖于字符串的声明?

在C中使用JMP_buf数组进行线程化(在xv6中测试)

C是否用0填充多维数组的其余部分?

对于C中给定数组中的每个查询,如何正确编码以输出给定索引范围(1到N)中所有数字的总和?

有什么方法可以将字符串与我们 Select 的子字符串分开吗?喜欢:SIN(LOG(10))

MacOS下C++的无阻塞键盘阅读

在函数外部使用内联ASM时无法指定操作数

为什么realloc函数在此代码中修改变量?

C程序向服务器发送TCPRST

将 struct 数组写入二进制文件时发生Valgrind错误

如何在不读取整个字符串的情况下删除UTF8字符串的尾随空格以提高性能?

如何读取程序中嵌入的数据S自己的ELF?

具有正确标头的C struct 定义问题

如何在C中处理流水线中的a、n命令?

如何打印循环调度问题的时间表

C程序printf在getchar while循环后不工作

访问未对齐联合的成员是否为未定义行为,即使被访问的成员已充分对齐?