Как установить точку останова на файле сборки с помощью Xcode? - PullRequest
0 голосов
/ 04 октября 2019

Я пробовал "точку останова [номер строки]", "имя точки останова.s: номер_строки", но они не работают. В настоящее время я должен пройти через все строки, и это хлопот

1 Ответ

2 голосов
/ 04 октября 2019

Как в качестве альтернативы вы можете:

1) показать память с инструкциями по сборке с

di

с явными аргументами

, если вам нужнопротянуть дальше

di -c 1000 ;

если вам нужно разобрать определенный адрес

di -s <address>

2) установить точку останова памяти с помощью

br s -a <memory address you found in previous step>

Другойальтернатива немного более разрушительна, но на самом деле более легка, что может или не может быть полезным в вашем случае. Вы можете сделать недопустимый системный вызов в коде сборки. Ваша программа успешно продолжит выполнение, но lldb прекратит выполнение следующей инструкции после системного вызова с SIGSYS / EXC_SYSCALL. Вы не указали, нацеливаетесь ли вы на x86-64 или на руку, поэтому настройка будет немного отличаться.

Для x86-64 у вас будет

syscall

Предполагая, что ваш регистр rax не является действительным системным вызовом, т.е. в диапазоне 0x2000xxx деструктивная часть будет включать в себя:

1) Обнуление старших 32 битов rax регистра

2) r11 станет rflags

3) rcx станет rip (используется ядром XNU для возврата в пространство пользователя из syscall), однако если вы сделаете один шаг rcx станет rsp, как я упомянул здесь

Для 32 бит и 64 бит выможет сделать системный вызов с:

svc 0x80 

Кстати, любой 1-байтовый номер ^ будет работать, но по соглашению это 0x80. 32bit использует r12 для номера системного вызова. 64bit использует x16. Подробнее здесь & здесь . Так что в основном допустимые диапазоны составляют 0x0 - 0x0xxx. Кажется, что даже недействительные системные вызовы влияют на x0 & x1 (для 64-битных, так как у меня нет 32-битных устройств для тестирования). Так что, если вы примете во внимание x0 & x1, затронутые после системного вызова, и у вас будет x16, который является недопустимым системным вызовом, вы можете идти.

ОБНОВЛЕНИЕ Для @PeterCordes отличное замечание еще Еще одна альтернатива для x86:

int3

т.е. отладочная ловушка

эквивалент руки равен

trap

Разница в подходе против syscall заключается в выполнении программы после того, как int3 / trap продолжит тогда и только тогда, когда присоединен отладчик и после команды lldb continue добавленозначение это никак не повлияет на регистры . При использовании системного вызова программа также продолжит выполнение без отладчика, к которому подключены вышеупомянутые затронутые регистры.

...