使用 bad_alloc 调试 Python/C++ 程序

Debug Python/C++ program with bad_alloc

我有一个与 PyBind11 C++ 库交互的 Python 程序。

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

MemoryError: std::bad_alloc

运行 这一切都在 GDB 中:

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

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

如果我可以让 Python 对错误的分配进行段错误或告诉 GDB 在 Python 之前捕获异常,我将能够调试它。不幸的是,我也不知道该怎么做。

调试这需要几个步骤。首先,我们需要调试符号。 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 查看源代码。