代码之家  ›  专栏  ›  技术社区  ›  Danvil

用Eclipse/CDT调试C++代码时更好的变量探索

  •  67
  • Danvil  · 技术社区  · 14 年前

    使用Eclipse和CDT调试C++代码,变量窗口对于标准模板库或Boost(例如SysDypPTR)中定义的类型来说是繁琐的,并不是非常有用的。

    只是一个例子,对于std::vector,这看起来是怎样的:

    bar {...}   
        std::_Vector_base<TSample<MyTraits>, std::allocator<TSample<MyTraits> > >   
            _M_impl {...}   
                std::allocator<TSample<MyTraits> >  {...}   
                _M_start    0x00007ffff7fb5010  
                _M_finish   0x00007ffff7fd4410  
                _M_end_of_storage   0x00007ffff7fd5010  
    

    即使这些类型内部的信息可能有用,在几乎任何情况下,我都希望在这里有一个更清晰的表示,即std::vector的值列表。是否有工具、插件或其他修改可以做到这一点?

    编辑

    以下解决方案不适用于Linux。我使用的是Ubuntu14.04、Eclipse、G++、GDB。

    我找不到gdb python和linux不使用mingw的包

    6 回复  |  直到 10 年前
        1
  •  27
  •   DanChianucci    12 年前

    您需要一个能够使用python来美化打印结构的gdb版本。我知道,至少在使用mingw的Windows上,默认安装中没有提供该选项。

    漂亮的打印机是告诉gdb如何显示给定结构的python模块。你可以自己写,但已经有STL打印机可供下载。

    要让漂亮的打印机在Windows上工作(其他操作系统的说明应该类似):

    先决条件

    安装:

    • 打开命令shell并键入:

      mingw-get install gdb-python
      
    • 当其完成CD到本地目录并通过键入以下内容安装打印机时:

      svn co svn://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3/python
      
    • 打开.gdbinit(如果需要,可以在文本编辑器中创建它),然后用您检查打印机的文件夹键入以下replacing“c:/directory”。

      蟒蛇
      导入系统
      sys.path.insert(0,'c:/directory')
      从libstdcxx.v6.printers导入寄存器libstdcxx\u printers
      注册_libstdcxx_打印机(无)
      结束

    Eclipse设置

    • 转到Windows & gt;首选项& gc/c++gt;调试& gdB;
    • 其中说gdb调试器将路径放到启用python的gdb中,它很可能位于mingw/bin文件夹中,其名称类似gdb-python27.exe。
    • 在这里,它说gdb命令文件将路径放到您之前创建的.gdb init文件中。

    就是这样,像正常的调试一样,STL结构应该更容易阅读。

        2
  •  21
  •   pedromanoel    13 年前

    嗯,gdb本机不支持stl容器。你不能说这是错误的,因为它将暴露STL对象的内部工作,但大多数时候它不是我们想要的,对吗?

    如果你使用的是GDB7.0,你可以利用漂亮的打印机。本网站 http://sourceware.org/gdb/wiki/STLSupport 有一个关于如何设置它们的非常简单的教程。我把你感兴趣的部分抄在下面:

    1. 查看最新的python libstdc++打印机 机器。在本地目录中,执行以下操作:

          svn co svn://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3/python
      
    2. 将以下内容添加到您的~/.gdbinit中。路径需要匹配 上面的python模块在哪里 退房。因此,如果签出给: /home/maude/gdb_printers/,路径 如示例中所述:

          python
          import sys
          sys.path.insert(0, '/home/maude/gdb_printers/python')
          from libstdcxx.v6.printers import register_libstdcxx_printers
          register_libstdcxx_printers (None)
          end
      

    路径应该是唯一的元素 需要在 上面的例子。一旦加载,STL 打印机支持的类 应该多打印一份 人可读格式。打印 使用旧样式的类,使用/r (原始)在打印命令中切换 (即打印/R foo)。这将打印 类就像是python 没有加载漂亮的打印机。

    因为您使用的是EclipseCDT,所以不要忘记将调试配置指向.gdbinit文件。创建新的调试配置时,请转到“调试器”选项卡,并将.gdbinit文件的路径放在“gdb命令文件”字段中。

    希望有帮助!

        3
  •  10
  •   0x0000eWan    11 年前

    在“调试”视图的“变量”列表中,展开向量:

    "vector_name" -gt; std::_Vector_base<"datatype"> -gt; _M_impl

    然后右键单击 _M_start 然后选择“显示为数组…”,键入其长度,然后单击“确定”。现在可以展开向量的每个项。

        4
  •  8
  •   Community Ian Goodfellow    7 年前

    如果你有 gdb 支持 CDT (例如,参见 GDB in Eclipse )您可以尝试: De-referencing STL containers

    很久以前,我也碰到了你同样的问题。检查STL容器很痛苦。然后我找到了那个链接并添加到 .gdbinit 把这些定义归档。在那之后生活更轻松了。

    注: 我的 GDB 版本是7.1,添加这些定义很好。我不知道新版本的 GDB 它们已经包括在内了。

        5
  •  5
  •   William Symionow    11 年前

    我想在Windows 7响应上展开,因为有些关键步骤被省略了:

    这是为带有EclipseCDT的mingw用户提供的

    0)如果没有python gdb,请打开shell/命令并使用mingw-get.exe“安装” 启用了python的gdb,例如

       MinGw-get.exe install gdb-python
    

    1a)从中获取python 2.7.x http://python.org/download/ 安装

    1b)确保在您的环境中设置了pythonpath和pythonhome:

     PYTHONPATH should be C:\Python27\Lib   (or similar)
     PYTHONHOME should be C:\Python27
    

    1c)在你的道路上添加pythonhome

     %PYTHONHOME%;...
    

    2a)打开文本输入,输入以下语句。注意第三行是 指向Python脚本所在的位置。请参阅下面的注释!

    python
    import sys
    sys.path.insert(0, 'C:/MinGW/share/gcc-4.6.1/python')         
    from libstdcxx.v6.printers import register_libstdcxx_printers
    register_libstdcxx_printers (None)
    end
    

    2b)另存为“.gdbinit”注意:Windows资源管理器不允许您命名以 使用资源管理器中的句点。大多数文本编辑(包括记事本)都会允许您。GDB初始化 文件类似于gdb命令的“脚本”,gbd将在加载时执行这些命令。

    2c)“.gdbinit”文件需要位于gdb的工作目录中(很可能是 您的项目根目录,但您的IDE可以告诉您。

    3)打开Eclipse(或其他IDE)首选项对话框。转到C++调试器子菜单。

    4)配置Eclipse使用 C:\MinGW\bin\gdb-python27.exe 作为调试程序和您的 .gdbinit 作为配置文件。

    5a)重新创建所有调试启动配置(删除旧配置并从头创建新配置)。

    --OR--
    

    5b)编辑每个调试配置并将其指向新的gdb-python.exe并将其指向。

    如果遇到问题:

    --不要忘记在上面的python代码中将位置更改为python目录! 这个目录是明格创建的,所以不要去下载漂亮的打印机,明格 在第0步为你做的。只需转到Mingw Install Director共享文件夹, gcc文件夹(有版本号),您将找到python文件夹。这个位置是什么 应该在gdb加载的python脚本中。

    --另外,.gdbinit是一个pita,请确保它的名称正确,并在gdb的工作文件夹中 这不一定是gdb-python.exe所在的位置!加载gdb时查看gdb输出,查看在加载过程中是否出现“python enabled”,以及.gdbinit中的语句是否出现。

    --最后,我有很多关于系统变量的问题。如果python给您“importerror”,那么很可能您没有设置pythonpath或pythonhome。

    --带有“gdb-python27”的目录(例如c:\mingw\bin)也应该在您的路径上,如果是,它会使设置Eclipse更好一些,因为您不需要放置绝对路径。但是,有时.gbdinit需要一条绝对的道路。如果它正常工作,您将在启动调试器时看到gbd(console->gdb traces)的输出,如下所示:

    835,059 4^done
    835,059 (gdb) 
    835,059 5-enable-pretty-printing
    835,069 5^done
    ....
    835,129 12^done
    835,129 (gdb) 
    835,129 13source C:\MinGW\bin\.gdbinit
    835,139 &"source C:\\MinGW\\bin\\.gdbinit\n"
    835,142 13^done
    835,142 (gdb) 
    
        6
  •  2
  •   Manuel Selva    14 年前

    我知道JDT(Eclipse中的Java环境)提供了在调试视图中显示变量值时应用的自定义“格式化程序”。在CDT中快速浏览谷歌也会看到以下页面:

    http://wiki.eclipse.org/CDT/Better_Debugging_%28GSoC_project%29

    我不知道这是否已经集成在主CDT行中,可能是您可以在调试时(在最后一个CDT中)尝试右键单击一个变量,并查看是否有自定义格式化程序条目。如果不可用,我建议您在CDT跟踪器中添加一个新的跟踪器条目以询问此增强功能。