2017-12-11 4 views
2

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()) 

答えて

1

それはxyzHandle」を見れば、それは「(オブジェクト1、1)xyz_get_string」と呼ぶと、ちょうどこれは、一般的に悪い考えである返された文字列

を印刷することプリティプリンタを作成します:あなたのかわいいプリンタは「ライブ」プロセスで動作しますが、死後(coreファイル)のデバッグではエラーになります。純粋なPythonでxyz_get_stringの機能を複製すると、一般的には良いでしょう。

私はPythonからデバッグしているプログラムに存在する関数を呼び出す方法がわかりません。

これにはgdb.parse_and_evalを使用できます。

関連する問題