【发布时间】:2020-09-07 13:57:13
【问题描述】:
我检查了核心文件,因为在Linux上运行的进程(c++ lang)死了,核心文件的内容
[核心文件]
File "/usr/lib64/../share/gdb/python/libstdcxx/v6/printers.py", line 558, in to_string
return self.val['_M_dataplus']['_M_p'].lazy_string (length = len)
RuntimeError: Cannot access memory at address 0x3b444e45203b290f
我认为printers.py 中的StdStringPrinter 类存在问题。 所以我在这个网站上查找了解释我正在寻找的问题的文本,修改了 printers.py,并在我的主路径上创建了一个 .gdbinit 并编写了内容。
How to enable gdb pretty printing for C++ STL objects in Eclipse CDT?
Eclipse/CDT Pretty Print Errors
但是这种方法与我正在寻找的方法有点不同,因为它是在 Eclipse 中完成的。
我的 gdb 版本是 7.6.1-94.el7
[打印机.py]
class StdStringPrinter:
"Print a std::basic_string of some kind"
def __init__(self, typename, val):
self.val = val
def to_string(self):
# Make sure &string works, too.
type = self.val.type
if type.code == gdb.TYPE_CODE_REF:
type = type.target ()
sys.stdout.write("HelloWorld") // TEST Code
# Calculate the length of the string so that to_string returns
# the string according to length, not according to first null
# encountered.
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']
if hasattr(ptr, "lazy_string"):
return ptr.lazy_string (length = len)
return ptr.string (length = len)
def display_hint (self):
return 'string'
[.gdbinit]
python
import sys
sys.path.insert(0, '/home/Hello/gcc-4.8.2/python')
from libstdcxx.v6.printers import register_libstdcxx_printers
register_libstdcxx_printers (None)
end
我的问题是修改printers.py,写gdbinit,然后重新编译过程测试是否已经应用为修改。 如何在 Linux 终端打印修改后的 TEST 代码?
【问题讨论】: