在lldb中使用C++的std::cout

15

我正试图在Xcode 5 C++项目的lldb中调用std::cout。我的项目有一个#include <iostream>行(并且我已经验证编译的std::cout命令可以正常工作),但是它没有using namespace std;行。

当我在lldb中停在断点时,我无法调用std::cout

(lldb) expr std::cout << "test"
error: no member named 'cout' in namespace 'std'
error: 1 errors parsing expression

(lldb) expr cout << "test"
error: use of undeclared identifier 'cout'
error: 1 errors parsing expression

对于那些感兴趣的人,我正在尝试使用std :: cout来打印一个OpenCV Mat 对象。但这个细节可能不重要。

我的lldb版本是lldb-300.2.53

按照请求,这是(微不足道的)代码:

#include <iostream>
int main(int argc, const char * argv[])
{
  std::cout << "Hello World" << std::endl;
  return 0;
}

断点位于return 0;行。


你能发布一下代码吗? - IllusiveBrian
expr std::cout << "test" 不是一个简单的表达式,我认为它在那里不起作用,因为它涉及到函数调用。 - Raxvan
@DieterLücking,如果您所说的“实际代码”是指我的lldb命令,那么我尝试了std::coutcout两种方式。在我测试lldb命令的项目中,代码明确就是我在原帖中写的那样,没有using namespace std;这一行。 - Daniel Golden
@DieterLücking,不,您可以看到 #include <iostream> 行明确地出现在我的代码示例中。我还确认了 std::cout 命令在编译后的代码中有效,只是在 lldb 调试器中无效。 - Daniel Golden
expr std::cout.operator<<("test") 怎么样? - ZijingWu
@ZijingWu,你的意思是 std::cout.operator<<("test")(你原来的命令中有一个打字错误)。但结果是一样的:error: no member named 'cout' in namespace 'std' - Daniel Golden
3个回答

4
也许你可以通过另一种方式来完成它:
1、创建一个动态链接库,导入所有需要的头文件,编写如下函数:
void mylog(const MyObject& obj)
{ 
   //assume MyObject is the type you want to view in Debuger
   std::cout << obj << std::endl;
}

在您的桌面上(或其他路径,路径不要太长)构建libdbghelper.dylib。

2、将其加载到您的调试项目中:

(lldb) target modules add /Users/yourName/Desktop/libdbghelper.dylib

3,然后您可以使用命令记录它

(lldb)expr mylog((const MyObject&)myobj);

以下是我Mac上的运行结果:http://i.stack.imgur.com/LBBLJ.jpg

动态库的代码如下所示:http://i.stack.imgur.com/H1Q9v.jpg


这个方法可行,除了我另外建了一个带有std::cout包装器的Xcode项目,然后按照this other stack overflow post中的步骤将其包含在我的当前Xcode项目中。我不需要包含头文件就可以使用mylog函数,只需要库。现在我要做的就是弄清楚如何在lldb中评估重载运算符,以便我可以检查向量元素。 - Daniel Golden

2

你不能在命令行中使用std :: cout,因为你无法在任何调试器中观察它,但你可以像这样声明一个引用:

std::ostream& os = std::cout;

这样你就可以在lldb中执行命令expr os << "ok"

以下是我在我的Mac上运行的结果:

http://i.stack.imgur.com/lHvfa.jpg

希望对你有帮助。


1
这似乎打印了os的结构,但实际上并没有打印字符串(在您的示例中为“ok”)。此外,在调试共享库时,这不起作用(我在OP中没有提到),因为很难或不可能修改代码以添加std :: ostream&os = std :: cout;行。我更喜欢仅限于调试器的解决方案。 - Daniel Golden

1

没错,每个问题的根本原因可能是相同的(标准库中的内联模板函数)。你参考的另一篇堆栈交换文章也是我的,这不是巧合! - Daniel Golden

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接