nullで終了するutf32 wchar_t* str;
(またはutf16)文字列を指すものを指定すると、lldbに出力するためにどのコマンドを使用する必要がありますか?
質問する
4960 次
2 に答える
9
utf8として印刷したいと思います。少し複雑です。印刷用にutf8文字列を返すPython型のサマリープロバイダーを作成する必要があります。ただし、特に複雑ではありません。~/lldb/wcharsummary.py
次のような内容の小さなPythonファイルを作成します
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')
これをlldbにロードし、このpython関数をwchar_t*のサマリープロバイダーとして設定します。~/.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)
于 2012-10-17T01:51:42.060 に答える
0
ポインターwxString
の要約を変更する代わりに、直接処理するようにJasonのコードを少し変更しました。int*
script
Xcodeデバッガコンソールでコマンドを入力し、以下のコードを貼り付けて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')
于 2013-08-17T12:04:42.347 に答える