Я использую LLDB и мне интересно, как распечатать содержимое определенного адреса памяти, например 0xb0987654.
Как распечатать содержимое адреса памяти с помощью LLDB?
Ответы (5)
В Xcode есть очень красивое окно Memory Browser, которое очень хорошо отображает содержимое адресов памяти. Он также позволяет вам управлять группировкой байтов и количеством отображаемых байтов, а также перемещаться назад или вперед по странице памяти:
Вы можете получить к нему доступ, нажав ⌘^⌥⇧M
. После ввода нажмите Enter, чтобы открыть браузер памяти в главном редакторе.
or
Отладка --> Рабочий процесс отладки --> Просмотр памяти
Обратите внимание на поле в левом нижнем углу, куда вы можете вставить адрес памяти, который хотите проверить!
Документация здесь: https://developer.apple.com/library/ios/recipes/xcode_help-debugger/articles/viewing_memory.html
Связанный ответ здесь: Как открыть браузер памяти в Xcode 4?
Чтобы дополнить ответ Майкла.
Я склонен использовать:
memory read -s1 -fu -c10000 0xb0987654 --force
Это будет печатать в отладчике.
- -s для группировки байтов, поэтому используйте, например, 1 для uint8 и 4 для int
- -f для формата. Я по своей природе забываю правильный символ. Просто поместите оператор с -f, и он ответит вам и предоставит вам список всех опций.
- -c для подсчета байтов
- если вы печатаете более 1024 байт, добавьте --force
Надеюсь это поможет.
«me
» — это команда, которую вы ищете.
Например, эта команда lldb:
me -r -o /tmp/mem.txt -c512 0xb0987654
скопирует 512 байт из вашего адреса памяти в файл /tmp/mem.txt.
например, напечатать память длиной 16x4 байта.
x/16 0xb0987654
Вот простой прием для отображения типизированных массивов фиксированной длины в lldb. Если ваша программа содержит переменную long*, указывающую на 9 элементов, вы можете объявить тип структуры, содержащий фиксированный массив из 9 длинных значений, и привести указатель к этому типу:
long *values = new long[9]{...};
(lldb) expr typedef struct { long values[9]; } l9; *(l9 *)values
(l9) $1 = {
values = {
[0] = 0
[1] = 1
[2] = 4
[3] = 9
[4] = 16
[5] = 25
[6] = 36
[7] = 49
[8] = 64
}
}
Я использую typedef, когда пишу код на C, в C++ он не нужен.
print *(int*)0xb0987654
? - person Basile Starynkevitch   schedule 03.11.2013gdb
, возможно, скомпилировав его из исходников). - person Basile Starynkevitch   schedule 03.11.2013