2016-05-13 5 views
0

Я хотел бы установить точку останова в самом начале вызова метода, так что я могу проверить это $ RDI $ риши и т.д.

В Xcode, когда я установил символическую точку останова при вызове метода говорят - [вспомогательный класс doThingWithBlock :], она останавливается в первой строке тела метода, которая уже содержит несколько инструкций после начала вызова метода, как показано на разборке вызова метода ниже.

DebugBlock`-[HelperClass doThingWithBlock:]: 
     0x109844aa0 <+0>: pushq %rbp 
     0x109844aa1 <+1>: movq %rsp, %rbp 
     0x109844aa4 <+4>: subq $0x30, %rsp 
     0x109844aa8 <+8>: leaq -0x18(%rbp), %rax 
     0x109844aac <+12>: movq %rdi, -0x8(%rbp) 
     0x109844ab0 <+16>: movq %rsi, -0x10(%rbp) 
     0x109844ab4 <+20>: movq $0x0, -0x18(%rbp) 
     0x109844abc <+28>: movq %rax, %rdi 
     0x109844abf <+31>: movq %rdx, %rsi 
     0x109844ac2 <+34>: callq 0x109844c74    ; symbol stub for: objc_storeStrong 
     0x109844ac7 <+39>: leaq 0x15a2(%rip), %rax  ; @"hi" 
     0x109844ace <+46>: movl $0x16, %ecx 
     0x109844ad3 <+51>: movl %ecx, %edx 
    -> 0x109844ad5 <+53>: movq -0x18(%rbp), %rsi 
     0x109844ad9 <+57>: movq %rsi, %rdi 
     0x109844adc <+60>: movq %rsi, -0x20(%rbp) 
     0x109844ae0 <+64>: movq %rax, %rsi 
     0x109844ae3 <+67>: movq -0x20(%rbp), %rax 
     0x109844ae7 <+71>: callq *0x10(%rax) 
     0x109844aea <+74>: xorl %ecx, %ecx 
     0x109844aec <+76>: movl %ecx, %esi 
     0x109844aee <+78>: leaq -0x18(%rbp), %rdx 
     0x109844af2 <+82>: movq %rdx, %rdi 
     0x109844af5 <+85>: movb %al, -0x21(%rbp) 
     0x109844af8 <+88>: callq 0x109844c74    ; symbol stub for: objc_storeStrong 
     0x109844afd <+93>: addq $0x30, %rsp 
     0x109844b01 <+97>: popq %rbp 
     0x109844b02 <+98>: retq 

ответ

3

совет Джейсон хорош для более сложных задач, но это довольно обычное требование, так break set имеет возможность специально для управления толкая контрольную точку мимо пролога:

(lldb) перерыв установить -n главного - skip-prologue 0

+0

Отлично! Именно то, что я ищу. –

+0

Hah, я специально искал такой вариант, но пропустил его в выводе 'help br s'. –

1

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

Если вы работаете с простой функцией C, вы можете установить контрольную точку адреса, определяющую имя функции для адреса, например

(lldb) br s -n main 
Breakpoint 1: where = a.out`main + 11 at a.c:3, address = 0x0000000100000f8b 
(lldb) br s -a `main` 
Breakpoint 2: address = 0x0000000100000f80 
(lldb) 

Обозначение обратного хода `` оценивает выражение в обратном направлении по адресу/значению. И breakpoint set --address работает так, как вы ожидали.

Существует даже некоторая специальная магия, в которой вам не нужны обратные ссылки для вещей, которые ожидают адрес, например br s -a. Вы можете сделать br s -a main, и он будет работать - и в качестве особого бонуса вы можете добавить смещения к функциям здесь, например br s -a main+5, который обычно не является допустимым выражением C.

К сожалению, мы работаем с методом objc -[HelperClass doThingWithBlock:], который вы не можете добавить в качестве выражения, подобного мне с main. Я думаю, что в этом случае вам нужно будет найти адрес, сам, например. вы можете разобрать команду в начале, например dis -c 1 -n '-[ViewController setRepresentedObject:]', а затем передать этот адрес в br s -a.

+0

Отличный ответ. «br s -a» в паре с «dis -n» является мощным. –

 Смежные вопросы

  • Нет связанных вопросов^_^