2016-09-01 13 views
11

Czy istnieje sposób w lldb do nadpisania zmiennej tylko do odczytu.Zastąp zmienną tylko do odczytu lldb swift

Na przykład jeśli miał struct

struct Object { 
    let name: String 
} 

wykonując następujące czynności w na przerwania w Xcode z lldb

(lldb) expression object.name = "Tom" 

Spowoduje

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

pełni rozumiem dlaczego tak się dzieje, po prostu chcesz wiedzieć, czy istnieje łatwy sposób obejścia tego podczas debugowania?

Proszę pamiętać, że jest w Swift & NIE Objective-C

+0

Dlaczego trzeba nadpisać zmienną tylko do odczytu? Ponieważ wiesz, że nie możesz zmienić nazwy 'Object', dlaczego nie zainicjujesz nowego' Object' zamiast zmienić jego nazwę? –

+1

@Joe, ponieważ podczas debugowania i używania lldb często warto zmienić jedną zmienną w środowisku wykonawczym, aby przetestować różne zachowania. Jeśli masz złożony obiekt, który wymaga wtrysku zależności, przydzielenie nowego obiektu staje się bardziej skomplikowane w konsoli. – sbarow

+0

Dlaczego więc nie zmienić let to var? – WMios

Odpowiedz

4

Można użyć polecenia memory write {address} lldb nadpisać pamięć i zmienić wartość ciągu. Udało mi się zrobić to po jednym adresie na raz, ale wygląda na to, że memory write jest w stanie zrobić to jednym razem.

(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. 

Oto przykład (mam nadzieję, że ktoś z większym zrozumieniem lldb i wewnętrznych SWIFT może zapewnić lepszą metodę):

Example using memory write

To pokazuje nadpisanie pamięci jeden bajt na raz . po "Tom".dataUsingEncoding(NSUTF8StringEncoding)! otrzymuje reprezentację heksadecymalną, która służy do przejścia i zastąpienia pamięci obiektu.nazwa. Jestem pewien, że jest łatwiejszy sposób to zrobić (w jednym poleceniu), ale nie mogłem znaleźć prawidłowych wartości parametrów, aby je ściągnąć.

+1

Składnia, która ma zastąpić wszystkie bajty naraz, to 'memory write

...', więc na przykład 'write memory 0x1000022c0 -s 1 66 6F 6F 62 61 72' ... –

+0

Ciekawe rozwiązanie, nie idealne, ale wydaje się działać, dzięki. – sbarow

+1

@ l'L'l Dzięki za odpowiedź na to, próbowałem coś w stylu 'zapisu pamięci 0x1000022c0 -s 6 666F6F626172' który nie działał. @sbarow Dzięki za zaakceptowanie, jest to dość kłopotliwe rozwiązanie. – Austin

Powiązane problemy