LLDB - Как вывести значение глобальной переменной? - PullRequest
0 голосов
/ 22 января 2019

В моем случае, стек не декодируется правильно, поэтому я не могу использовать связанные с кадром команды. Я пытаюсь использовать какое-то абсолютное имя для чтения переменной из определенного модуля.

Мне удалось найти переменную:

(lldb) image lookup -s os::_mem_serialize_page libjvm.dylib
Address: libjvm.dylib[0x00000000009bd690] (libjvm.dylib.__DATA.__common + 151184)
Summary: libjvm.dylib`os::_mem_serialize_page

Однако я не понимаю, как читать его значение

(lldb) print os::_mem_serialize_page
error: use of undeclared identifier 'os'

(lldb) print libjvm.dylib`os::_mem_serialize_page
error: use of undeclared identifier 'libjvm'

(lldb) x/g libjvm.dylib[0x00000000009bd690]
error: invalid start address expression.
error: address expression "libjvm.dylib[0x00000000009bd690]" evaluation failed

Единственный путь, который я нашел

Найти адрес, подход 1

(lldb) image lookup -v -s os::_mem_serialize_page libjvm.dylib
Address: libjvm.dylib[0x00000000009bd690] (libjvm.dylib.__DATA.__common + 151184)
Summary: libjvm.dylib`os::_mem_serialize_page
 Module: <snip>
 Symbol: id = {0x0000e81e}, range = [0x000000010ee46690-0x000000010ee46698), name="os::_mem_serialize_page", mangled="_ZN2os19_mem_serialize_pageE"

Найти адрес, подход 2

(lldb) image dump symtab libjvm.dylib
Index   UserID DSX Type            File Address/Value Load Address       Size               Flags      Name
------- ------ --- --------------- ------------------ ------------------ ------------------ ---------- ----------------------------------
[59422]  59422     Data            0x00000000009bd690 0x000000010ee46690 0x0000000000000008 0x001e0000 os::_mem_serialize_page

Считать память по адресу, чтобы получить значение переменной

(lldb) x/g 000000010ee46690
0x10ee46690: 0x0000000000000000

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

1 Ответ

0 голосов
/ 23 января 2019

Если бы у вас была отладочная информация для символа, который вы пытаетесь напечатать, тогда ваши попытки «печати» сработали бы. Но не похоже, что у вас есть отладочная информация для библиотеки с этим символом, иначе image lookup -v напечатал бы определяющий модуль компиляции.

У вас, однако, есть символ (который нашла команда image lookup -v). Таким образом, вы должны быть в состоянии напечатать значение из символа.

Проблема в том, что если вы дадите lldb разобранное имя os::_mem_serialize_page, оно начнется с попытки найти «os» (чтобы он мог найти _mem_serialize_page в этом классе или пространстве имен.) Поскольку типов нет, он выиграет ' ничего не знаю про "ос", и на этом все остановится.

Но если вы дадите lldb искаженное имя, то lldb будет искать его прямо из таблицы символов и оттуда сможет перейти по адресу. Это отключит один из шагов выше.

Однако нет никакого способа сказать lldb тип переменной. Без отладочной информации lldb не может узнать тип и не может вывести значение без знания этого.

...