运用gdb调试python和C++混合编译

参考:https://blog.csdn.net/N_sev7/article/details/47299469

https://blog.csdn.net/u014230646/article/details/80548308

程序中调用,于是问题来了,怎么对python的共享库进行调试呢?既然是在Linux下,那么首先想到的肯定是用GDB进行调试,那么下面先介绍一下如何使用GDB调试python调用的C++共享库,再介绍一下如何使用GDB+Code::Blocks对python调用的C++共享库进行可视化调试。

下面下附上测试用的代码:

C++共享库代码:


//testlib.cpp
#ifdef DEBUG
#include
#else
#include
#endif
 
using namespace std;
 
PyObject* CFuncEntry(PyObject* self,PyObject* args)
{
 
    PyObject*  datalist = NULL;
    PyArg_ParseTuple( args,"O",&datalist );
 
    int rst = 0;
    for ( int i = 0; i < PyList_Size(datalist); ++i )
    {
        int val = PyInt_AsLong(PyList_GetItem( datalist,i ));
        rst += val;
    }
 
    return Py_BuildValue("i", rst);
}
 
PyMODINIT_FUNC initCFuncEntry(void)
{
    static PyMethodDef methods[] = {
    {"CFuncEntry", (PyCFunction)CFuncEntry, METH_VARARGS, "test lib"},
    {NULL, NULL, 0, NULL}
    };
 
    Py_InitModule("CFuncEntry", methods);
}

python 代码:


#!/usr/bin/python
 # -*- encoding: utf-8 -*-
import CFuncEntry 
 
if __name__ == "__main__":
    numberlist = [1,2,3,4,5,6,7]
    rst = CFuncEntry.CFuncEntry(numberlist)
    print rst

运用gdb调试python和C++混合编译_第1张图片

 

如上图:
1. 我们所编写的两个文件
2. 编译共享库 我们编译的事debug版,需要链接的库是:-lpython2.7_d 如果没有这个库,需要下载安装python debug版
3. 使用这个命令进入python代码的调试,
这一步也可以使用 gdbtui python-dbg test.py 一会进入c++代码库进行调试的时候会进入自带的可视化调试窗口
4. 设置断点 这里我用使用共享库的入口函数CFuncEntry作为断点处。这里引申一下,如果在py程序中使用了多进程,此处的断点并不会停,因为断点默认只停在父进程中,因此需要set follow-fork-mode child命令设置一下
5. 提示在py文件中没有找到函数定义,但是可能后面引入的库包含,选择y就可以了
6. r 让程序跑起来,显示程序停在了我们设置的断点函数处 
7. 可以输入info locals命令看一下本函数变量的值

如果第三步输入的是:gdbtui python-dbg test.py这个命令,那么执行到第6步的时候就会看到如下结果:

 

运用gdb调试python和C++混合编译_第2张图片

没有安装python-dbg的,可以直接gdbtui python test.py

 

 

你可能感兴趣的:(运用gdb调试python和C++混合编译)