python - 调试 gdb pretty-print

标签 python debugging gdb pretty-print

我已经开始尝试为我的一些 C++ 数据结构构建 gdb pretty-print ,但是 documentation很薄。

因此,我需要猜测如何做事,而我 pretty-print 经常会因无用的 python 异常而崩溃,而没有指示实际问题出在哪里。

有什么调试 pretty-print 的好方法吗?通过在代码中插入对 pydb 的显式调用,我在其他 python 程序中取得了成功:

import pydb
pydb.debugger()

但是在 gdb 中运行 python 时这似乎不起作用——它只是运行通过 debugger 调用并且不会停止或说或做任何事情。

最佳答案

您可以在 gdb 中运行 pdb(python 调试器之一)。以下是带有简单示例的 gdb session 的摘录:

(gdb) print (ObjectSignature *) 0x7f71e4018000
$1 = (ObjectSignature *) 0x7f71e4018000
(gdb) python import pdb
(gdb) python pdb.run('gdb.execute("print $1[0]")')
> <string>(1)<module>()
(Pdb) from svtprinters.printers import ObjectSignaturePrinter
(Pdb) b ObjectSignaturePrinter.to_string
Breakpoint 1 at /svtfs/svtprinters/printers.py:195
(Pdb) c
$2 = > /svtfs/svtprinters/printers.py(196)to_string()
-> sizetypestr = 'invalid'
(Pdb) n
> /svtfs/svtprinters/printers.py(197)to_string()
-> sizetypeidx = int(self.val['mSizeType'])
(Pdb) self.val['mSizeType']
<gdb.Value object at 0x7effc90ff430>
(Pdb) int(self.val['mSizeType'])
3
(Pdb) n
> /svtfs/svtprinters/printers.py(199)to_string()
-> if sizetypeidx < len(self.sizetypes):
(Pdb) self.sizetypes
['unknown', 'meta_1K', 'data_4K', 'data_8K', 'data_16K', 'data_32K', 'data_64K']
(Pdb) n
> /svtfs/svtprinters/printers.py(200)to_string()
-> sizetypestr = self.sizetypes[sizetypeidx]
(Pdb) 
> /svtfs/svtprinters/printers.py(202)to_string()
-> return (20*"%02x"+" %s") % tuple([self.val['mValue'][i] for i in range(20)]+[sizetypestr])
(Pdb) sizetypestr
'data_8K'
(Pdb) c
98d6687a2ea63a134901f0df140b13112e64bfb7 data_8K
(gdb) 

在此示例中,ObjectSignaturePrinter 是一个通过 gdb.pretty_printers$1 中的 ObjectSignature 类型相关联的类>。第二个 print 命令的输出被拆分; $2 = 在到达 pretty-print 断点之前打印,其余输出出现在 pdb continue 命令之后。

这种方法的变体很可能适用于其他 python 调试器。

关于python - 调试 gdb pretty-print ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33837688/

相关文章:

python - 如何在Python中获取UTF-16(十进制)?

python - "POST/myfunction/HTTP/1.1"200 23"中的第二个数字是什么意思?

Python:为什么将 int 与字符串进行相等比较不会引发错误?

debugging - VS2010 调试入口很慢

c - gfortran debugging with gdb : w_powf. c: 没有那个文件或目录

python - 如何在 Python/BS4 中向我的网页抓取脚本添加代理和 header ?

c# - 如何查看在不同计算机上创建的 Visual Studio VSP 文件?

使用 gdb 为 C 模块调试 Python 源代码

gdb - gdb 中的下一个命令无法正常工作

android - android ndk的ndk-gdb与emacs的集成?