【问题标题】:How to call a C function from within gdb-python method如何从 gdb-python 方法中调用 C 函数
【发布时间】:2017-12-11 15:34:38
【问题描述】:

我想在 gdb 中创建一个 python 漂亮的打印机。我正在尝试调试的程序中有一个隐藏的数据类型 xyzHandle。我可以使用 C 函数从该句柄中提取一些信息;我可以在 gdb 调试器中调用它。例如:

xyzHandle object1 = api_get_first_object();

(gdb) print (char *)xyz_get_string(1, object1)

我知道我可以创建一个像“pn”这样的 gdb 命令并使用它;但我想使用(gdb)的内置python来创建一个漂亮的打印机,如果它看到'xyzHandle',它将调用'xyz_get_string(1,object1)'并打印返回的字符串。这样在 (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())

【问题讨论】:

    标签: python debugging gdb


    【解决方案1】:

    创建一个漂亮的打印机,如果它看到“xyzHandle”,它将调用“xyz_get_string(1, object1)”并打印返回的字符串

    这通常是个坏主意:您漂亮的打印机将在“实时”进程中工作,但在事后(core 文件)调试中会出错。如果您在纯 Python 中复制 xyz_get_string 的功能,通常会更好。

    我不知道如何调用驻留在我从 python 调试的程序中的函数。

    您可以为此使用gdb.parse_and_eval

    【讨论】:

      猜你喜欢
      • 2016-03-31
      • 1970-01-01
      • 2015-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-29
      • 1970-01-01
      相关资源
      最近更新 更多