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

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

当我第一次听说它时,它听起来像是一个很棒的功能——一个 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),您可以使用它来强制编译器生成相关模板的完整副本 class,以便调试器可以调用函数。例如,如果我输入:

template class std::vector<int>;

在我某处的源代码中,编译器将生成 std::vector 的 int 特化中所有函数的真实副本。这显然不是一个完整的解决方案,您应该只在调试版本中这样做,否则它会使您的代码膨胀。但是当你真正调用方法的类型有几种时,了解它是一个有用的技巧。

你提到一个"whole lot of other issues"。请将您在 lldb 中发现的任何表达式解析器问题提交错误,或者使用 lldb bugzilla:https://llvm.org/bugs, or Apple's bug reporter: http://bugreporter.apple.com。表达式解析器正在积极开发中