【问题标题】:Use C++ std::cout in lldb在 lldb 中使用 C++ std::cout
【发布时间】:2013-12-24 04:18:33
【问题描述】:

我正在尝试在 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; 行。

【问题讨论】:

  • 能贴出代码吗?
  • expr std::cout &lt;&lt; "test" 不是一个简单的表达式,我认为它不会在那里工作,因为它涉及函数调用。
  • @DieterLücking,如果“实际代码”是指我的 lldb 命令,我尝试了 std::coutcout。我在其中测试 lldb 命令的项目代码是明确的,因为我在 OP 中编写它,没有 using namespace std; 行。
  • @DieterLücking,不,您可以看到#include &lt;iostream&gt; 行在我的代码示例中明确显示。我还确认了 std::cout 命令在编译后的代码中有效,只是在 lldb 调试器中无效。
  • expr std::cout.operator 怎么样

标签: c++ xcode5 lldb


【解决方案1】:

也许你可以通过其他方式做到这一点:

1、创建一个dylib,导入所有需要的头文件,写一个这样的函数:

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

dylib 的代码是这样的: http://i.stack.imgur.com/H1Q9v.jpg

【讨论】:

  • 这行得通,除了我用 std::cout 包装器构建了一个单独的 Xcode 项目,然后我使用 this other stack overflow post 中的步骤将它包含在我当前的 Xcode 项目中。我不必包含标题来使用mylog 函数;只是图书馆。现在我要做的就是弄清楚如何评估overloaded operators in lldb,以便我可以检查向量元素。
【解决方案2】:

您不能在命令行中使用 std::cout,因为您不能在 WATCH 调试器中使用它,但您可以像这样声明对它的引用:

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

以便您可以在 lldb 中执行命令 expr os &lt;&lt; "ok"

这是我的mac中的运行结果:

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

希望对你有帮助

【讨论】:

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

我不肯定这是一个骗局,但我相信 Jim Ingham 的回答已经结束了

Evaluating an expression with overloaded operators in c++ lldb

可能与您在此处看到的问题高度相关。

【讨论】:

  • 没错,每个问题的根本原因可能是相同的(标准库中的内联模板函数)。您引用的另一篇堆栈交换文章也是我的,这绝非巧合!
猜你喜欢
  • 2020-11-05
  • 2017-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-05
  • 2018-02-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多