2015-11-20 111 views
4

我已经开始尝试为我的一些C++数据结构构建gdb漂亮的打印机,但documentation非常薄。因此,我需要猜测如何做事,而且我的漂亮打印机经常会碰到一个没有用处的python异常,而没有说明实际问题在哪里。调试gdb漂亮的打印机

有什么好的方法来调试漂亮的打印机吗?我通过插入一个显式调用的代码pydb曾在其他Python程序的成功:

import pydb 
pydb.debugger() 

但是这似乎并没有在gdb运行时蟒的工作 - 它只是途经debugger呼叫,不停止或说或做任何事情。

+1

确保你设置了“python print-stack full”。这将从例外中获得完整的堆栈跟踪。我从来没有为我的漂亮打印机试过一个python调试器;我大多最终做了打印调试。 –

回答

1

你可以在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) 

在这个例子中是ObjectSignaturePrinter其经由gdb.pretty_printersObjectSignature类型在$1相关联的类别。第二个print命令的输出被拆分;在达到漂亮的打印机断点之前打印$2 =,其余输出显示在pdb continue命令之后。

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

+0

当我尝试这个时,我可以得到尽可能多的'(Pdb)'提示符,但是当我尝试用'b MyObjectPrinter.to_string'设置一个断点时,它只是给了我'End of file'消息。继续给我相同的gdb.error,没有机会找出错误。试图步骤只是埋葬我的GDB的Python代码 –

+0

我编辑我的答案使用导入语句和更简单的断点命令。如果我省略了导入语句并使用了更简单的断点命令,我得到以下输出:'***指定的对象'ObjectSignaturePrinter.to_string'不是函数 或者没有沿着sys.path.'找到。我没有解释为什么断点命令会报告它报告的错误,但是可能会对此进行试验。如果只键入函数名称(省略'b'),则应该告诉您“pdb”是否识别该名称。 –

+0

我在'Pdb.checkline'(我系统上的'/ usr/lib/python2.7/pdb.py'文件中为我使用的gdb二进制文件找到了'End of file'消息的明显来源)。我不确定为什么它会找到一行,如果只指定函数名称,它不会考虑可执行文件。即使我将'to_string'方法替换为只有'pass'语句,或者只是一个字符串而没有别的,这个断点也适用于我。和以前一样,知道'pdb'如何解释那个函数名可能会有所帮助。对我来说,它显示为导入后的一个未绑定的方法(如果我在导入之前尝试,我会得到一个'NameError')。 –