使用错误的\u alloc调试Python/C++程序

2024-10-06 07:55:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Python程序,它与pybDun11 C++库接口。p>

在图书馆的某个地方,有东西在抛出一个std::bad_alloc。Python捕捉到了这一点,并轻松地引发了一个异常:

MemoryError: std::bad_alloc

在GDB中运行这一切:

gdb --ex run --args python3 ./my_program

不会在错误分配点导致中断

如果我可以让Python在错误的分配上执行segfault,或者让GDB在Python之前捕获异常,那么我就能够调试它。不幸的是,我也不知道该怎么做


Tags: run程序图书馆地方错误argspython3ex
1条回答
网友
1楼 · 发布于 2024-10-06 07:55:51

调试这需要几个步骤。首先,我们需要调试符号。PyBind11剥去了这些,所以我们必须把它们拿回来

我的CMake文件如下所示:

cmake_minimum_required(VERSION 3.10)

find_package(pybind11 REQUIRED)

pybind11_add_module(my_python_module my_python_module.cpp)
target_compile_features(my_python_module PUBLIC cxx_std_17)

要取回符号,我需要它看起来像这样:

cmake_minimum_required(VERSION 3.10)

find_package(pybind11 REQUIRED)

pybind11_add_module(my_python_module my_python_module.cpp)
target_compile_features(my_python_module PUBLIC cxx_std_17)

target_link_libraries(my_python_module PRIVATE pybind11::module)
add_library(restore_default_visibility INTERFACE)
target_compile_options(restore_default_visibility INTERFACE -fvisibility=default)
target_link_libraries(my_python_module PRIVATE restore_default_visibility)

我还需要获得调试版本:

cmake -DCMAKE_BUILD_TYPE=Debug ..

现在,我可以启动Python程序了:

gdb  args python3 ./my_program

一个GDB启动,我为std::bad_alloc设置一个断点:

catch throw std::bad_alloc

现在我可以通过键入c来运行我的程序

稍后,当它崩溃时,我可以使用bt命令获取回溯,updown来导航堆栈,print显示变量的内容,Ctrl+X+A查看源代码

相关问题 更多 >