GDB python API - 获取gdb的python API来打印有问题的行号

时间:2017-06-24 05:41:38

标签: python gdb

我正在尝试使用gdb python API将一些调试宏写入c代码。但是在测试脚本时,我发现脚本中的解释错误是在没有行号的情况下报告的。

例如 (gdb) module show obj-template 0x7264b0 "test-entry" Python Exception <class 'IndexError'> list index out of range: Error occurred in Python command: list index out of range

这里我可以看到有一个IndexError,但是脚本没有说明哪个是行号,我该如何获得它?

1 个答案:

答案 0 :(得分:1)

在脚本内部,在某个适当的位置捕获异常,然后根据需要打印异常和回溯。

我想建议你引用一些用gdbpython编写的gdb插件,包括pedagefpwndbg等。这些插件实际上使用了gdbpython的每个功能,并包含编写python gdb插件的非常好的做法。强大的gdbpython插件通常具有用于python异常的漂亮打印机。

例如,这里是gef的backtrace漂亮打印机:(当然你不能直接使用它,因为它包含太多的gef内部函数)

def show_last_exception():
    """Display the last Python exception."""
    print("")
    exc_type, exc_value, exc_traceback = sys.exc_info()
    print(" Exception raised ".center(80, horizontal_line))
    print("{}: {}".format(Color.colorify(exc_type.__name__, attrs="bold underline red"), exc_value))
    print(" Detailed stacktrace ".center(80, horizontal_line))
    for fs in traceback.extract_tb(exc_traceback)[::-1]:
        if PYTHON_MAJOR==2:
            filename, lineno, method, code = fs
        else:
            filename, lineno, method, code = fs.filename, fs.lineno, fs.name, fs.line

        print("""{} File "{}", line {:d}, in {}()""".format(down_arrow, Color.yellowify(filename),
                                                            lineno, Color.greenify(method)))
        print("   {}    {}".format(right_arrow, code))

    print(" Last 10 GDB commands ".center(80, horizontal_line))
    gdb.execute("show commands")
    print(" Runtime environment ".center(80, horizontal_line))
    print("* GDB: {}".format(gdb.VERSION))
    print("* Python: {:d}.{:d}.{:d} - {:s}".format(sys.version_info.major, sys.version_info.minor,
                                                   sys.version_info.micro, sys.version_info.releaselevel))
    print("* OS: {:s} - {:s} ({:s}) on {:s}".format(platform.system(), platform.release(),
                                                    platform.architecture()[0],
                                                    " ".join(platform.dist())))
    print(horizontal_line*80)
    print("")
    return