当我第一次听到它时,它听起来像一个很棒的功能 - 一个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
答案 0 :(得分:4)
目前,调试器没有好的方法来生成模板特化的方法,编译器只发出内联版本。并且调试器无法调用内联方法。
这是一个有限的技巧(尽管它需要C ++ 11),您可以使用它来强制编译器生成相关模板类的完整副本,以便调试器可以调用函数。例如,如果我把:
template class std::vector<int>;
在我的源代码中,编译器将生成std :: vector的int特化中所有函数的真实副本。这显然不是一个完整的解决方案,你应该只在调试版本中执行此操作,否则它会使代码膨胀。但是当有几种类型你真正称之为方法时,它是一个有用的技巧。
你提到了“很多其他问题”。请在lldb中找到的任何表达式解析器问题上提交bug,或者使用lldb bugzilla:https://llvm.org/bugs或Apple的bug报告器:http://bugreporter.apple.com。表达式解析器正处于活动开发状态