Для отладки требуется несколько шагов. Во-первых, нам понадобятся символы отладки. 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
для просмотра исходного кода.