VSC не ломается на правильной точке останова

Я пытаюсь реализовать сервер API отладки NodeJS поверх моего собственного отладчика. Я хотел бы использовать любой клиент, способный отлаживать Node, для отладки через мой собственный отладчик. Я использую Visual Studio Code в качестве клиента отладки тестов, и мне удалось реализовать достаточный обмен сообщениями, чтобы прикрепить, установить точку останова и уведомить VSC о том, что сценарий был остановлен в точке останова. Проблема в том, что код Visual Studio изменяет значок «Пауза» на «Воспроизведение», чтобы указать, что выполнение приостановлено, но, похоже, он не понимает, на какой точке останова остановился код. Точки останова не выделены. И он не запрашивает фрейм или трассировку стека с сервера. Перед последним обновлением кода VSC в верхней части окна трассировки стека также отображалось сообщение о том, что выполнение приостановлено, после последнего обновления это сообщение не отображается, но выполнение все еще приостановлено.

Вот лог обмена сообщениями между сервером и VSC (начиная с запроса точки останова):

Request:
 {
    "command": "setbreakpoint",
    "arguments": {
        "line": 4,
        "column": 0,
        "type": "scriptRegExp",
        "target": "^(.*[\\/\\\\])?\\/Users\\/me\\/Documents\\/github\\/test\\/test\\.js$"
    },
    "type": "request",
    "seq": 8
}
Response:
{
    "seq": 9,
    "type": "response",
    "success": true,
    "running": true,
    "request_seq": 8,
    "command": "setbreakpoint",
    "body": {
        "type": "scriptRegExp",
        "breakpoint": 1,
        "script_regexp": "^(.*[\\/\\\\])?\\/Users\\/me\\/Documents\\/github\\/test\\/test\\.js$",
        "line": 4,
        "column": 0,
        "actual_locations": [
            {
                "line": 4,
                "column": 4,
                "script_id": 42
            }
        ]
    }
}
Response:
 {
    "type": "event",
    "event": "break",
    "body": {
        "sourceLine": 4,
        "sourceColumn": 4,
        "sourceLineText": "    var product = Product.get(params.pid.stringValue);",
        "breakpoints": [
            1
        ],
        "script": {
            "id": 42,
            "name": "/Users/me/Documents/github/test/test.js",
            "lineOffset": 0,
            "columnOffset": 0,
            "lineCount": 458
        }
    }
}
Request:
{
    "command": "threads",
    "type": "request",
    "seq": 10
}
Response:
{
    "seq": 11,
    "type": "response",
    "success": true,
    "running": false,
    "request_seq": 10,
    "command": "threads",
    "body": {
        "totalThreads": 1,
        "threads": [
            {
                "current": true,
                "id": 4
            }
        ]
    }
}

После этого VSC больше не отправляет запросы. Я что-то не так делаю? Может быть, кто-нибудь может указать мне местонахождение некоторых модульных тестов, которые должны проверять отладку VSC Node?

Кроме того, похоже, что запрос потоков не указан в спецификации NodeJS Debugger API, хотя Node отвечает на него. Это новая или просто недокументированная функция?


person Ilya Volodin    schedule 25.02.2016    source источник


Ответы (1)


Следующий раздел из https://code.visualstudio.com/docs/extensionAPI/api-debugging объясняет, что происходит при достижении точки останова:

«Всякий раз, когда программа останавливается (при входе в программу, из-за того, что была достигнута точка останова, произошло исключение или пользователь запросил приостановку выполнения), адаптер отладки должен отправить остановленное событие с соответствующей причиной и идентификатором потока. После получения VS Код запрашивает трассировку стека (список кадров стека) для данного потока. Если пользователь затем углубляется в кадр стека, VS Code сначала запрашивает области для кадра стека, а затем переменные для области. Если переменная сам структурированный, VS Code запрашивает свои свойства через запросы дополнительных переменных. Это приводит к следующей иерархии:..."

Тесты адаптера отладки находятся здесь: https://github.com/Microsoft/vscode-node-debug/blob/master/src/tests/adapter.test.ts Они тестируют типичные сценарии VS Code. Возможно, вы захотите изучить тест «должен остановиться на точке останова» (строка 108).

Для экономии места «причина остановки» теперь отображается в заголовке вьюлета CALL STACK:

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

person Andre Weinand    schedule 29.02.2016
comment
В итоге оказалось, что я все делаю правильно. Просто мой отладчик отправлял threadID = 2 для threads запроса. И, видимо, VSC просто остановился в этот момент. Не уверен, почему. - person Ilya Volodin; 11.03.2016