2012-10-16 37 views

回答

7

我假設你想打印它爲utf8。這有點牽扯 - 您需要爲python中的類型創建一個摘要提供程序,該提供程序返回一個用於打印的utf8字符串。這並不是特別複雜。創建像~/lldb/wcharsummary.py與內容的小蟒蛇文件中像這樣中LLDB並設置這條巨蟒功能爲wchar_t的彙總提供商

import lldb 
def wchar_SummaryProvider(valobj, dict): 
    e = lldb.SBError() 
    s = u'"' 
    if valobj.GetValue() != 0: 
    i = 0 
    newchar = -1 
    while newchar != 0: 
     # read next wchar character out of memory 
     data_val = valobj.GetPointeeData(i, 1) 
     size = data_val.GetByteSize() 
     if size == 1: 
     newchar = data_val.GetUnsignedInt8(e, 0) # utf-8 
     if size == 2: 
     newchar = data_val.GetUnsignedInt16(e, 0) # utf-16 
     if size == 4: 
     newchar = data_val.GetUnsignedInt32(e, 0) # utf-32 
     else: 
     return '<error>' 
     if e.fail: 
     return '<error>' 
     i = i + 1 
     # add the character to our string 's' 
     if newchar != 0: 
     s = s + unichr(newchar) 
    s = s + u'"' 
    return s.encode('utf-8') 

負載*;最容易把這個在您的~/.lldbinit文件重複使用:

command script import ~/lldb/wcharsummary.py 
type summary add -F wcharsummary.wchar_SummaryProvider "wchar_t *" 

然後給予一定的來源,有32位的wchar_t的一些UTF32編碼的字符,

NSString *str = @"こんにちは"; // 5 characters long 
wchar_t *str_utf32_wchar = (wchar_t*) [[str dataUsingEncoding:NSUTF32StringEncoding] bytes]; 

LLDB將打印出來的UTF8的我們:

Process 22278 stopped 
* thread #1: tid = 0x1c03, 0x0000000100000e92 a.out`main + 146 at a.m:11, stop reason = step over 
    #0: 0x0000000100000e92 a.out`main + 146 at a.m:11 
    8  
    9  NSString *str = @"こんにちは"; // 5 characters long 
    10  wchar_t *str_utf32_wchar = (wchar_t*) [[str dataUsingEncoding:NSUTF32StringEncoding] bytes]; 
-> 11  printf ("0x%llx 0x%llx 0x%llx 0x%llx\n", (uint64_t) str_utf32_wchar[0], (uint64_t) str_utf32_wchar[1], 
    12            (uint64_t) str_utf32_wchar[2], (uint64_t) str_utf32_wchar[3]); 
    13 
    14  [pool release]; 

(lldb) fr va 
(NSAutoreleasePool *) pool = 0x0000000100108190 
(NSString *) str = 0x0000000100001068 @"こんにちは" 
(wchar_t *) str_utf32_wchar = 0x0000000100107f80 "こんにちは" 

(lldb) p str_utf32_wchar 
(wchar_t *) $0 = 0x0000000100107f80 "こんにちは" 

(lldb) x/16b `str_utf32_wchar` 
0x100107f80: 0xff 0xfe 0x00 0x00 0x53 0x30 0x00 0x00 
0x100107f88: 0x93 0x30 0x00 0x00 0x6b 0x30 0x00 0x00 
(lldb) 
+0

從Xcode 4.6.2開始,我需要做什麼來實現這個功能嗎?我將你的sample str和str_utf32_wchar複製/粘貼到我的項目中,而在lldb中打印後者時,我仍然看不到任何內存地址。有什麼方法可以驗證是否發現了'wcharsummary.wchar_SummaryProvider'? –

+0

我剛剛用Xcode 4.6.2的lldb試了一下。當你做'輸入summary -F wcharsummary.wchar_SummaryProvider「wchar_t *」'注意他'wcharsummary'部分引用了python文件的文件名。在我的情況下,它被保存爲'〜/ lldb/wcharsummary.py',所以在該文件中定義的函數被添加到python中的'wcharsummary.'命名空間下。如果你命名你的python文件有些不同,你需要用'type summary add'以不同的方式註冊它。 –

+0

哼,這正是我如何設置,ala [這個pastebin](http://pastebin.com/be4C597C)。仍然沒有運氣。無論如何,感謝您的幫助。 –

0

我修改Jason的代碼一點點地處理wxString直接而不必改變摘要的10分。

通過在Xcode調試器控制檯中鍵入script命令進行測試,然後粘貼以下代碼並按ctrl-D進行測試。然後再次在lldb提示符處輸入type summary add --python-function wxString_SummaryProvider "wxString"。適用於我的wxWidgets版本。

def wxString_SummaryProvider(valobj, dict): 
    e = lldb.SBError() 
    charPointer = valobj.GetChildMemberWithName('m_impl').GetChildMemberWithName('_M_dataplus').GetChildMemberWithName('_M_p') 
    valobj = charPointer 
    s = u'"' 
    if valobj.GetValue() != 0: 
    i = 0 
    newchar = -1 
    while newchar != 0: 
     # read next wchar character out of memory 
     data_val = valobj.GetPointeeData(i, 1) 
     size = data_val.GetByteSize() 
     if size == 1: 
     newchar = data_val.GetUnsignedInt8(e, 0) # utf-8 
     if size == 2: 
     newchar = data_val.GetUnsignedInt16(e, 0) # utf-16 
     if size == 4: 
     newchar = data_val.GetUnsignedInt32(e, 0) # utf-32 
     else: 
     return '<error>' 
     if e.fail: 
     return '<error>' 
     i = i + 1 
     # add the character to our string 's' 
     # print "char2 = %s" % newchar 
     if newchar != 0: 
     s = s + unichr(newchar) 
    s = s + u'"' 
    return s.encode('utf-8')