Eclipse / CDT漂亮的打印错误

时间:2014-05-23 20:02:32

标签: c++ stl eclipse-cdt centos6 pretty-print

首先我要说的是,我已经在这里搜索了其他非常密切相关的问题,但却没有用来解决我的问题。

设定:

  • Win7笔记本电脑,SSH / X11到CentOS 6.4最终运行Eclipse Kepler SR2 w / CDT 8.3
  • GDB 7.2
  • 无法访问Internet的托管公司服务器(因此没有svn co...

我是使用Eclipse / CDT的新手,但熟悉GDB。当我尝试调试使用STL的应用程序时,在第一次出现STL对象时,我得到以下错误。在包含许多STL对象的程序中,我遇到了很多错误,这使得单步执行变得不可能。我这里有一个小样本程序用于说明目的。

这是我的示例程序:

#include <iostream>
using namespace std;

int main() {
    string sComplex;
    sComplex = "!!!Hello World!!!";
    cout << sComplex << endl; // prints !!!Hello World!!!
    //cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!
    cout << "This is a new string that writes out a numeric..." << endl;
    int i = 1000;
    cout << "Value for integer 'i' is : '" << i << "'." << endl;
    cout << "  In HEX: '";
    cout << std::hex << std::showbase << i;
    cout << "'." <<endl;
    return 0;
}

以下是一旦遇到第一行就打印出来的错误(STL字符串实例化):

  

追踪(最近一次通话):    在to_string中输入文件“/usr/lib64/../share/gdb/python/libstdcxx/v6/printers.py”,第558行      return self.val ['_ M_dataplus'] ['_ M_p']。lazy_string(length = len)   RuntimeError:无法访问地址0xffffffffffffffe8

的内存      

追踪(最近一次通话):    在to_string中输入文件“/usr/lib64/../share/gdb/python/libstdcxx/v6/printers.py”,第558行      return self.val ['_ M_dataplus'] ['_ M_p']。lazy_string(length = len)   RuntimeError:无法访问地址0xffffffffffffffe8

的内存      

追踪(最近一次通话):    在to_string中输入文件“/usr/lib64/../share/gdb/python/libstdcxx/v6/printers.py”,第558行      return self.val ['_ M_dataplus'] ['_ M_p']。lazy_string(length = len)   RuntimeError:无法访问地址0xffffffffffffffe8

的内存

首先,请注意这个对象有3个单独的错误。我已经验证安装了python pretty打印模块,我已经尝试过限制 to_string 中的长度,但无济于事。如果我跳过字符串实例化,一切正常,我可以看到变量的简单字符串值。鼠标悬停看起来也不错。当我在命令行上使用gdb直接调试同一个应用程序时,我没有看到任何此类错误和变量值打印漂亮

(gdb) p sComplex
$1 = "!!!Hello World!!!"
(gdb) p sComplex.c_str()
$2 = 0x602028 "!!!Hello World!!!"

我已经尝试了我的.gdbinit文件和Eclipse的Window-&gt; Preferences-&gt; C / C ++ - &gt; Debug-&gt; GDB设置的各种建议,甚至禁用了漂亮的打印,但它仍然会发生。我不知道接下来还有什么可以尝试。

2 个答案:

答案 0 :(得分:0)

我向Eclipse提交了一张票(Pretty Print Errors Render Eclipse Debugging Impossible),Marc Dumais的回答指出这个错误是GDB缺陷的结果。在修补GDB之前,我在Eclipse中使用漂亮的打印(根据Marc的建议)找到解决此错误的唯一方法是隐藏任何活动的Variables窗口/选项卡。这可以防止Eclipse向GDB询问可能尚未初始化的变量的初始值。

在Debug透视图中简单地将Variables选项卡反向接地可以解决问题。该解决方案可能依赖于代码,因为许多未初始化的变量可能仍然难以调试。

答案 1 :(得分:0)

我最终决定重新审视此问题,最后通过遵循类似于this one的解决方案以及我的自定义printers.py的其他编辑来解决此问题。希望这有助于其他人点击这个。

  1. 查看漂亮的打印机(svn co svn://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3/python)到$HOME/gdb/gdb_printers/
    • 如果您无法结帐(如果您的组织阻止外部svn像我一样),请查看您是否可以从系统位置(例如/usr/share/gdb/)复制它。 你完成后应该有这样的目录结构:
  2. gdb printer tree

    此结构必须完整,否则无法在/ v6 /中使用您的printers.py.

    1. 编辑printers.py,具体为StdStringPrinter::to_string,如下所示(添加try / except / else):

      def to_string(self):
          # Make sure &string works, too.
          type = self.val.type
          if type.code == gdb.TYPE_CODE_REF:
              type = type.target ()
      
          # Calculate the length of the string so that to_string returns
          # the string according to length, not according to first null
          # encountered.
          # I wrapped this section in a try/except/else block so that uninitialized
          # strings don't cause massive RuntimeError exception reporting during debugging
          # with or without pretty printers enabled. -jkw
          try:
               ptr = self.val ['_M_dataplus']['_M_p']
               realtype = type.unqualified ().strip_typedefs ()
               reptype = gdb.lookup_type (str (realtype) + '::_Rep').pointer ()
               header = ptr.cast(reptype) - 1
               len = header.dereference ()['_M_length']
          except RuntimeError:
               #print 'Caught exception'
               return ''
          else:
               return self.val['_M_dataplus']['_M_p'].lazy_string (length = len)
      
    2. 创建/编辑$HOME/gdb/.gdbinit文件并在其中加入以下内容。 注意路径必须与&#39; python&#39;的路径匹配。上图/树视图中的目录。

       python
      import sys
      sys.path.insert(0, '/home/(user_id)/gdb/gdb_printers/python')
      from libstdcxx.v6.printers import register_libstdcxx_printers
      register_libstdcxx_printers (None)
      end
      
    3. 在Eclipse中,在Window -> preferences -> C/C++ -> Debug -> GDB下,设置gdb.gdbinit文件的路径。 也可能需要在您要使用printers.py的任何现有调试配置上进行此设置。

      GDB debugger: /usr/bin/gdb
      GDB command file: /home/(user_id)/gdb/.gdbinit
      
    4. 从那里开始,调试功能就像您认为的那样。