"?-6ren"> "?-谁能解释一下 gdb 的这种行为? 900 memset(&new_ckpt_info,'\0',sizeof(CKPT_INFO)); (gdb) **903 pre-6ren">
gpt4 book ai didi

c - 为什么 GDB 在行之间不可预测地跳转并将变量打印为 ""?

转载 作者:太空狗 更新时间:2023-10-29 16:15:31 28 4
gpt4 key购买 nike

谁能解释一下 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 执行相同的操作?

另一件事是发现是一个bool类型的变量,那么为什么它显示优化值?我也无法设置 found 的值。

这似乎是一个编译器优化(在本例中是 -O2);如何设置 found 的值?

最佳答案

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

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

下载有关您的 CPU 机器语言和函数调用约定的 PDF。您将很快学会识别函数参数和返回值的作用。

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

关于c - 为什么 GDB 在行之间不可预测地跳转并将变量打印为 "<value optimized out>"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1345338/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com