如何在 LLDB 数据格式化程序中登录到控制台

How to log to the console in an LLDB data formatter

我已经编写了一个 LLDB 数据格式化程序,但我无法让我的日志输出显示在 Xcode lldb 控制台中。 data formatter examples 创建记录器并像这样写入它:

def __init__(self, valobj, dict):
    logger = lldb.formatters.Logger.Logger()
    ...
    logger >> "Providing synthetic children for a vector named " + str(valobj.GetName())

我做到了,并使用命令启用了 lldb 格式化程序日志

log enable -g lldb formatters 

然后当我打印一个变量(例如使用 frame var x)时,我确实看到了很多调试输出,但不是我的。

不幸的是,这是一个已知问题

由于 LLDB 不为自己的日志记录机制公开 SB API,因此 lldb.formatters.Logger 使用与 "log enable" 命令分开的日志记录逻辑

如果您要做的只是在编写数据格式化程序时调试它,您可以只在格式化程序主体中使用 "print" 语句

我已经弄明白了 by looking at the Logger source 更详细。

  1. 要完全启用日志记录,您必须将 lldb.formatters.Logger._lldb_formatters_debug_level 设置为大于 0 的值。引用来源本身:

    • 如果您将其定义为大于 1 的任何值,则每次写入后都会自动刷新日志(较慢但应确保即使我们崩溃也能将大部分内容写入日志)
    • 如果您将其定义为任何大于 2 的值,将自动记录调用函数的详细信息(甚至更慢,但会提供更多详细信息)
  2. 默认情况下,lldb.formatters.Logger 将打印到标准输出。如果您使用 Xcode 进行调试,您将看不到 lldb 的标准输出流。如果要记录到文件,请将 lldb.formatters.Logger._lldb_formatters_debug_filename 设置为所需的文件名。注意:你必须确保文件是可写的,并且不能将它设置为需要 shell 扩展的路径(例如 ~/logfile.log 将不起作用, Python 不会扩展~).

总而言之,我的 __lldb_init_module 看起来像这样:

def __lldb_init_module(debugger, internal_dict):
    lldb.formatters.Logger._lldb_formatters_debug_level = 2
    lldb.formatters.Logger._lldb_formatters_debug_filename = "/Users/Shared/lldb.py.log"

    # followed by debugger.HandleCommand(...)