Как распечатать содержимое адреса памяти с помощью LLDB?

Я использую LLDB и мне интересно, как распечатать содержимое определенного адреса памяти, например 0xb0987654.


person Adam Lee    schedule 03.11.2013    source источник
comment
Вы пробовали print *(int*)0xb0987654 ?   -  person Basile Starynkevitch    schedule 03.11.2013
comment
Я получил сообщение об ошибке, ошибка: не удалось дематериализовать структуру: (нуль) Ошибка при выполнении: не удалось завершить JITExpression   -  person Adam Lee    schedule 03.11.2013
comment
могу ли я переключиться на gdb? Я использую XCode5   -  person Adam Lee    schedule 03.11.2013
comment
Вероятно, да. Ты пробовал? (и вы можете установить gdb, возможно, скомпилировав его из исходников).   -  person Basile Starynkevitch    schedule 03.11.2013
comment
GDB больше нет; просто компилятор LLVM   -  person Adam Lee    schedule 03.11.2013
comment
Когда вы просто печатаете прямую память, подобную этой, которая не может дематериализовать структуру, обычно это означает, что память не читается. Сообщение об ошибке ужасно, но исправить его оказывается непросто. Вы можете использовать чтение памяти, чтобы сказать, действительно ли это так.   -  person Jim Ingham    schedule 06.11.2013
comment
Команда gdb — x/x 0xb0987654 — также работает в lldb.   -  person Paul Beusterien    schedule 08.11.2013


Ответы (5)


В Xcode есть очень красивое окно Memory Browser, которое очень хорошо отображает содержимое адресов памяти. Он также позволяет вам управлять группировкой байтов и количеством отображаемых байтов, а также перемещаться назад или вперед по странице памяти:

введите здесь описание изображения

Вы можете получить к нему доступ, нажав ⌘^⌥⇧M. После ввода нажмите Enter, чтобы открыть браузер памяти в главном редакторе.

or

Отладка --> Рабочий процесс отладки --> Просмотр памяти

Обратите внимание на поле в левом нижнем углу, куда вы можете вставить адрес памяти, который хотите проверить!

Документация здесь: https://developer.apple.com/library/ios/recipes/xcode_help-debugger/articles/viewing_memory.html

Связанный ответ здесь: Как открыть браузер памяти в Xcode 4?

person Eric    schedule 25.02.2014
comment
Лучший ярлык: иногда это комбинации 2-3 специальных клавиш (⌘^⇧, ⌘⌥⇧, ^⌥⇧ или что-то еще). У Apple не осталось ярлыков, и они пошли ва-банк. - person Dog; 21.11.2019
comment
@drewster это так, но из-за нового UX Xcode вам нужно решить, где открыть браузер памяти (поэтому просто нажмите ввод после ввода ярлыка) - person Eric; 06.04.2020
comment
хкод есть хкод. Вопрос касается LLDB. Это не одно и то же. - person RichieHH; 23.06.2021

Чтобы дополнить ответ Майкла.

Я склонен использовать:

memory read -s1 -fu -c10000 0xb0987654 --force

Это будет печатать в отладчике.

  1. -s для группировки байтов, поэтому используйте, например, 1 для uint8 и 4 для int
  2. -f для формата. Я по своей природе забываю правильный символ. Просто поместите оператор с -f, и он ответит вам и предоставит вам список всех опций.
  3. -c для подсчета байтов
  4. если вы печатаете более 1024 байт, добавьте --force

Надеюсь это поможет.

person Khaled Barazi    schedule 03.11.2013

«me» — это команда, которую вы ищете.

Например, эта команда lldb:

me -r -o /tmp/mem.txt -c512 0xb0987654

скопирует 512 байт из вашего адреса памяти в файл /tmp/mem.txt.

person Michael Dautermann    schedule 03.11.2013

например, напечатать память длиной 16x4 байта.

x/16  0xb0987654
person lbsweek    schedule 31.07.2018

Вот простой прием для отображения типизированных массивов фиксированной длины в 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++ он не нужен.

person Patrick Beard    schedule 01.09.2017