Распечатать матрицу броненосца в lldb

Я использую Xcode на macOS Catalina, который поставляется с lldb. Я попытался распечатать матрицу Armadillo после сообщения о переполнении стека gdb">Есть ли способ распечатать матрицу Armadillo в gdb?, но я получил ошибку:

error: 'print_matrix' does not name a template but is followed by template arguments
non-template declaration found by name lookup

Я новичок в C++, поэтому я не уверен, связана ли ошибка с разницей между gdb и lldb или с текущей версией Armadillo, использующей другую структуру данных. (Цитируемый пост был сделан 8 лет назад, так что, возможно, с тех пор то, как работает Armadillo, изменилось).

Я буду признателен за любое исправление этой ошибки или предложение альтернативных способов распечатать матрицу Armadillo во время отладки.


person statuser    schedule 21.02.2020    source источник
comment
Также может быть ошибка в оценщике выражений lldb. Если вы можете собрать небольшой тестовый пример, отправьте сообщение об ошибке на bugs.llvm.org, включая ваш пример.   -  person Jim Ingham    schedule 21.02.2020
comment
Кстати, я не знаю, остается ли макет этих матричных объектов таким же, как в приведенном вами ответе, но если это так, было бы довольно легко написать синтетический дочерний провайдер lldb по линиям gdb довольно принтеры, указанные в ответе. Это имеет те же преимущества в lldb, что и красивые принтеры в gdb, плюс они будут отображаться как раскрываемые типы в представлении Xcode Locals, что очень удобно.   -  person Jim Ingham    schedule 21.02.2020
comment
Инструкции по написанию синтетических дочерних провайдеров в lldb находятся здесь: lldb.llvm.org/use/variable .html#id10   -  person Jim Ingham    schedule 21.02.2020
comment
@JimIngham Спасибо за все комментарии! В качестве быстрого обходного пути я в настоящее время создаю указатель с помощью const double * vector_pointer = vector.memptr() в коде C++ и использую команду lldb parray 10 vector_pointer, где 10 — это количество элементов до длины вектора, которые я хочу проверить.   -  person statuser    schedule 22.02.2020
comment
Вы могли бы видеть, может ли memptr вызываться lldb. Если это так, вы можете сделать: parray 10 vector.memptr() и не добавлять переменные в свой код... Если это не так, было бы хорошо сообщить об ошибке. Вызов функций шаблона в отладчике сложен, но мы пытаемся заставить его работать надежно.   -  person Jim Ingham    schedule 22.02.2020
comment
@JimIngham Я пробовал parray 10 vector.memptr(), но получил error: Couldn't lookup symbols: arma::Mat<double>::memptr(). Я не уверен, следует ли мне называть это ошибкой, поскольку я новичок в lldb и не знаю, как это должно работать...   -  person statuser    schedule 22.02.2020
comment
Многие высокопроизводительные пакеты принудительно встраивают все свои небольшие служебные функции. Но поскольку компилятор оценщика выражений не знает, как скомпилировать все файлы заголовков в пакете (сложно, потому что мы не знаем окружение #define), он не может воссоздать отсутствующие функции. Как правило, это причина того, что ошибка поиска символов невозможна. Предварительное объявление экземпляров шаблона: class arma::Mat<double> в вашем коде заставит компилятор выдать все эти функции. Но это не устойчиво.   -  person Jim Ingham    schedule 24.02.2020
comment
lldb работает над восстановлением шаблонов из заголовков C++, встроенных в модули clang (а вскоре и C++). Но это все еще продолжается, и если библиотека C++ не будет модульной, мы не будем ее поддерживать.   -  person Jim Ingham    schedule 24.02.2020
comment
@JimIngham Большое спасибо за добрые объяснения!   -  person statuser    schedule 25.02.2020