Отладка программы на Python / C ++ с помощью bad_alloc - PullRequest
0 голосов
/ 24 апреля 2020

У меня есть программа Python, которая взаимодействует с библиотекой PyBind11 C ++.

Где-то в библиотеке что-то выбрасывает std::bad_alloc. Python ловит это и легко вызывает исключение:

MemoryError: std::bad_alloc

Запуск всего этого в GDB:

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

Не приводит к разрыву в точке неправильного распределения.

Если бы я мог заставить Python перехватить ошибку при неправильном распределении или сказать GDB перехватить исключение раньше, чем Python, я бы смог отладить это. К сожалению, я не уверен, как это сделать.

1 Ответ

0 голосов
/ 25 апреля 2020

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

...