Как использовать красивые отладочные принтеры для просмотра объектов Eigen в QtCreator?

Я пытаюсь увидеть содержимое Eigen в окне Локали и выражения QtCreator:

enter image description here

Я вижу, что это вектор с 10 компонентами:

enter image description here

но когда я его открываю, я получаю:

enter image description here

Я попытался использовать этот script, чтобы сделать трюк. Я сохранил его вместе с пустым файлом __ init __. Py в папку ~/Scripts/Eigen и создал файл .gdbinit:

python
import sys
sys.path.insert(0, '/home/martin/Scripts/Eigen')
from printers import register_eigen_printers
register_eigen_printers (None)
end

Я перезапустил QtCreator, и ничего не изменилось. Я проверил "read.gdbinit при запуске" в настройках QtCreator и все еще ничего.

Меня беспокоит то, что я знаю, что в прошлом просмотр Eigen-объектов работал без вмешательства в некоторые скрипты.

Пожалуйста, что я делаю неправильно?

Я использую:

версия gcc 4.8.1
Ubuntu 13.10
gdb 7.6.1-ubuntu
Qt Creator 3.0.0
Основываясь на Qt 5.2.0

и я компилирую эти флаги:

g++ -c -pipe -gdwarf-4 -fvar-tracking-assignments -g 
    -Wall -W -fPIE -DQT_QML_DEBUG -DQT_DECLARATIVE_DEBUG

EDIT:

как предложил @ggael, я попытался запустить gdb напрямую:

(gdb) run
Starting program: /home/martin/Projects/TestGrounds/test 
Traceback (most recent call last):
  File "/usr/lib/debug/usr/lib/i386-linux-gnu/libstdc++.so.6.0.18-gdb.py", line 59, in <module>
    from libstdcxx.v6.printers import register_libstdcxx_printers
ImportError: No module named 'libstdcxx'
Traceback (most recent call last):
  File "/usr/lib/debug/usr/lib/i386-linux-gnu/libstdc++.so.6.0.18-gdb.py", line 59, in <module>
    from libstdcxx.v6.printers import register_libstdcxx_printers
ImportError: No module named 'libstdcxx'

И затем:

(gdb) print vec
Python Exception <class 'TypeError'> 'map' object is not subscriptable: 
Python Exception <class 'TypeError'> 'map' object is not subscriptable: 
$1 = {<Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >> = {<Eigen::MatrixBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >> = {<Eigen::DenseBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >> = {<Eigen::internal::special_scalar_op_base<Eigen::Matrix<double, -1, 1, 0, -1, 1>, double, double, false>> = {<Eigen::DenseCoeffsBase<Eigen::Matrix<double, -1, 1, 0, -1, 1>, 3>> = {<Eigen::DenseCoeffsBase<Eigen::Matrix<double, -1, 1, 0, -1, 1>, 1>> = {<Eigen::DenseCoeffsBase<Eigen::Matrix<double, -1, 1, 0, -1, 1>, 0>> = {<Eigen::EigenBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >> = {<No data fields>}, <No data fields>}, <No data fields>}, <No data fields>}, <No data fields>}, <No data fields>}, <No data fields>}, 
    m_storage = {m_data = 0x804e020, m_rows = 10}}, <No data fields>}

Пожалуйста, не могли бы вы объяснить, что это значит? Что такое libstdcxx?

Ответ 1

Проблема была, вероятно, в самом отладчике. Я опробовал множество комбинаций

  • загрузить\не загружать .gdbinit
  • загрузить\не загружать системные принтеры.
  • использовать\не использовать модель кода
  • -gdwarf-x флаги компилятора

и ничто из этого не имело значения. Затем я попробовал новую установку Ubuntu 12.04 со старым GDB 7.4 и новым QtCreator 3.0.1, и он сработает! Я получил те же результаты для gcc 4.6, gcc 4.7 и gcc 4.8.1.

Затем я попробовал новейший GDB 7.7 на Ubuntu 13.10, и снова он работал, а GDB 7.5, GDB 7.6 не работал.

Также странно, std::shared_ptr правильно просматривается только в QtCreator 3.0.1.

std::multimap не печатается в любой конфигурации.

#include <iostream>
#include <vector>
#include <map>
#include <string>
#include <memory>

#include <eigen3/Eigen/Dense>

int main(int argc, char *argv[])
{
    std::vector<int> vec(4, 3);
    std::map<int, std::string> map =        {{1,"one"},{2,"two"},{3,"three"}};
    std::multimap<int, std::string> multi = {{1,"one"},{2,"two"},{3,"three"}};

    Eigen::VectorXd vector = Eigen::VectorXd::Constant(3, 3.14);
    std::shared_ptr<Eigen::VectorXd> pointer(new Eigen::VectorXd(vector));

    std::cout << vector << std::endl;
    return 0;
}

enter image description here

Ответ 2

Это ошибка в /usr/lib/debug/usr/lib/i386-linux-gnu/libstdc++.so.6.0.18-gdb.py. Убедитесь, что у вас есть последняя версия пакетов gcc4.8, возможно, эта проблема уже исправлена ​​в unbuntu (она исправлена ​​в debian). См. Эту ошибку запись. В последнем регрессе вы можете исправить этот файл, чтобы он искал в нужном месте.

Ответ 3

Работает для меня, как и ожидалось. Результат выглядит как

vec (10 x 1), ColumnMajor   Eigen::VectorXd
    [0] 3.1400000000000001  double
    [1] 3.1400000000000001  double
    [2] 3.1400000000000001  double
    [3] 3.1400000000000001  double
    [4] 3.1400000000000001  double
    [5] 3.1400000000000001  double
    [6] 3.1400000000000001  double
    [7] 3.1400000000000001  double
    [8] 3.1400000000000001  double
    [9] 3.1400000000000001  double

Удостоверьтесь, что вы используете довольно красивую систему печати Qt Creator, удалив (!) галочку в хороших принтерах Tools/Options/Debugger/GDB/Load. Вам также не нужен код, который вы вложили в ваш .gdbinit в этом случае.