首先我要说的是,我已经在这里搜索了其他非常密切相关的问题,但却没有用来解决我的问题。
设定:
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设置的各种建议,甚至禁用了漂亮的打印,但它仍然会发生。我不知道接下来还有什么可以尝试。
答案 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的其他编辑来解决此问题。希望这有助于其他人点击这个。
svn co svn://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3/python
)到$HOME/gdb/gdb_printers/
。
/usr/share/gdb/
)复制它。
你完成后应该有这样的目录结构:
此结构必须完整,否则无法在/ v6 /中使用您的printers.py.
编辑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)
创建/编辑$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
在Eclipse中,在Window -> preferences -> C/C++ -> Debug -> GDB
下,设置gdb
和.gdbinit
文件的路径。 也可能需要在您要使用printers.py的任何现有调试配置上进行此设置。
GDB debugger: /usr/bin/gdb
GDB command file: /home/(user_id)/gdb/.gdbinit
从那里开始,调试功能就像您认为的那样。