【问题标题】:c++: LLDB + Python - how to print a std::string in the python scriptc++: LLDB + Python - 如何在 python 脚本中打印 std::string
【发布时间】:2017-01-17 00:43:53
【问题描述】:

我正在尝试使用 LLDB + python,以便更好地将 json 字符串打印到文件中。对于给定的 std::string 变量(称为缓冲区),我在 python 断点脚本中尝试了以下操作,以便漂亮地打印到文件 - 均未成功:

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

有谁知道什么魔法酱可以让我将 std::string 帧变量转换为 python 字符串以传递给 json.dump() ?

【问题讨论】:

  • 我发现>>> print(reg.description) 得到了对象的描述,而我从>>> print(reg.value) 得到的只是一个指针。您知道这一点,但我是为最终出现在此 SO 页面上的其他人写的。参考:lldb.llvm.org/python_reference/lldb.SBValue-class.html

标签: c++ lldb


【解决方案1】:

Jim 在上面的正确轨道上发送给我 - 对我有用的最终代码是:

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

【讨论】:

    【解决方案2】:

    您需要 SBValue 的摘要。本页:

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

    更详细地描述了摘要。 SBValue.GetSummary 调用将执行您想要的操作。

    任何时候 lldb 需要从实际但无用的值转换为用户友好的值时,它都会通过汇总机制来完成。例如,对于 char *,0x12345 是实际值,但您确实希望看到“从 0x12345 开始的 C 字符串的内容”。 GetValue 将显示 0x12345,GetSummary 字符串。

    【讨论】:

    • ok - GetSummary() 非常接近 - 但它似乎对嵌入的引号进行了一些额外的转义,从而扰乱了 python 加载和转储为 json 的能力。为了清楚起见,std::string 的内容是有效的 json,应该能够被解析。我认为摘要输出是否以使其无效的 json 的方式清理输出字符串。我真正想要一种方法将字符串的字符缓冲区(例如,.c_str() 表示)转换为可以传递给其他函数的本机 python 字符串。
    • 啊,是的,GetSummary 用于向您显示字符串,就像您在 C 代码中键入的那样,而不是字节。要直接读取字符串缓冲区的内容,您需要获取缓冲区的地址(c_str() 返回),然后使用 SBProcess.ReadCStringFromMemory。
    • 谢谢 - ReadCStringFromMemory 似乎可以解决问题,特别是: jstr = frame.GetThread().GetProcess().ReadCStringFromMemory(frame.EvaluateExpression("buffer.c_str()").GetValueAsUnsigned(), 0xffffff, e) 给了我一个 python 字符串(在 jstr 中),然后我可以使用它。 e 是 lldb.SBError() 类型的变量。我将把这个答案标记为正确。
    猜你喜欢
    • 2015-09-01
    • 2014-03-08
    • 1970-01-01
    • 2016-09-07
    • 2012-12-23
    • 1970-01-01
    • 2021-01-11
    • 2018-02-10
    • 1970-01-01
    相关资源
    最近更新 更多