gdb内でpython prettyプリンタを作成したいと思います。私はデバッグしようとしているプログラムに隠しデータ型xyzHandleを持っています。私はそのハンドルからC関数を使っていくつかの情報を引き出すことができます。これはgdbデバッガ内で呼び出すことができます。たとえば、:gdb-pythonメソッド内からC関数を呼び出す方法
xyzHandle object1 = api_get_first_object();
(gdb) print (char *)xyz_get_string(1, object1)
私は 'pn'のようなgdbコマンドを作成して使用できます。私は 'xyzHandle'を見れば 'xyz_get_string(1、object1)'を呼び出し、返された文字列を表示するだけの、きれいなプリンタを作成するために、ビルドインのpython(gdb)を使いたいと思います。そのように(gdb)では、単に 'print object1'と入力するだけです。
単純なgdb-python pretty_printerを作成する方法を読んだことがありますが、私はpythonからデバッグしているプログラムにある関数を呼び出す方法がわかりません。
ここに、xyzHandleオブジェクト用のわかりやすいサンプルプリンタがあります。
# To load this into your gdb session
#
# (gdb) python execfile ("script-name")
#
import gdb.printing
class xyzHandlePrinter:
"""Print an xyzHandle object"""
def __init__(self, val):
self.val = val
def to_string(self):
return (str(???how-do-I-call xyz_get_str???))
def build_pretty_printer():
pp = gdb.printing.RegexpCollectionPrettyPrinter("XYZ Library")
pp.add_printer('xyzHandle Printer', '^xyzHandle', xyzHandlePrinter)
return pp
gdb.printing.register_pretty_printer(
gdb.current_objfile(),
build_pretty_printer())