使用 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
命令获取回溯,up
和 down
导航堆栈,print
显示内容变量,Ctrl+X+A
查看源代码。
我有一个与 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
命令获取回溯,up
和 down
导航堆栈,print
显示内容变量,Ctrl+X+A
查看源代码。