只支持python3,并且编译Python时要去掉优化,在Makefile中把-O3改成-O0这样PyEval_EvalFrameEx的参数就不会被优化.
在~/.gdbinit加入下面代码
define pyframeargs
set $_f = (PyFrameObject *)$arg0
printf ">file name :%s\n", (char *)(&((PyUnicodeObject*)$_f->f_code->co_filename)->_base->_base + 1)
printf ">function:\":%s\"\nline:%d\n", (char *)(&((PyUnicodeObject*)$_f->f_code->co_name)->_base->_base + 1), $_f->f_lineno
set $_i = 0
printf ">function args:\n"
set $_vars = (PyCodeObject *)$_f->f_code->co_varnames
set $_values = $_f->f_valuestack
while $_i < $_f->f_code->co_argcount
set $_n= *((*(PyTupleObject *)$_vars)->ob_item + $_i)
set $_v= *($_values + $_i)
printf ">%s:", (char *)(&((PyUnicodeObject *)$_n)->_base->_base + 1)