【问题标题】:Equivalent of "description" for a C++ class in Objective-C++?相当于 Objective-C++ 中 C++ 类的“描述”?
【发布时间】:2014-07-10 16:15:11
【问题描述】:

我希望能够快速调试包含 c++ 类实例的 Objective-c++ 代码。

使用 Objective-c 类,我可以简单地实现 description 以返回人类可读的字符串,然后当我在 lldb 中 po var 时,我立即知道我需要了解的有关实例的任何信息。

我有什么方法可以为从 Objective-C++ 代码中使用的 C++ 类实现这一点吗?

【问题讨论】:

  • 对于一个在 Objective-C++ 中没有使用的 C++ 类,你必须做任何你想做的事情。
  • 我知道我可以添加一个 description() 方法并从 lldb 调用它。我想知道我是否可以在 Xcode(AppCode 的)调试器变量概述中快速看到它,而无需显式调用任何方法,就像我可以为实现 - description 的 Objective-c 类一样。
  • 我认为对于 c++,您需要使用在 Python 中实现的 lldb 扩展。

标签: c++ ios objective-c objective-c++ lldb


【解决方案1】:

在 lldb 中执行此操作的最简单方法是为 C++ 类添加“摘要格式化程序”。这个网页很好地介绍了如何做到这一点:

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

查找“类型摘要”部分。

如果类的 ivar 值直接包含您想查看的有关该类的所有信息,那么您可以构建一个摘要字符串,该字符串将显示 ivar 值和您认为需要的任何标记文本,而无需使用 LLDB Python API 来获取除了班级。如果您需要做更多工作来生成摘要,则必须按照 trojanfoe 的建议使用 Python API。

例如,如果您为 C++ 类编写了“描述”方法,则可以使用 LLDB 的 Python API 调用该方法并将字符串作为摘要返回。但如果可能的话,最好从类的静态知识中生成摘要,因为在调试器中运行代码通常比检查内存要慢。

还有关于如何使用 LLDB Python 接口在同一页面上生成摘要的信息。

您编写的类型摘要可以添加到您的 .lldbinit 文件中,并且当您在 lldb 中打印该类的实例时以及在 Xcode 的 Locals 视图的摘要列中时,都会显示摘要值。

注意,您可以对任何类型、C、C++ 或 ObjC 执行此操作。许多 C++ STL 类和更常见的 Foundation 类具有使用相同机制的内置摘要。那是 lldb 生成您在 Xcode 中看到的单行摘要的方式,而不是描述方法。

【讨论】:

  • 当然,这意味着您仍然必须为作为 C++ 实例的 ObjC 对象中的 ivars 做自己的工作,因为在格式字符串中使用 %@ 仅适用于 ObjC 对象,而不是t 相当于 LLDB 中的 po。例如。您可以将 GetDebugDescription() 成员函数添加到 C++ 对象,然后执行 NSLog(@"foo { bar = %@, cppBar = %s }", self->bar, self->cppBar.GetDebugDescription().c_str( ));或其他。
  • 这里有趣的部分是“po”是一种语言定义的行为。即它的意思是“评估我的表达,然后使用一些语言认可的机制来呈现它的描述”。碰巧ObjC 已经定义了这样的机制(-description)。 OTOH,在 C++ 世界中没有如此明显且普遍认可的东西。你可以在你的对象上实现 ostream 运算符
  • 太棒了!谢谢!不知道.lldbinit。我想知道我是否可以在代码中做一些事情 - 所以这将是一个特定于类的设置,而不是一个特定于 home-dir 的设置。
猜你喜欢
  • 2014-09-13
  • 2010-11-08
  • 1970-01-01
  • 1970-01-01
  • 2014-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多