2012-10-16 39 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')