В моем случае, стек не декодируется правильно, поэтому я не могу использовать связанные с кадром команды.
Я пытаюсь использовать какое-то абсолютное имя для чтения переменной из определенного модуля.
Мне удалось найти переменную:
(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
Но это неудобно, потому что это занимает несколько шагов, и я должен сам указать тип переменной.