[函数Arg的值随函数的进入而改变

问题描述 投票:1回答:1

当前,我遇到一个问题,当我进入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) ```
c debugging gdb malloc
1个回答
0
投票

当我进入下一个功能时,block的值再次正确。有什么用?

调试信息描述到GDB如何查找block的值不正确/不正确, GDB无法正确解释调试信息。

前者相当普遍,尤其是在优化代码中。通常执行几个stepi来跳过函数序言,会使GDB再次显示正确的值。

或者,不进行优化而编译代码则使调试更加容易。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.