【问题标题】:Better variable exploring when debugging C++ code with Eclipse/CDT使用 Eclipse/CDT 调试 C++ 代码时更好地探索变量
【发布时间】:2011-04-08 18:55:04
【问题描述】:

使用 Eclipse 和 CDT 调试 C++ 代码,变量 windows 很麻烦,并且对于标准模板库或 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 的值列表。是否有任何工具、插件或其他修改可以做到这一点?

编辑

以下解决方案不适用于 linux。我正在使用 ubuntu 14.04、eclipse、g++、gdb。

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

【问题讨论】:

    标签: c++ eclipse gdb eclipse-cdt


    【解决方案1】:

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

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

    让 Pretty Printers 在 Windows 上工作(说明应该与其他操作系统类似):

    先决条件

    安装:

    • 打开命令Shell并输入:

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

      svn co svn://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3/python
      
    • 打开 .gdbinit(如果需要,在文本编辑器中创建它)并键入以下内容,将“C:/directory”替换为您将打印机签入的文件夹。

      Python
      导入系统
      sys.path.insert(0, 'C:/directory')
      从 libstdcxx.v6.printers 导入 register_libstdcxx_printers
      register_libstdcxx_printers(无)
      结束

    Eclipse 设置

    • 转到 Windows > 首选项 > C/C++ > 调试 > GDB
    • GDB 调试器将启用 python 的 GDB 的路径放在 mingw /bin 文件夹中,名称类似于 gdb-python27.exe
    • GDB 命令文件将路径放置在您之前创建的 .gdb 初始化文件的位置。

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

    【讨论】:

    • 能否请您给出linux的解决方案...... linux没有mingw,我找不到任何包gdb-python。
    • 开始调试后,我收到错误消息“无法使用命令确定 GDB 版本:gdb-python27.exe --version”。
    • 通过安装 32 位版本的 Python 而不是 64 位解决了问题。
    • 当我这样做并尝试调试时,我得到Error in final launch sequence Failed to execute MI command: -file-exec-and-symbols D:/Dropbox/eclipse/ProofTool/Debug/ProofTool.exe Error message from debugger back end: "D:\Dropbox\eclipse\ProofTool\Debug\ProofTool.exe": not in executable format: File format not recognized "D:\Dropbox\eclipse\ProofTool\Debug\ProofTool.exe": not in executable format: File format not recognized 对我来说,这似乎也是一个 64/32 位问题。我在 Windows 7 64 位上,我想调试 64 位程序。正如@truthseeker 提到的,只有 32 位 python 有效
    • 我现在很确定我需要 64 位版本的 GDB,但 mingw-get 只安装 32 位版本。如何获得 64 位 CDB 版本(在支持 python 的 Windows 上)?我现在被困在这里我的问题:stackoverflow.com/questions/18912471/…
    【解决方案2】:

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

    如果您使用的是 gdb 7.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 一样的类 没有加载漂亮的打印机。

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

    希望对你有帮助!

    【讨论】:

    • 我按照说明设置了正确的路径,但它不起作用。有什么建议可能是错的吗?
    • 它在 Linux 中也不适合我。解决了它在 libstdcxx/v6/__init__.py 文件中注释掉 from libstdcxx.v6.printers import register_libstdcxx_printers register_libstdcxx_printers(gdb.current_objfile()) 行。
    • 它在 Linux 下为我工作。但是我必须将路径设置为 /home/user/pathtoprettyprinters 而 ~/pathtoprettyprinters 不起作用!在 Eclipse 中,我必须将 .gdbinit 的路径放在 window->preferences->C/C++->debug->gdb 下,然后重新创建调试启动配置以使其正常工作。另请参阅:stackoverflow.com/questions/4985414/…
    【解决方案3】:

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

    "vector_name" -> std::_Vector_base&lt;"datatype"&gt; -> _M_impl

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

    【讨论】:

    • 确保在“显示为数组...”之后展开_M_start
    • 这是一个绝妙的答案。不知道为什么这没有被接受。
    • 这适用于vector&lt;T&gt;,因为它具有T[] 类型的基础成员。对于其他 STL 类型,这不起作用。对于向量和字符串,这是一个很好且简单的解决方案。
    【解决方案4】:

    如果您有gdbCDT 的支持(例如,请参阅GDB in Eclipse),您可以试试这个:De-referencing STL containers

    很久以前我也偶然发现了同样的问题。检查 STL 容器很痛苦。然后我找到了该链接并将其中一些定义添加到我的.gdbinit 文件中。在那之后生活变得更轻松了。

    注意:我的 gdb 版本是 7.1,添加这些定义可以正常工作。我不知道在较新版本的gdb 中是否已经包含它们。

    【讨论】:

      【解决方案5】:

      我想扩展 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) 打开一个文本回车,输入以下语句。注意第三行是 指向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目录! 这个目录是由 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(控制台->gdb 跟踪)的输出:

      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】:

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

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

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

        【讨论】:

          猜你喜欢
          • 2011-03-31
          • 1970-01-01
          • 2011-06-30
          • 2011-07-29
          • 2011-04-25
          • 1970-01-01
          • 1970-01-01
          • 2012-01-23
          • 1970-01-01
          相关资源
          最近更新 更多