2016-09-01 60 views
11

lldb有沒有辦法覆蓋只讀變量。覆蓋只讀變量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 

我完全理解爲什麼發生這種情況,只想知道在調試過程中是否有簡單的方法來解決這個問題?

請注意,這是斯威夫特& Objective-C的

+0

爲什麼你需要覆蓋只讀變量?既然你知道你不能改變'Object'的名字,爲什麼不初始化一個新的'Object'而不是改變它的名字呢? –

+1

@Joe因爲當你在調試和使用lldb時,在運行時改變一個變量來測試不同的行爲通常是很有用的。如果你有一個需要依賴注入的複雜對象,在控制檯中簡單地分配一個新對象變得更加複雜。 – sbarow

+0

那麼爲什麼不把let改爲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的更多的理解和夫特的內部希望有人能提供一個更好的方法):

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感謝您的答案,我正在嘗試像'內存寫入0x1000022c0 -s 6 666F6F626172'這沒有奏效。 @sbarow感謝您接受,這是一個相當麻煩的解決方案。 – Austin