Как распечатать регистры разборки в консоли XCode - PullRequest
11 голосов
/ 18 октября 2011

Я смотрю какой-нибудь код разборки и вижу что-то вроде 0x01c8f09b <+0015> mov 0x8(%edx),%edi, и мне интересно, каково значение %edx или %edi.

Есть ли способ вывести значение %edx или других переменных сборки? Есть ли способ напечатать значение по адресу памяти, на который указывает %edx (я предполагаю, что edx - это регистр, содержащий указатель на ... что-то здесь).

Например, вы можете напечатать объект, набрав po в консоли, так есть ли команда или синтаксис для печати регистров / переменных в сборке?

Справка:

Я получаю EXC_BAD_ACCESS в этой строке, и я хотел бы отладить происходящее. Я знаю, что эта ошибка связана с управлением памятью, и я пытаюсь выяснить, где я могу пропустить / слишком много вызовов retain / release / autorelease.

Дополнительная информация:

Это на IOS, и мое приложение работает в симуляторе iPhone.

Ответы [ 5 ]

15 голосов
/ 18 октября 2011

Вы можете распечатать регистр (например, eax), используя:

print $eax

Или для краткости:

p $eax

Чтобы напечатать его в шестнадцатеричном виде:

p/x $eax

Чтобы отобразить значение, на которое указывает регистр:

x $eax

Для получения более подробной информации обратитесь к справке GDB:

help print
help x
9 голосов
/ 25 сентября 2012

Зависит от того, какой компилятор / отладчик Xcode вы используете. Для gcc / gdb это

info registers

но для clang / lldb это

register read
9 голосов
/ 18 октября 2011
(gdb) info reg
eax            0xe  14
ecx            0x2844e0 2639072
edx            0x285360 2642784
ebx            0x283ff4 2637812
esp            0xbffff350   0xbffff350
ebp            0xbffff368   0xbffff368
esi            0x0  0
edi            0x0  0
eip            0x80483f9    0x80483f9 <main+21>
eflags         0x246    [ PF ZF IF ]
cs             0x73 115
ss             0x7b 123
ds             0x7b 123
es             0x7b 123
fs             0x0  0
gs             0x33 51

С Отладка с помощью gdb :

Вы можете ссылаться на содержимое регистра машины в выражениях как на переменные с именами начиная с `$ '. Имена регистров различны для каждой машины; использовать информацию регистрирует, чтобы увидеть имена, используемые на вашем компьютере.

info registers

Печать имен и значений всех регистров, кроме плавающей запятой регистры (в выбранном кадре стека).

info all-registers

Вывести имена и значения всех регистров, в том числе с плавающей запятой регистры.

info registers regname ...

Вывести релятивизированное значение каждого указанного имени реестра. regname может быть любым регистрационным именем, действительным на машине, которую вы используете, с или без начального `$ '.

6 голосов
/ 13 января 2015

Если вы используете LLDB вместо GDB, вы можете использовать register read

2 голосов
/ 18 октября 2011

Это не переменные, а регистры.

В GDB вы можете увидеть значения стандартных регистров, используя следующую команду:

info registers

Обратите внимание, что регистр содержит целочисленные значения (в вашем случае 32 бита, так как имя регистра начинается с префикса e). Что это представляет, неизвестно. Это может быть указатель, целое число, в основном что угодно.

Если po дает сбой при попытке напечатать значение регистра в качестве указателя, вероятно, это значение не является указателем (или недопустимым).

...