Значение функции Arg изменяется при входе в функцию - PullRequest
1 голос
/ 28 марта 2020

В настоящее время у меня проблема с тем, что когда я захожу в функцию в GDB, значение аргумента изменяется. Я не могу за свою жизнь понять, что это такое. Как вы можете видеть в функции в целом, значение block равно 0x800000008. Когда я его печатаю, это его значение, а когда я проверяю значения аргументов, это его значение. Затем, когда я по какой-то причине вхожу в write_block, значение block меняется. Но только для этой функции. Когда я выхожу, значение block снова равно 0x800000008, правильное значение. Когда я перехожу к следующей функции, значение block снова становится правильным. Что дает?

Код скомпилирован с флагом оптимизации -O0.

Вот код c, оторванный от рассматриваемой функции mm_malloc

 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) ```

1 Ответ

0 голосов
/ 28 марта 2020

Когда я перехожу к следующей функции, значение блока снова становится правильным. Что дает?

Отладочная информация , описывающая для GDB, как найти значение block, неверна / неточна, или GDB не интерпретирует информация отладки правильно.

Первое довольно распространено, особенно в оптимизированном коде или при использовании более старых компиляторов. Обычно выполнение нескольких stepi с, чтобы пройти мимо пролога функции, заставляет GDB снова отображать правильные значения.

...