如何使用漂亮的调试打印机在QtCreator中查看Eigen对象?

时间:2014-01-24 19:27:04

标签: c++ qt gdb eigen

我试图在 QtCreator 本地和表达式窗口中查看 Eigen 向量的内容:

enter image description here

我看到它是一个包含10个组件的向量:

enter image description here

但当我点击它打开时,我得到:

enter image description here

我尝试使用this script to do the trick。我将它与空 __ 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 并且没有任何改变。我在QtCreator设置中检查了“在启动时读取.gdbinit”选项,但仍然没有。

令我担心的是,我知道在过去看到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

修改

正如@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

3 个答案:

答案 0 :(得分:5)

这是/usr/lib/debug/usr/lib/i386-linux-gnu/libstdc++.so.6.0.18-gdb.py中的错误。确保你有最新版本的gcc4.8软件包,可能是这个问题已经在unbuntu中修复了(它在debian中修复)。请参阅此错误entry。在最后一个ressort中,您可以修补此文件,以便在正确的位置进行搜索。

答案 1 :(得分:2)

按预期为我工作。输出看起来像

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

通过删除(!)工具/选项/调试器/ GDB /加载系统漂亮打印机中的复选标记,确保使用Qt Creator自己的漂亮打印系统。在这种情况下,您也不需要放入.gdbinit的代码。

答案 2 :(得分:1)

问题可能出在调试器本身。我尝试了很多

的组合
  1. load \不加载.gdbinit
  2. load \不加载系统漂亮的打印机
  3. 使用\不使用代码模型
  4. -gdwarf-x编译器标志
  5. 并且这些都不重要。然后我尝试使用旧的 GDB 7.4 以及全新的 QtCreator 3.0.1 全新安装 Ubuntu 12.04 ,它确实有效!我得到了相同的结果 gcc 4.6 gcc 4.7 gcc 4.8.1

    然后我在 Ubuntu 13.10 上尝试了最新的 GDB 7.7 ,并再次起作用,而 GDB 7.5,GDB 7.6 无效。< / p>

    同样奇怪的是,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