为什么LLDB的打印(或p)命令如此有限?

Why is LLDB's print (or p) command so limited?

本文关键字:命令 LLDB 打印 为什么      更新时间:2023-10-16

当我第一次听说它时,它听起来像一个很棒的特性——c++ REPL。然而,它不能调用STL函数或方法,并且有很多其他问题。这个问题也适用于条件断点。

它仍然是一个实验功能,还是开发者已经放弃了它?

的例子:

(lldb) p iterator->aField
error: call to a function 'std::__1::__wrap_iter<aClass const*>::operator->() const' ('_ZNKSt3__111__wrap_iterIPK8aClassEptEv') that is not present in the target
error: 0 errors parsing expression
error: The expression could not be prepared to run in the target

目前,调试器还没有好的方法来生成编译器只发出内联版本的模板专门化方法。调试器不能调用内联方法。

这里有一个有限的技巧(尽管它需要c++ 11),您可以使用它来强制编译器生成相关模板类的完整副本,以便调试器可以调用函数。例如,如果我输入:

template class std::vector<int>;
在我的源代码中

的某个地方,编译器将生成std::vector的int专门化中所有函数的真实副本。这显然不是一个完整的解决方案,您应该只在调试构建中这样做,否则它将使您的代码膨胀。但是当有几个类型需要调用方法时,这是一个很有用的技巧。

你提到了"一大堆其他问题"。请在lldb中发现的任何表达式解析器问题上提交错误,可以使用lldb bugzilla: https://llvm.org/bugs或Apple的错误报告器:http://bugreporter.apple.com。表达式解析器正在积极开发中