python - 如何应用 printers.py 修改?(Linux 操作系统)
问题描述
我检查了核心文件,因为在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 并编写了内容。
如何在 Eclipse CDT 中为 C++ STL 对象启用 gdb 漂亮打印?
但是这种方法与我正在寻找的方法有点不同,因为它是在 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 代码?
解决方案
我认为printers.py 的StdStringPrinter 类有问题
我认为您从根本上感到困惑,并且您的问题与printers.py
.
您没有向我们展示您的 GDB 会话,但您似乎试图打印一些 type 变量std::string
,当您这样做时,GDB 产生了这个错误:
RuntimeError: Cannot access memory at address 0x3b444e45203b290f
这个错误意味着 GDB 无法从内存位置读取值0x3b444e45203b290f
。在x86_64
系统上,这样的位置确实不可读,因为该地址没有规范的形式。
结论:您遵循的指针(可能是std::string
程序中的指针)实际上并不指向std::string
. “修复”printers.py
并不能解决这个问题。
这一结论得到证实
在 Linux 上运行的进程(c++ lang)死了,
最后,您给 GDB 打印的指针:0x3b444e45203b290f
看起来可疑地像一个ASCII
字符串。解码它,我们有:\xf); END;
. 因此,您的程序很可能); END;
在指针应该在的位置上乱涂乱画,并且您有某种缓冲区溢出。
附言
我的问题是修改printers.py,写gdbinit,然后重新编译过程测试是否已经应用为修改。
printers.py
这个问题也显示了对如何工作的根本误解。它与您的程序无关(它已加载到 GDB 中)。
不需要重新编译任何东西(您的程序或 GDB)。只需重新启动 GDB 就可以获取新版本的(而不是解决任何问题)。printers.py
推荐阅读
- xml - 使用 Xslt 从 XML 中删除重复项
- angular - fromEvent 抛出 TypeError:Angular 测试中的事件目标无效
- python - Python、英特尔 Python 和多核处理器
- python-3.x - 仅将可见点写入重叠散点图的磁盘
- python - 在 Pandas 中随着时间的推移绘制带有另一列标签的列
- python - 从 numpy 理解 _r
- javascript - 单个 html 元素的滚动指示器
- swift - 如何使用完成按钮确认我在 UIPickerView 中的选择?
- spring-boot - SpringBoot自定义ConstraintValidator没有被触发
- javascript - 按目录获取 azure 容器 blob 列表