отладка c ++: операторы отладки из консоли - PullRequest
1 голос
/ 22 апреля 2020

Я использую lldb на ма c. Попытка увидеть промежуточные тензорные выходные данные в библиотеке marian.

Такие выражения, как debug (тензор, ""); работать, когда я вставляю их в код и запускаю их (они показывают хорошее представление тензора в стиле массива np), но когда я запускаю их из консоли отладки, я получаю следующее сообщение об ошибке

debug(output, "ads");
warning: Stopped in a C++ method, but 'this' isn't available; pretending we are in a generic context
error: <user expression 5>:1:1: no matching function for call to 'debug'
debug(output, "ads");
^~~~~
note: candidate function not viable: no known conversion from 'const char [4]' to 'const std::__1::string' (aka 'const std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >') for 2nd argument

Есть ли способ разрешить эту интерактивность или сделать так, чтобы отображение тензора отображалось в левом желобе, где отображаются некоторые локальные переменные?

1 Ответ

0 голосов
/ 22 апреля 2020

Подпрограмма, которую вы пытаетесь вызвать, работает, когда вы используете ее в исходном коде, даже если функция принимает std :: string и вы передаете ей строку C, потому что компилятор знает, как преобразовать строку C ( "ads") в std :: string. Анализатор выражений lldb недостаточно умен, чтобы выполнять приведение типов таким образом.

Даже если бы он был достаточно умен, чтобы попробовать это, создание экземпляров шаблона также не является тривиальной операцией, и анализатор выражений lldb только начинает учиться тому, как это делать. Если есть версия вашей функции отладки, которая принимает строку C, вы можете использовать ее. Или, может быть, вы можете добавить в свой код оболочку, которая на самом деле принимает строку C. То, что вы должны иметь возможность легко вызывать в анализаторе выражений.

Я не знаю достаточно о Мэриан, чтобы ответить на вторую часть вашего вопроса. Какое хранилище имеет этот тензор? Это аргумент интересующих вас функций, локальная переменная или какое-то глобальное хранилище?

Кстати, тот факт, что анализатор выражений сказал:

warning: Stopped in a C++ method, but 'this' isn't available; pretending we are in a generic context

вероятно означает, что вы отлаживаете оптимизированный код, поскольку при -O0 компилятор обычно поддерживает this для всей функции. Если вам нужно отладить оптимизированную версию, например, потому что неоптимизированный код слишком медленный, чтобы быть полезным, то это ваша судьба. Но при отладке оптимизированного кода у вас часто не будет доступа в отладчике ко всем переменным, определенным в вашем коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...