Chr*_*odd 5 python debugging gdb pretty-print
我已经开始尝试为某些C ++数据结构构建gdb漂亮的打印机,但是文档非常薄。
结果,我需要猜测如何做,而且我的漂亮打印机经常会因无用的python异常而崩溃,而没有指示实际问题在哪里。
有什么好的调试漂亮打印机的方法吗?通过在代码中插入对pydb的显式调用,我在其他python程序中取得了成功:
import pydb
pydb.debugger()
Run Code Online (Sandbox Code Playgroud)
但这在gdb中运行python时似乎不起作用-它只是在debugger调用之后运行,并且不会停止,说或做任何事情。
您可以在 gdb 中运行 pdb(python 调试器之一)。下面是一个带有简单示例的 gdb 会话的摘录:
(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)
Run Code Online (Sandbox Code Playgroud)
在这个例子中ObjectSignaturePrinter是一个类,它通过gdb.pretty_printers与ObjectSignaturein 中的类型相关联$1。第二个print命令的输出被拆分;$2 =在到达漂亮的打印机断点之前打印,其余的输出出现在pdbcontinue 命令之后。
这种方法的变体很可能适用于其他 python 调试器。
| 归档时间: |
|
| 查看次数: |
1135 次 |
| 最近记录: |