Установка: я отлаживаю простую программу на C ++, скомпилированную с параметром -fno-omit-frame-pointer, используя libwarf для DWARF 5. Основная задача - написать отладчик с использованием libdwarf.
Для определенного локальногопеременная dwarfdump показывает:
DW_AT_location len 0x0002: 915c: DW_OP_fbreg -36
В дальнейшем я буду ссылаться на '-36' как 'op1', который я получаю из libdwarf.
Проблема: использование op1 напрямую приводит к неверному значению переменной.(fbPointer - текущее значение указателя базы кадра).
int32_t data = (int32_t) ptrace(PTRACE_PEEKDATA, processPid, fbPointer + op1, 0);
Я также попытался декодировать -36 как sleb128 и usleb128, и для обоих я получил 220. Не очень хорошее значение.
Пробная версия/ error показывает, что если я добавлю 16 к op1, он будет работать для любого числа переменных типа int как параметров и локальных объектов.Однако, это не работает для float / double.
Вопрос: -36, как упоминалось везде, смещение переменной от указателя на основе кадра?Если так, что я делаю не так?Каковы предыдущие значения в DW_AT_location: "len 0x0002: 915c:"?Если они важны для оценки op1, как мне получить их через libdwart?
Большое спасибо.Прошло уже больше недели, как я застрял в этой точке.