2016-09-01 2 views
11

Есть ли способ в lldb перезаписать переменную readonly.Переопределить переменную readlly lldb swift

Например, если у вас на структуру

struct Object { 
    let name: String 
} 

Делать следующее в контрольной точке в Xcode с lldb

(lldb) expression object.name = "Tom" 

будет приводить к

error: <EXPR>:2:19: error: cannot assign to property: 'name' is a get-only property 

Я прекрасно понимаю, почему это происходит, просто хотите знать, есть ли простой способ обойти это во время отладки?

Пожалуйста, обратите внимание, что это в Swift & НЕ Objective-C

+0

Зачем вам нужно перезаписывать переменную readonly? Поскольку вы знаете, что вы не можете изменить имя 'Object', почему бы вам не инициализировать новый« объект », а не изменить его имя? –

+1

@ Joe, потому что, когда вы отлаживаете и используете lldb, часто бывает полезно изменить одну переменную во время выполнения, чтобы протестировать разные типы поведения. Если у вас есть сложный объект, требующий инъекции зависимостей, простое распределение нового объекта становится более сложным в вашей консоли. – sbarow

+0

Так почему бы не изменить let to var? – WMios

ответ

4

Вы можете использовать команду memory write {address} lldb для перезаписи памяти и изменить значение строки. Мне удалось сделать это по одному адресу за раз, но похоже, что memory write способен сделать это один раз.

(lldb) help memory write 
    Write to the memory of the process being debugged. 

Syntax: memory write <cmd-options> <address> <value> [<value> [...]] 

Command Options Usage: 
    memory write [-f <format>] [-s <byte-size>] <address> <value> [<value> [...]] 
    memory write -i <filename> [-s <byte-size>] [-o <offset>] <address> <value> [<value> [...]] 

     -f <format> (--format <format>) 
      Specify a format to be used for display. 

     -i <filename> (--infile <filename>) 
      Write memory using the contents of a file. 

     -o <offset> (--offset <offset>) 
      Start writing bytes from an offset within the input file. 

     -s <byte-size> (--size <byte-size>) 
      The size in bytes to use when displaying with the selected format. 

    This command takes options and free-form arguments. If your arguments 
    resemble option specifiers (i.e., they start with a - or --), you must use 
    ' -- ' between the end of the command options and the beginning of the 
    arguments. 

Вот пример (надеюсь кто-то с большим пониманием lldb и внутренностей Swift может обеспечить лучший метод):

Example using memory write

Это показывает, перезапись В памяти один байт в то время, , po "Tom".dataUsingEncoding(NSUTF8StringEncoding)! получает шестнадцатеричное представление, которое используется для перехода и перезаписывания памяти object.name. Я уверен, что есть более простой способ сделать это (в одной команде), но я не мог понять правильные значения параметров, чтобы отключить его.

+1

Синтаксис для замены всех байтов одновременно: 'memory write

...', так например 'memory write 0x1000022c0 -s 1 66 6F 6F 62 61 72' ... –

+0

Интересное решение, а не идеальное, но кажется, работает, спасибо. – sbarow

+1

@ l'L'l Спасибо за ответ, что я пытался что-то вроде 'memory write 0x1000022c0 -s 6 666F6F626172', который не работал. @sbarow Спасибо, что приняли, это довольно громоздкое решение. – Austin

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