我已经尝试了好几周才能让lldb在Mavericks上使用C ++ 11,而我却无法让它可靠地运行。有人管理过吗?你采取了什么确切的步骤?
我发现的症状包括:
(1)无法调用基本的std函数,比如我在代码中有向量v,我不能调用" v.size()" (之前的StackOverflow响应与此一致)。
(2)通常会一直混淆数据类型和类。有时它理解简单的东西,有时它只会给出奇怪的错误信息,并且会误解用户类型。
(3)如果我停止代码并调用一堆其他函数,lldb有时会变得非常混乱,我看到了完全奇怪的运行时行为(例如,我从lldb调用函数并获得逻辑上不可能的结果,好像调用堆栈或内存以某种方式被破坏了。)
(4)有时lldb只是放弃,似乎忘记了它在堆栈中的位置。
我知道这些是模糊的,但有没有人广泛使用lldb进行表达式评估(不仅仅是断点,而是使用调试器调用函数和方法)并且lldb有效吗?我有这些非常复杂,非常大的数据结构,需要一个交互式调试器来操作它们,并以交互方式(即一个repl)调用它们上的方法。
不是问题的一部分,但如果有人知道真正的C ++ 11调试器可以在运行时以交互方式调用方法和评估函数,并且在MacOS Mavericks上可靠地工作,我将非常感激。
N.B。早期的MacOS版本与Mavericks完全不同。
答案 0 :(得分:2)
我不知道2-4,他们的具体程度不足以说明问题。但#1在OS X上对新的C ++标准库来说是一个问题。它非常积极地内联大多数std :: *函数,而不是创建脱机副本。这实际上通常正是你想要的,但它不方便调试!
您通常会看到以下错误:
(lldb) expr my_vec.size()
error: call to a function 'std::__1::vector<int, std::__1::allocator<int> >::size() const' ('_ZNKSt3__16vectorIiNS_9allocatorIiEEE4sizeEv') that is not present in the target
这是因为没有可以调用的功能,只有内联版本在您的代码中散布。
在C ++ 11中,你可以解决这个问题,如果你事先知道你想要在某个特定的模板类中调用函数:
template class std::vector<int>;
例如,在你的代码中。可能想在某种#ifdef DEBUG构造中执行此操作,您不希望以这种方式发送代码。