DW_OP_fbreg 'операнд' для получения значения переменной не работает должным образом? - PullRequest
0 голосов
/ 24 августа 2018

Установка: я отлаживаю простую программу на 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?

Большое спасибо.Прошло уже больше недели, как я застрял в этой точке.

1 Ответ

0 голосов
/ 25 августа 2018

Похоже, что DW_OP_fbreg является ссылкой на регистр DWARF, который в этом случае отключен на 16 байт. То есть нам нужно добавить 16 в RBP, реальный регистр, а затем добавить -36 к этому. Наконец, как-то в этом случае -36 является простым числом, а не закодированным sleb128.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...