首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何应用printers.py修改?(Linux操作系统)

如何应用printers.py修改?(Linux操作系统)
EN

Stack Overflow用户
提问于 2020-05-21 02:06:02
回答 1查看 80关注 0票数 0

我检查了核心文件,因为运行在Linux上的进程(c++ lang)死了,核心文件的内容也失效了。

核心文件

代码语言:javascript
复制
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

我认为StdStringPrinter在printers.py的课上出了问题。因此,我查找了一个文本,解释了我在这个站点上寻找的问题,修改了printers.py,并在我的主页路径上创建了一个.gdbinit,并编写了内容。

如何在Eclipse中为C++ STL对象启用gdb漂亮打印?

Eclipse/CDT漂亮的打印错误

但是这个方法和我要找的方法有点不同,因为它是在Eclipse中完成的。

我的gdb版本是7.6.1-94.el7

printer.py

代码语言:javascript
复制
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

代码语言:javascript
复制
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终端打印修改后的测试代码?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-21 05:12:47

我认为StdStringPrinter在printers.py有一个问题

我认为您从根本上感到困惑,您的问题与printers.py毫无关系。

您没有向我们展示GDB会话,但似乎您已经尝试打印了一些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 (而不是修复任何问题)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61926005

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档