使用GDB调试python调用的C++共享库



最近在python框架下开发,一些性能要求高的处理用C++写,然后编成共享库在python

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

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

C++共享库代码:

//testlib.cpp
#ifdef DEBUG
#include <python2.7_d/Python.h>
#else
#include <python2.7/Python.h>
#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


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

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





---------------------------------------------------------------------------------------------------------

下面是使用GDB调试脚本,输出vector类型变量的值

1.建一个.gdbinit文件在gdb调试目录或者用户目录下

文件内容如下

define hookpost-next
    echo \n
    info locals
    echo \n
end


define pv
    set $i = 0
    while $i < $arg0.size()
        print $arg0.at($i)
	set $i += 1
    end
end


define pvfrom1to2
    set $i = $arg1
    while $i < $arg2
        print $arg0.at($i)
	set $i += 1
    end
end


重新启动gdb或者在gdb中输入 source .gdbinit命令来使文件生效


这样就可以在GDB调试的时候直接输入:pv myvector

来打印myvector变量里面的所有元素

也可以输入:pvfrom1to2 myvector 1 3

来打印myvector中下标1到3的所有元素了








  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
gdb是一款功能强大的调试器,可以用于调试C和C++程序,也可以用于调试Python程序。当我们使用python虚拟环境中的python解释器来执行Python程序时,gdb也可以正常调试,没有什么使用上的差异。 使用gdb调试Python的过程可以分为以下几个步骤: 1. 首先,确保你已经安装了gdbPython解释器。 2. 在命令行中进入到你的Python程序所在的目录,并使用gdb启动Python解释器。例如,可以使用以下命令启动gdb调试器: ``` gdb python ``` 3. 接下来,设置一些gdb调试选项,例如设置断点、监控变量等。你可以使用gdb命令来完成这些设置。更多关于gdb的命令和选项可以在gdb的文档中找到。 4. 当你设置好调试选项后,可以运行你的Python程序。你可以使用gdb的`run`命令来运行程序,并在需要时暂停程序的执行。 5. 当程序暂停时,你可以使用gdb的命令来查看变量的值、执行相关的操作,并逐步执行程序。你可以使用gdb的`next`命令来执行下一行代码,`step`命令来进入函数调用,`continue`命令来继续程序的执行等等。 6. 在调试过程中,你还可以使用gdb的其他功能,例如查看堆栈信息、查找内存错误等等。 总之,使用gdb调试Python程序可以帮助我们定位和解决程序中的问题,提高程序的可靠性和稳定性。具体的使用方法可以参考相关文档和教程。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [使用gdb调试Python程序](https://blog.csdn.net/weixin_30230009/article/details/125383399)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值