2016-09-08 14 views
0

json文字列をファイルにうまく印刷するために、LLDB + pythonを試しています。与えられたのstd :: string変数(バッファそれを呼び出す)ために、私はかなりのファイルを印刷するためにPythonのブレークポイントのスクリプト内で次のことを試してみた - すべてが成功していない:C++:LLDB + Python - pythonスクリプトでstd :: stringを出力する方法

json.dump(frame.FindVariable("buffer"), handle, indent=4) 
# ^^^^ error that SBValue* is not serializable 
json.dump(frame.FindVariable("buffer").GetValue(), handle, indent=4) 
# ^^^^ emits null 
json.dump(frame.EvaluateExpression("buffer.c_str()"), handle, indent=4) 
# ^^^^ error that SBValue* is not serializable 
json.dump(frame.EvaluateExpression("buffer.c_str()").GetValue(), handle, indent=4) 
# ^^^^ prints an address...not useful 
json.dump(frame.EvaluateExpression("buffer.c_str()").GetData(), handle, indent=4) 
# ^^^^ error that SBValue* is not serializable 

誰が何を知っています魔法のソースは、json.dump()に渡すために、std :: stringフレーム変数をPython文字列に変換することを許可しますか?

答えて

1

SBValueからの要約が必要です。このページ:

http://lldb.llvm.org/varformats.html

は、より詳細に概要を説明します。 SBValue.GetSummaryコールは、あなたが望むことをします。

lldbが実際には役に立たない値からユーザーフレンドリーな値に変換する必要があるときはいつでも、それはサマリーメカニズムによってこれを行います。たとえば、char *の場合、0x12345が実際の値ですが、実際には "0x12345から始まるC文字列の内容"を見たいと思っています。 GetValueは0x12345、GetSummaryは文字列を表示します。

+0

OK - GetSummary()が近いじらすようにある - 埋め込まれた引用符のいくつかの余分なエスケープが起こっ持っているように見えますしたがって、jsonとしてロードしてダンプするPythonの機能を混乱させます。単に明らかにするために、std :: stringの内容は有効なjsonであり、解析できるはずです。私はそれが無効なjsonになる方法で出力のための文字列を消毒する場合、サマリー出力と思います。 文字列(例えば、.c_str()表現)の文字バッファを他の関数に渡すことができるネイティブのPython文字列に変換する方法が本当に必要です。 –

+1

ああ、GetSummaryは、バイトではなくCコードで入力した文字列を表示するためのものです。文字列バッファの内容を直接読み取るには、バッファのアドレスを取得する必要があります(c_str()がそれを返します)、SBProcess.ReadCStringFromMemoryを使用します。 –

+0

おかげ - ReadCStringFromMemoryは具体的には、トリックを行うようだ: \t JSTR = frame.GetThread()GetProcess()ReadCStringFromMemory。。(frame.EvaluateExpression( "buffer.c_str()")GetValueAsUnsigned()、0xFFFFFFの、E。) 私に使用できるpython文字列(jstr内)を与えてくれます。 'e'はlldb.SBError()型の変数です。この答えを正しいものとしてマークします。 –

0

ジムは上記右のトラックに送ってくれた - 私のために働いた最終的なコードは次のとおりです。

e = lldb.SBError() 
frame.GetThread().GetProcess().ReadCStringFromMemory(frame.E‌​valuateExpression("b‌​uffer.c_str()").GetV‌​alueAsUnsigned(), 0xffffff, e) 
関連する問題