我希望创建一个应用程序,其中嵌入了Python解释器和基本的调试功能。现在我正在查找API函数,以便能够逐步运行代码并获取当前正在执行(或即将执行)的代码行号。
官方Python文档在跟踪和分析方面似乎有些不足。例如,没有关于
到目前为止,我已经收集了以下内容:
然而,编译器输出以下错误:
我发现我可以用
可执行文件输出如下:
官方Python文档在跟踪和分析方面似乎有些不足。例如,没有关于
Py_tracefunc
返回值含义的信息。到目前为止,我已经收集了以下内容:
#include <Python.h>
static int lineCounter = 0;
int trace(PyObject *obj, PyFrameObject *frame, int what, PyObject *arg)
{
if(what == PyTrace_LINE)
{
lineCounter += 1;
printf("line %d\n", lineCounter);
}
return 0;
}
int main(int argc, char *argv[])
{
wchar_t *program = Py_DecodeLocale(argv[0], NULL);
if (program == NULL) {
fprintf(stderr, "Fatal error: cannot decode argv[0]\n");
exit(1);
}
Py_SetProgramName(program); /* optional but recommended */
Py_Initialize();
PyEval_SetTrace(trace, NULL);
char *code = "def adder(a, b):\n"
" return a + b\n"
"x = 3\n"
"y = 4\n"
"print(adder(x, y))\n";
PyRun_SimpleString(code);
Py_Finalize();
PyMem_RawFree(program);
return 0;
}
然而,编译器输出以下错误:
hello.c:5:26: error: unknown type name ‘PyFrameObject’
int trace(PyObject *obj, PyFrameObject *frame, int what, PyObject *arg)
^
我正在使用ManjaroLinux操作系统,并使用以下内容进行编译:
gcc -o hello hello.c -I/usr/include/python3.5m -Wno-unused-result -Wsign-compare -Wunreachable-code -march=x86-64 -mtune=generic -O2 -pipe -fstack-protector-strong --param=ssp-buffer-size=4 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -L/usr/lib -lpython3.5m -lpthread -ldl -lutil -lm -Xlinker -export-dynamic
我发现我可以用
struct _frame
替换PyFrameObject
,然后程序就可以编译了,但是大家都知道这只是一个肮脏的hack,而不是解决方案。可执行文件输出如下:
line 1
line 2
line 3
line 4
line 5
7
但我希望跟踪脚本的执行流程(即:从第3行开始,然后是4,5,然后由于函数调用而到达2)。
我找不到关于逐步执行的任何信息。
您能推荐一些有关Python C API的其他资源,其中包含更多信息和该主题的一些介绍内容吗?
我奖励了这个答案,因为它无论如何都会过期。 但是,我仍在寻找,并将感激以上其他问题的答案。
Py_tracefunc
的定义以获取返回值的含义,请参见此处。 - Sven Marnach