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

时间:2015-08-03 22:02:06

标签: c++ lldb

当我第一次听到它时,它听起来像一个很棒的功能 - 一个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

1 个答案:

答案 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。表达式解析器正处于活动开发状态