Как настроить VS Code для перехода в разделяемую библиотеку (.so), которая загружается при отладке скрипта Python?

Используя gdb из командной строки, я могу сломаться при загрузке общей библиотеки. Как я могу получить такое же поведение в VS Code, зная, что у меня есть исходный код общей библиотеки?


person Salah    schedule 11.03.2019    source источник
comment
Это действительно связано с Python или только с C? Если вы имеете в виду модули расширения C для Python, то нет возможности пересечь барьер Python/C в отладчике (для этого вам понадобится Visual Studio).   -  person Brett Cannon    schedule 12.03.2019
comment
Я не могу использовать Visual Studio, потому что работаю в среде Linux. Рабочий процесс выглядит следующим образом. У меня есть скрипт Python, который использует определенную библиотеку Python. Я изменяю код общей библиотеки, написанной на C++. Эта общая библиотека загружается библиотекой Python, которую я вызываю из своего скрипта Python. Я ищу способ сломать, когда моя общая библиотека загружена, чтобы иметь возможность графически отлаживать в VS Code.   -  person Salah    schedule 12.03.2019


Ответы (3)


У меня как-то работает.

Вот моя установка:

  • Ubuntu 18.04, отладка общей библиотеки C++, которую я загружаю из Python3 (точнее - через Cython, но IIRC одинаково хорошо работал при загрузке .so через ctypes, также я помню, что она работала при отладке чистой библиотеки C в аналогичной настройке)
  • в VSCode у меня есть проект, который компилируется в этот .so
  • там я поставил кучу точек останова
  • Я создал конфигурацию запуска (текст ниже)
  • также я скомпилировал .so с отладочной информацией

вот мой launch.json (по большей части это шаблон, я только заполнил части «программа» и «аргументы» и настроил переменную среды PYTHONPATH).

примечание: важно иметь «stopAtEntry:false» (что по умолчанию), иначе VSCode попытается найти файл записи .c или что-то в этом роде.

{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
    {
        "name": "(gdb) Launch 1123",
        "type": "cppdbg",
        "request": "launch",
        "program": "/home/sergey/anaconda3/bin/python",
        "args": [
            "/storage/projects/cython-vst-loader/cython_vst_loader/test_load_plugin.py"
        ],
        "stopAtEntry": false,
        "cwd": "${workspaceFolder}",
        "environment": [
            {
                "name": "PYTHONPATH",
                "value": "/storage/projects/cython-vst-loader"
            }
        ],
        "externalConsole": false,
        "MIMode": "gdb",
        "setupCommands": [
            {
                "description": "Enable pretty-printing for gdb",
                "text": "-enable-pretty-printing",
                "ignoreFailures": true
            }
        ]
    }
]

в любом случае, в этой настройке я вижу, что мой VSCode показывает остановку выполнения на моих точках останова

введите здесь описание изображения

person Sergey Grechin    schedule 25.05.2020
comment
Работает, но только если я удалю блок setupCommands. ` setupCommands: [ { описание: включить красивую печать для gdb, текст: -enable-pretty-printing, ignoreFailures: true }` - person MegaNightdude; 07.08.2020
comment
Кроме того, мне вообще не нужен блок окружения. - person MegaNightdude; 07.08.2020

К сожалению, нет способа перейти из кода Python в код C для целей отладки (насколько мне известно, только Visual Studio имеет такую ​​возможность).

person Brett Cannon    schedule 12.03.2019
comment
В качестве альтернативы, есть ли способ подключиться к общей библиотеке при ее загрузке? - person Salah; 15.03.2019
comment
@салах не уверен. - person Brett Cannon; 15.03.2019

Спасибо @user1312695, ваш метод работает для меня!

Теперь я смог войти в pybullet.c! Итак, позвольте мне взять это в качестве примера. https://github.com/bulletphysics/bullet3

Я хочу установить пакет pybullet отладочной версии в среду conda и использовать VScode для запуска отладки, вот что я сделал:

(0) создайте новую среду conda с именем debug_pybullet.

(1) изменить cmake/FindPythonLibs.cmake

FindPythonLibs.cmake не может распознавать среды conda, поэтому после того, как он обнаружил неправильный _PYTHON_EXECUTABLE, мне нужно вручную установить путь примерно в строке 143:

set(_PYTHON_EXECUTABLE /home/MyName/anaconda3/envs/debug_pybullet/bin/python)

(2) изменить CMakeLists.txt

Мне нужно вручную добавить определения, включенные в файл build_cmake_pybullet_double.sh, за исключением определения CMAKE_BUILD_TYPE=Release (я предпочитаю, чтобы VSCode управлял этим определением).

также я вручную установил PYTHON_SITE_PACKAGES примерно в строке 93:

set(PYTHON_SITE_PACKAGES /home/MyName/anaconda3/envs/debug_pybullet/lib/python3.6/site-packages)

(3) Создайте launch.json в VScode.

Вот моя версия launch.json:

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb) Launch",
            "type": "cppdbg",
            "request": "launch",
            "program": "/home/MyName/anaconda3/envs/debug_pybullet/bin/python",
            "args": [
                "/home/MyName/<path_to_python_file>/main.py"
            ],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
        }
    ]
}

Поскольку я задаю путь вручную, мне не нужны здесь environments и setupCommands.

(4) В VScode соберите все.

(5) Установите отлаживаемый пакет:

$ source activate pybullet_debug
(pybullet_debug)$ pip install -e .

(6) Установите точки останова в pybullet.c.

(7) Нажимаем F5, Запускаем питон, и вот мы здесь!

Снимок экрана прилагается.

person Star    schedule 14.08.2020