首页 文章

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

提问于
浏览
67

使用Eclipse和CDT来调试C代码,变量窗口很麻烦,并且对于标准模板库或boost中定义的类型(例如shared_ptr)而言,信息量不大 .

只是一个例子,这对于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的值列表 . 是否有任何工具,插件或其他修改可以做到这一点?

EDIT

以下解决方案不适用于Linux . 我正在使用ubuntu 14.04,eclipse,g,gdb .

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

6 回答

  • 8

    你需要一个能够使用python来打印结构的GDB版本 . 我至少在Windows上使用mingw知道默认安装中没有提供 .

    Pretty Printers是python模块,告诉gdb如何显示给定的结构 . 您可以自己编写,但已有STL打印机可供下载 .

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

    Prerequisites

    • 确保安装了Python 2.7并在系统路径中 .

    http://www.python.org/download/

    • 确保已安装MinGW-get

    http://sourceforge.net/projects/mingw/files/Installer/mingw-get-inst/

    • 确保已安装SVN客户端

    Installation:

    • 打开命令Shell并键入:
    mingw-get install gdb-python
    
    • 完成cd到本地目录并通过键入以下命令安装打印机:
    svn co svn://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3/python
    
    • 打开.gdbinit(如果需要,在文本编辑器中创建)并键入以下内容,将“C:/ directory”替换为您检查打印机的文件夹 .

    来自libstdcxx.v6.printers的Python import sys sys.path.insert(0,'C:/ directory')import register_libstdcxx_printers register_libstdcxx_printers(None)end

    Eclipse Setup

    • 转到Windows>首选项> C / C>调试> GDB

    • 它说GDB调试器将路径放到启用python的GDB上它很可能位于mingw / bin文件夹中,其名称类似于gdb-python27.exe

    • 它说GDB命令文件将路径放到您之前创建的.gdb init文件中 .

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

  • 2

    好吧,gdb本身不支持STL容器 . 你不能说这是不正确的,因为它会暴露STL对象的内部工作,但大多数时候它不是我们想要的,对吧?

    如果您使用的是gdb 7.0,则可以利用漂亮的打印机 . 这个网站http://sourceware.org/gdb/wiki/STLSupport有一个关于如何设置它们的非常简单的教程 . 我复制了您感兴趣的部分:

    将最新的Python libstdc打印机签出到您计算机上的某个位置 . 在本地目录中,执行:svn co svn://gcc.gnu.org/svn/gcc/trunk/libstdc -v3 / python
    将以下内容添加到〜/ .gdbinit中 . 路径需要匹配上面的python模块签出的位置 . 因此,如果签出到:/ home / maude / gdb_printers /,路径将如示例所示:python
    导入系统
    sys.path.insert(0,'/ home / maude / gdb_printers / python')
    来自libstdcxx.v6.printers导入register_libstdcxx_printers
    register_libstdcxx_printers(无)
    结束
    路径应该是上面示例中需要调整的唯一元素 . 加载后,打印机支持的STL类应以更易于阅读的格式打印 . 要以旧样式打印类,请使用print命令中的/ r(原始)开关(即print / r foo) . 这将打印类,就像没有加载Python漂亮打印机一样 .

    由于您使用的是eclipse cdt,请不要忘记将调试配置指向.gdbinit文件 . 创建新的调试配置时,请转到“调试器”选项卡,并将.gdbinit文件的路径放在“GDB命令文件”字段中 .

    我希望有所帮助!

  • 27

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

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

    然后右键单击 _M_start 并选择"Display as array...",键入其长度,然后单击“确定” . 现在,您可以展开向量的每个项目 .

  • 5

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

    很久以前我也偶然发现了同样的问题 . 检查STL容器是一件痛苦的事 . 然后我找到了这个链接,并在我的 .gdbinit 文件中添加了一些定义 . 生活是之后更容易 .

    NOTE: 我的 gdb 版本是7.1,添加这些定义工作正常 . 我不知道在 gdb 的新版本中是否已包含它们 .

  • 9

    我想扩展Windows 7响应,因为省略了一些关键步骤:

    这适用于使用Eclipse CDT的MinGW用户

    0)如果您没有python GDB,请打开shell /命令并使用MinGW-get.exe来“安装”启用Python的GDB,例如

    MinGw-get.exe install gdb-python
    

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

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

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

    1c)将PYTHONHOME添加到PATH中

    %PYTHONHOME%;...
    

    2a)打开文本输入,输入以下语句 . 请注意第3行指向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初始化文件类似于GBD在加载时将执行的GDB命令的“脚本” .

    2c)' . gdbinit'文件需要位于GDB的工作目录中(很可能这是你的项目根目录,但你的IDE可以告诉你 .

    3)打开Eclipse(或其他IDE)首选项对话框 . 转到C Debugger子菜单 .

    4)将Eclipse配置为使用 C:\MinGW\bin\gdb-python27.exe 作为调试器,将 .gdbinit 用作配置文件 .

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

    --OR--
    

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

    如果遇到问题:

    • 别忘了在上面的python代码中将位置更改为python目录!这个目录是由MinGW创建的,所以不要去下载漂亮的打印机,MinGW在第0步为你做了 . 只需转到你的MinGW安装导演,共享文件夹,GCC文件夹(有版本号),你会发现python文件夹 . 这个位置应该是GDB加载的python脚本中的位置 .

    • 另外,.gdbinit是一个PITA,确保它正确命名并且在GDB的工作文件夹中,这不一定是gdb-python.exe所在的位置!在加载GDB时查看您的GDB输出,以查看a)在加载期间是否出现'python-enabled',以及.gdbinit中的语句是否出现 .

    • 最后,我对系统变量有很多问题 . 如果python给你'ImportError',那么你很可能没有设置PYTHONPATH或PYTHONHOME .

    • 'gdb-python27'目录(例如C:\ MinGW \ bin')也应该在你的路径上,如果是,它会使eclipse设置得更好,因为你不需要输入绝对路径 . 但是,有时候.gbdinit需要一条绝对的道路 . 如果它工作,你会在启动调试器时看到gbd(console-> gdb trace)的输出:

    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)
    
  • 21

    我知道JDT(eclipse中的Java环境)提供了在调试视图中显示变量值时应用的自定义“格式化程序” . 在CDT中快速浏览谷歌相同的内容会带来此页面:

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

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

相关问题