Отладка расширения Pybind11 с помощью Visual Studio Code (MacOS)

Недавно я использовал pybind11, и теперь, когда я освоился с ним, я в восторге от него. Это потрясающая работа. Последняя часть инструментальной головоломки для выполнения pybind11 — это часть отладки. У меня есть отладка командной строки с работой lldb, используя следующее руководство:

Отладка pybind11 с помощью lldb

Я потратил некоторое время, пытаясь отладить работу с кодом Visual Studio, но с ограниченным успехом. Первая проблема заключается в том, что для настройки конфигурации attach необходимо указать исполняемый файл Python (а не идентификатор процесса). Я не знаю, как это должно работать, если у вас более одного активного процесса Python, что часто случается.

Отложив это в сторону, я настроил конфигурацию launch так, чтобы она указывала на исполняемый файл ipython, что наиболее удобно для использования. Когда я пытаюсь начать отладку, я получаю это:

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

Кто-нибудь может это объяснить?

Если я изменяю исполняемый файл на простой Python, я получаю это в консоли отладки:

Could not initialize Python interpreter - only native expressions will be available.
Launching: /Users/andy/anaconda3/envs/SciPy37/bin/python

Но если перейти в окно терминала, я могу успешно ввести выражения Python и активировать точки останова, установленные в коде. Ура! Но есть еще одна проблема. Когда одному из моих расширений нужно загрузить другую dylib, оно не может ее найти.

>>> import block_test
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: dlopen(/Users/andy/Dropbox (Personal)/Developer/AudioDev/GenericDSP/Common/SciPy/BlockTest/build/block_test.cpython-37m-darwin.so, 2): Symbol not found: _vDSP_vsmul
  Referenced from: /Users/andy/Dropbox (Personal)/Developer/AudioDev/GenericDSP/Common/SciPy/BlockTest/build/block_test.cpython-37m-darwin.so
  Expected in: flat namespace
 in /Users/andy/Dropbox (Personal)/Developer/AudioDev/GenericDSP/Common/SciPy/BlockTest/build/block_test.cpython-37m-darwin.so

Это имеет некоторый смысл, потому что _vDSP_vsmul является частью библиотеки ускорения Apple DSP. Но чего я не понимаю, так это того, что у меня нет этой проблемы, когда я использую метод отладки командной строки, упомянутый в начале этого поста. Ясно, что это каким-то образом связано с поиском dylib, но чем это отличается от ситуации с командной строкой?

Любая помощь по этим вопросам будет здорово. Заставить этот отладочный материал работать в Visual Studio Code — это недостающая часть абсолютно удивительной совместимости между Python и C++.


person Andrew Voelkel    schedule 28.04.2020    source источник
comment
Оказывается, третья проблема с зависимой библиотекой не была проблемой VSC. В командной строке Python та же проблема. ipython не работает, не знаю почему. Эта проблема была устранена путем явного связывания с библиотекой Accelerate. Но загадка с ipython и сообщением об ошибке об отсутствующих архитектурах остается.   -  person Andrew Voelkel    schedule 29.04.2020
comment
Хотя я до сих пор не понял, как получить бесшовную отладку VSC в Visual Studio Code и ipython, я нашел простой способ использовать Xcode. Если вы используете cmake, вы можете использовать его для создания проекта xcode. Затем вы можете запустить iPython, найти pid в мониторе активности и подключиться к процессу по pid для отладки. Это работает довольно хорошо.   -  person Andrew Voelkel    schedule 09.05.2020


Ответы (3)


Я понял, как подключиться к процессу отладки для работы с Visual Studio Code с iPython и в Mac OS Catalina. Следующий код в файле 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": [
    {
      "type": "lldb",
      "request": "launch",
      "name": "Debug",
      "program": "path_to/bin/python",
      "args": [],
      "cwd": "${workspaceFolder}/build"
    },
    { 
      "name": "Debug Attach",
      "type": "lldb",
      "request": "attach",
      "program": "path_to/bin/python",
      "processId": "${command:pickProcess}",
      "MIMode": "gdb"
  },
  ]
}

Во-первых, прежде чем пытаться начать отладку, в окне терминала запустите IPython, чтобы у вас был процесс, к которому можно подключиться.

Сначала я столкнулся с проблемами, когда VSC жаловался на отсутствие записи «программа» в файле json, что кажется неуместным при подключении к процессу. На самом деле это может быть совершенно неважно, но вы должны добавить его, чтобы все заработало. Я не пробовал вводить фиктивную запись для аргумента программы, чтобы увидеть, имеет ли вообще значение значение.

Еще одна деталь: иногда точки останова в VSC кажутся неактивными, при их создании вы получаете незакрашенный кружок вместо красной точки. Но, похоже, вы все равно попадете в точки останова. Однако, исходя из моего предыдущего опыта, лучше всего импортировать тестовый пакет в iPython после присоединения к процессу для достижения наилучших результатов.

person Andrew Voelkel    schedule 26.05.2020
comment
Я не пытался вводить фиктивную запись для аргумента программы, чтобы увидеть, имеет ли вообще значение значение .... Недопустимая запись останавливает запуск для меня, поэтому да, похоже, здесь нужна действующая программа/исполняемый файл - person alexandre iolov; 18.01.2021

Я наткнулся на этот пост SO Как настроить VS Code, чтобы иметь возможность пошагового входа в общую библиотеку (.so), которая загружается при отладке скрипта Python? и вместо того, чтобы подключаться к уже запустив отладчик, я смог запустить gdb из VSCode:

    // 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": "/usr/bin/python3",
            "args": ["${file}"],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "externalConsole": false,
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ]
        }
    ]
}

Из этой настройки launch.json я могу пройтись по своему коду C++, где установлены мои точки останова, и отладить мой код C++. Однако, как упоминалось в комментариях к предыдущему сообщению SO, я не уверен, есть ли метод для перехода между кодом python и C/C++ во время сеанса отладки. Если попытаться разместить точки останова в моем файле Python, я тоже получаю незаполненный круг вместо красной точки при их создании.

person kyrlon    schedule 15.09.2020

У меня были проблемы с достижением этого в macOS 10.14.5 с использованием LLDB. Мне помогло установить расширение vadimcn.vscode-lldb для VS Code со следующими конфигурациями:

{
    // 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": [
        {
            "type": "lldb",
            "request": "attach",
            "name": "Attach pid",
            "pid": "${command:pickProcess}", // use ${command:pickProcess} to pick other users' processes,
        },
        {
            "name": "Python: Current File",
            "type": "python",
            "request": "launch",
            "program": "${file}",
            "console": "integratedTerminal",
            "stopOnEntry": true,
            "env": {
                "PYTHONPATH": "${workspaceFolder}/build"
            }
        },
        {
            "type": "lldb",
            "request": "launch",
            "name": "LLDB Python",
            "program": "/usr/local/bin/python3",
            "args": [
                "${file}"
            ],
            "cwd": "${workspaceFolder}",
            "stopOnEntry": false,
            "env": {
                "PYTHONPATH": "${workspaceFolder}/build"
            },
        },
    ]
}

Либо запустите python с lldb (LLDB Python), либо я сначала запущу сеанс отладки python (Python: Current File), к которому потом смогу подключиться (Attach pid). Преимущество второго варианта заключается в возможности устанавливать точки останова как в Python, так и в C++.

person Leonard Eyer    schedule 03.11.2020