Используйте С++ std::cout в lldb

Я пытаюсь вызвать std::cout в lldb в проекте Xcode 5 C++. В моем проекте есть строка #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;.


person Daniel Golden    schedule 06.12.2013    source источник
comment
Можете ли вы опубликовать код?   -  person IllusiveBrian    schedule 06.12.2013
comment
expr std::cout << "test" не является тривиальным выражением, и я думаю, что оно не будет работать там, так как включает вызов функции.   -  person Raxvan    schedule 06.12.2013
comment
@DieterLücking, если под фактическим кодом вы имеете в виду мою команду lldb, я пробовал и std::cout, и cout. Код проекта, в котором я тестировал команды lldb, явно такой, как я написал в ОП, без строки using namespace std;.   -  person Daniel Golden    schedule 06.12.2013
comment
@DieterLücking, нет, вы можете видеть, что строка #include <iostream> явно присутствует в моем примере кода. Я также подтвердил, что команда std::cout работает в скомпилированном коде, но не в отладчике lldb.   -  person Daniel Golden    schedule 07.12.2013
comment
Как насчет expr std::cout.operater‹‹(test)?   -  person ZijingWu    schedule 07.12.2013
comment
@ZijingWu, вы имели в виду std::cout.operator<<("test") (в исходной команде была опечатка). Но результат тот же: error: no member named 'cout' in namespace 'std'.   -  person Daniel Golden    schedule 07.12.2013


Ответы (3)


возможно, вы можете сделать это по-другому:

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< /а>

person ccnyou    schedule 09.12.2013

вы не можете использовать std::cout в командной строке, так как вы не можете WATCH его в ANY отладчике, но вы можете объявить ссылку на него следующим образом:

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

так что вы можете выполнить команду expr os << "ok" в lldb.

вот результат работы на моем Mac:

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

надеюсь, это полезно

person ccnyou    schedule 08.12.2013
comment
Кажется, это печатает структуру os, но на самом деле не печатает строку (хорошо в вашем примере). Кроме того, это не будет работать при отладке общей библиотеки (о которой я не упомянул в ОП), поскольку сложно или невозможно изменить код, чтобы добавить строку std::ostream& os = std::cout;. Я бы предпочел решение только для отладчика. - person Daniel Golden; 09.12.2013

Я не уверен, что это обман, но я верю, что ответ Джима Ингама в

Вычисление выражения с перегруженными операторами в c++ lldb

вероятно, имеет большое отношение к проблеме, которую вы видите здесь.

person Jason Molenda    schedule 09.02.2014
comment
Правильно, основная причина каждой проблемы, вероятно, одна и та же (встроенные шаблонные функции в стандартной библиотеке). Не случайно другая статья по обмену стеками, на которую вы ссылаетесь, тоже моя! - person Daniel Golden; 10.02.2014