我正在尝试使用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,但是脚本没有说明哪个是行号,我该如何获得它?
答案 0 :(得分:1)
在脚本内部,在某个适当的位置捕获异常,然后根据需要打印异常和回溯。
我想建议你引用一些用gdbpython编写的gdb插件,包括peda,gef,pwndbg等。这些插件实际上使用了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