鑑於wchar_t* str;
它指向以空字符結尾的utf32(或utf16)字符串,我應該使用什麼命令在lldb中打印它?如何在lldb中打印wchar_t字符串?
3
A
回答
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
我修改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')
相關問題
- 1. C - wchar_t打印不需要的字符
- 2. 如何在Matlab中打印字符串?
- 3. 使用lldb打印帶換行符的字符串
- 4. 如何在c#中打印字符串到打印機?
- 5. 無法打印C++字符串時Xcode8使用LLDB
- 6. 如何在JTextField上打印字符串
- 7. 在數組中打印字符串打印兩個字符?
- 8. 如何打印出字符串索引字符串中字符串的字符
- 9. 如何打印字典字符串
- 10. 如何在另一個字符串之後打印字符串?
- 11. 如何在python中打印沒有ASCII字符的字符串?
- 12. 打印字符串
- 13. 打印字符串
- 14. 如何在另一個打印時打印字符串?
- 15. 如何將wchar_t *轉換爲字符串?
- 16. 打印字符串在python
- 17. 打印「在Java字符串
- 18. 如何將wchar_t(或wchar_t *或CORBA :: WChar *)轉換爲字符串?
- 19. 如何將char字符串轉換爲wchar_t字符串?
- 20. 如何打印類型(任何字符串(IO字符串))?
- 21. 打印給定字符串中的非打印字符?
- 22. (lldb)打印無符號long long in hex
- 23. 如何讓LLDB打印當前行
- 24. Bash:如何打印字符串/ *
- 25. 如何打印長字符串成#
- 26. 如何打印字符串的開頭?
- 27. 如何打印字符串C++ MFC
- 28. 如何打印出一個字符串
- 29. 如何將字符串打印爲ListView
- 30. 如何打印不匹配字符串
從Xcode 4.6.2開始,我需要做什麼來實現這個功能嗎?我將你的sample str和str_utf32_wchar複製/粘貼到我的項目中,而在lldb中打印後者時,我仍然看不到任何內存地址。有什麼方法可以驗證是否發現了'wcharsummary.wchar_SummaryProvider'? –
我剛剛用Xcode 4.6.2的lldb試了一下。當你做'輸入summary -F wcharsummary.wchar_SummaryProvider「wchar_t *」'注意他'wcharsummary'部分引用了python文件的文件名。在我的情況下,它被保存爲'〜/ lldb/wcharsummary.py',所以在該文件中定義的函數被添加到python中的'wcharsummary.'命名空間下。如果你命名你的python文件有些不同,你需要用'type summary add'以不同的方式註冊它。 –
哼,這正是我如何設置,ala [這個pastebin](http://pastebin.com/be4C597C)。仍然沒有運氣。無論如何,感謝您的幫助。 –