当前,我遇到一个问题,当我进入gdb中的函数时,arg的值会更改。我无法为我的生活弄清楚这是什么。如您在函数中所看到的,block
的值为0x800000008
。当我打印它的值时,当我检查args的值即它的值时。然后,由于某种原因进入write_block
时,block
的值会更改。但仅适用于此功能。当我退出时,block
的值再次为0x800000008
,即正确的值。当我进入下一个功能时,block
的值再次正确。是什么赋予了?
代码是使用-O0
优化标志编译的。
这里是从所讨论的函数mm_malloc
中删除的C代码
if (block == NULL) {
// Always request at least chunksize
extendsize = max(asize, chunksize);
block = extend_heap(extendsize);
// extend_heap returns an error
if (block == NULL) {
return bp;
}
remove_free_block(block); // extend_heap guarentees teh block is
// on the free list
}
// The block should be marked as free
dbg_assert(!get_alloc(block));
// Mark block as allocated
size_t block_size = get_size(block);
write_block(block, block_size, true);
// Try to split the block if too large
split_block(block, asize);
GDB的输出
(gdb) finish
Run till exit from #0 get_alloc (block=0x800000008) at mm.c:399
0x0000000000404b39 in mm_malloc (size=9904) at mm.c:1175
Value returned is $75 = false
(gdb) n
(gdb) s
get_size (block=0x800000008) at mm.c:323
(gdb) p block
$76 = (block_t *) 0x800000008
(gdb) finish
Run till exit from #0 get_size (block=0x800000008) at mm.c:323
0x0000000000404b77 in mm_malloc (size=9904) at mm.c:1178
Value returned is $77 = 14016
(gdb) step
(gdb) p block
$78 = (block_t *) 0x800000008
(gdb) step
Breakpoint 1, write_block (block=0x80000c3c8, size=14016, alloc=true) at mm.c:440
(gdb) p block
$79 = (block_t *) 0x80000c3c8
(gdb) finish
Run till exit from #0 write_block (block=0x80000c3c8, size=14016, alloc=true) at mm.c:440
mm_malloc (size=9904) at mm.c:1182
(gdb) p block
$80 = (block_t *) 0x800000008
(gdb) step
split_block (block=0x800000008, asize=9920) at mm.c:846
(gdb) p block
$81 = (block_t *) 0x800000008
(gdb) ```
当我进入下一个功能时,block的值再次正确。有什么用?
调试信息描述到GDB如何查找block
的值不正确/不正确,或 GDB无法正确解释调试信息。
前者相当普遍,尤其是在优化代码中。通常执行几个stepi
来跳过函数序言,会使GDB再次显示正确的值。
或者,不进行优化而编译代码则使调试更加容易。