В настоящее время у меня проблема с тем, что когда я захожу в функцию в 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) ```