2016-09-01 9 views
11

ओवरराइड करें क्या एक पाठक चर को ओवरराइट करने के लिए lldb में कोई तरीका है।रीडोनली वेरिएबल एलएलडीबी स्विफ्ट

उदाहरण के लिए यदि आप एक struct

struct Object { 
    let name: String 
} 

था lldb साथ Xcode में एक ब्रेकप्वाइंट पर में निम्नलिखित कर

(lldb) expression object.name = "Tom" 

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

में परिणाम होगा मैं पूरी तरह से समझते क्यों ऐसा होता है, बस यह जानना चाहते हैं कि डिबगिंग के दौरान इसे पाने का कोई आसान तरीका है या नहीं?

कृपया ध्यान दें यह स्विफ्ट & में है नहीं ऑब्जेक्टिव-सी

+0

आपको एक पाठक चर को ओवरराइट करने की आवश्यकता क्यों है? चूंकि आप जानते हैं कि आप 'ऑब्जेक्ट' का नाम नहीं बदल सकते हैं, तो आप इसका नाम बदलने के बजाए एक नया 'ऑब्जेक्ट' क्यों शुरू नहीं करते? –

+1

@ जो क्योंकि जब आप डीबगिंग कर रहे हैं और एलएलडीबी का उपयोग करते हैं तो अक्सर विभिन्न व्यवहारों का परीक्षण करने के लिए रनटाइम पर एक चर बदलने के लिए उपयोगी होता है। यदि आपके पास एक जटिल वस्तु है जिसके लिए निर्भरता इंजेक्शन की आवश्यकता होती है तो बस एक नई वस्तु आवंटित करने से आपके कंसोल में अधिक जटिल हो जाता है। – sbarow

+0

तो क्यों नहीं 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)! हेक्स प्रतिनिधित्व प्राप्त करता है, जिसका उपयोग ऑब्जेक्ट.नाम की स्मृति को पार करने और ओवरराइट करने के लिए किया जाता है। मुझे यकीन है कि ऐसा करने का एक आसान तरीका है (एक कमांड में), लेकिन मैं इसे खींचने के लिए सही पैरामीटर मानों को समझ नहीं पाया।

+1

वाक्य रचना सभी बाइट्स एक ही बार में बदलने के लिए 'स्मृति लिखने

तो उदाहरण के' स्मृति के लिए 0x1000022c0 -s 1 66 6F लिखने 6F 62 61 72' ... –

+0

दिलचस्प समाधान, आदर्श नहीं है, लेकिन है ... ', काम करता है, धन्यवाद। – sbarow

+1

@ l'l'l इसका जवाब देने के लिए धन्यवाद, मैं कुछ मेमोरी लिख 0x1000022c0 -s 6 666F6F626172' की कोशिश कर रहा था जो काम नहीं करता था। @sbarow स्वीकार करने के लिए धन्यवाद, यह एक बहुत ही बोझिल समाधान है। – Austin

संबंधित मुद्दे