调试

适用于 TEN 框架的开发人员

如果您使用 VS Code 开发 TEN 框架,则 TEN 框架源代码树中有一个 launch.json 文件,其中提供了默认的调试目标。

适用于 TEN 框架的用户

如果您使用 VS Code 开发基于 TEN 框架的自己的应用程序,您可以将配置添加到您的 .vscode/launch.json 文件,以便您可以使用断点和变量检查来调试您的应用程序,无论您使用的是哪种编程语言(C++/Golang/Python)。

在 C++ 应用程序中调试

如果应用程序是用 C++ 编写的,这意味着扩展可以使用 C++ 或 Python 编写。

使用 lldb 或 gdb 调试 C++ 代码

您可以使用以下配置来调试 C++ 代码:

  • 使用 lldb 调试 C++ 代码

    {
        "name": "app (C++) (lldb, launch)",
        "type": "lldb",
        "request": "launch", // "launch" or "attach"
        "program": "${workspaceFolder}/bin/worker", // 可执行文件的路径
        "cwd": "${workspaceFolder}/",
        "env": {
            "LD_LIBRARY_PATH": "${workspaceFolder}/ten_packages/system/xxx/lib", // linux
            "DYLD_LIBRARY_PATH": "${workspaceFolder}/ten_packages/system/xxx/lib" // macOS
        }
    }
  • 使用 gdb 调试 C++ 代码

    {
        "name": "app (C++) (gdb, launch)",
        "type": "cppdbg",
        "request": "launch", // "launch" or "attach"
        "program": "${workspaceFolder}/bin/worker", // 可执行文件的路径
        "cwd": "${workspaceFolder}/",
        "MIMode": "gdb",
        "environment": [
            {
                // linux
                "name": "LD_LIBRARY_PATH",
                "value": "${workspaceFolder}/ten_packages/system/xxx/lib"
            },
            {
                // macOS
                "name": "DYLD_LIBRARY_PATH",
                "value": "${workspaceFolder}/ten_packages/system/xxx/lib"
            }
        ]
    }

使用 debugpy 调试 Python 代码

您可以使用 debugpy 调试 Python 代码。 但是,由于程序不是直接通过 Python 解释器启动的,因此 Python 代码由嵌入的 Python 解释器执行。 因此,您只能将调试器附加到正在运行的进程。

首先,您需要在 Python 环境中安装 debugpy

pip install debugpy

然后,您需要使用设置的环境变量 TEN_ENABLE_PYTHON_DEBUGTEN_PYTHON_DEBUG_PORT 启动应用程序。 例如:

TEN_ENABLE_PYTHON_DEBUG=true TEN_PYTHON_DEBUG_PORT=5678 ./bin/worker

如果环境变量 TEN_ENABLE_PYTHON_DEBUG 设置为 true,则应用程序将阻塞,直到附加调试器。 如果设置了环境变量 TEN_PYTHON_DEBUG_PORT,则调试器服务器将侦听指定端口上的传入连接。

然后,您可以将调试器附加到正在运行的进程。 以下是一个配置示例:

使用 debugpy 调试 Python 代码

{
    "name": "app (C++) (debugpy, attach)",
    "type": "debugpy",
    "request": "attach",
    "connect": {
        "host": "localhost",
        "port": 5678
    },
    "justMyCode": false
}

同时调试 C++ 和 Python 代码

如果您想在 VSCode 中一键启动同时调试 C++ 和 Python 代码,您可以执行以下操作:

  1. 定义一个任务,在附加调试器之前延迟几秒钟:

    {
        "label": "delay 3 seconds",
        "type": "shell",
        "command": "sleep 3",
        "windows": {
          "command": "ping 127.0.0.1 -n 3 > nul"
        },
        "group": "none",
    }
  2. 将以下配置添加到 launch.json 文件:

    "configurations": [
         {
             "name": "app (C++) (lldb, launch with debugpy)",
             "type": "lldb",
             "request": "launch", // "launch" or "attach"
             "program": "${workspaceFolder}/bin/worker", // 可执行文件的路径
             "cwd": "${workspaceFolder}/",
             "env": {
                 "LD_LIBRARY_PATH": "${workspaceFolder}/ten_packages/system/xxx/lib", // linux
                 "DYLD_LIBRARY_PATH": "${workspaceFolder}/ten_packages/system/xxx/lib", // macOS
                 "TEN_ENABLE_PYTHON_DEBUG": "true",
                 "TEN_PYTHON_DEBUG_PORT": "5678"
             }
         },
         {
             "name": "app (C++) (debugpy, attach with delay)",
             "type": "debugpy",
             "request": "attach",
             "connect": {
                 "host": "localhost",
                 "port": 5678
             },
             "justMyCode": false,
             "preLaunchTask": "delay 3 seconds"
         }
    ],
    "compounds": [
         {
             "name": "app (C++) (lldb, launch) and app (C++) (debugpy, attach)",
             "configurations": [
                 "app (C++) (lldb, launch with debugpy)",
                 "app (C++) (debugpy, attach with delay)"
             ]
         }
    ]

然后,您可以使用复合配置 app (C++) (lldb, launch) and app (C++) (debugpy, attach) 启动调试 C++ 和 Python 代码。

在 Go 应用程序中调试

如果应用程序是用 Go 编写的,这意味着扩展可以使用 Go 或 C++ 或 Python 编写。

使用 delve 调试 Go 代码

您可以使用以下配置在您的 Go 扩展中进行调试:

{
    "name": "app (golang) (go, launch)",
    "type": "go",
    "request": "launch",
    "mode": "exec",
    "cwd": "${workspaceFolder}/",
    "program": "${workspaceFolder}/bin/worker", // 可执行文件的路径
    "env": {
        "LD_LIBRARY_PATH": "${workspaceFolder}/ten_packages/system/xxx/lib", // linux
        "DYLD_LIBRARY_PATH": "${workspaceFolder}/ten_packages/system/xxx/lib", // macOS
        "TEN_APP_BASE_DIR": "${workspaceFolder}",
    }
}

使用 lldb 或 gdb 调试 C++ 代码

您可以使用以下配置来调试 C++ 代码:

  • 使用 lldb 调试 C++ 代码

    {
        "name": "app (Go) (lldb, launch)",
        "type": "lldb",
        "request": "launch", // "launch" or "attach"
        "program": "${workspaceFolder}/bin/worker", // 可执行文件的路径
        "cwd": "${workspaceFolder}/",
        "env": {
            "LD_LIBRARY_PATH": "${workspaceFolder}/ten_packages/system/xxx/lib", // linux
            "DYLD_LIBRARY_PATH": "${workspaceFolder}/ten_packages/system/xxx/lib" // macOS
        },
        "initCommands": [
            "process handle SIGURG --stop false --pass true"
        ]
    }
  • 使用 gdb 调试 C++ 代码

    {
        "name": "app (Go) (gdb, launch)",
        "type": "cppdbg",
        "request": "launch", // "launch" or "attach"
        "program": "${workspaceFolder}/bin/worker", // 可执行文件的路径
        "cwd": "${workspaceFolder}/",
        "MIMode": "gdb",
        "environment": [
            {
                // linux
                "name": "LD_LIBRARY_PATH",
                "value": "${workspaceFolder}/ten_packages/system/xxx/lib"
            },
            {
                // macOS
                "name": "DYLD_LIBRARY_PATH",
                "value": "${workspaceFolder}/ten_packages/system/xxx/lib"
            }
        ]
    }

使用 debugpy 调试 Python 代码

请参阅上面的部分,了解如何使用 debugpy 调试 Python 代码。 使用设置的环境变量 TEN_ENABLE_PYTHON_DEBUGTEN_PYTHON_DEBUG_PORT 启动应用程序。

TEN_ENABLE_PYTHON_DEBUG=true TEN_PYTHON_DEBUG_PORT=5678 ./bin/worker

然后,您可以将调试器附加到正在运行的进程。 以下是一个配置示例:

{
    "name": "app (C++) (debugpy, attach)",
    "type": "debugpy",
    "request": "attach",
    "connect": {
        "host": "localhost",
        "port": 5678
    },
    "justMyCode": false
}

同时调试 C++、Go 和 Python 代码

如果您想在 VSCode 中一键启动同时调试 C++、Go 和 Python 代码,您可以执行以下操作:

  1. 定义一个任务,在附加调试器之前延迟几秒钟:

    {
       "label": "delay 3 seconds",
       "type": "shell",
       "command": "sleep 3",
       "windows": {
         "command": "ping 127.0.0.1 -n 3 > nul"
       },
       "group": "none",
     }
  2. 将以下配置添加到 launch.json 文件:

    "configurations": [
         {
             "name": "app (golang) (debugpy, remote attach with delay)",
             "type": "debugpy",
             "request": "attach",
             "connect": {
                 "host": "localhost",
                 "port": 5678
             },
             "preLaunchTask": "delay 3 seconds",
             "justMyCode": false
         },
         {
             "name": "app (golang) (go, launch with debugpy)",
             "type": "go",
             "request": "launch",
             "mode": "exec",
             "cwd": "${workspaceFolder}/",
             "program": "${workspaceFolder}/bin/worker",
             "env": {
                 "TEN_APP_BASE_DIR": "${workspaceFolder}",
                 "TEN_ENABLE_PYTHON_DEBUG": "true",
                 "TEN_PYTHON_DEBUG_PORT": "5678"
             }
         },
         {
             "name": "app (golang) (lldb, launch with debugpy)",
             "type": "lldb",
             "request": "launch",
             "program": "${workspaceFolder}/bin/worker",
             "cwd": "${workspaceFolder}/",
             "env": {
                 "TEN_ENABLE_PYTHON_DEBUG": "true",
                 "TEN_PYTHON_DEBUG_PORT": "5678"
             },
             "initCommands": [
                 "process handle SIGURG --stop false --pass true"
             ]
         },
    ],
    "compounds": [
         {
             "name": "Mixed Go/Python",
             "configurations": [
                 "app (golang) (go, launch with debugpy)",
                 "app (golang) (debugpy, remote attach with delay)"
             ],
         },
         {
             "name": "Mixed Go/Python/C++ (lldb)",
             "configurations": [
                 "app (golang) (lldb, launch with debugpy)",
                 "app (golang) (debugpy, remote attach with delay)"
             ]
         }
    ]

如果您想同时调试 C++ 和 Python 代码,您可以使用复合配置 Mixed Go/Python/C++ (lldb)。 使用此配置,您可以同时对 C++、Go 和 Python 代码执行断点调试。 但是,变量检查仅支持 C++ 和 Python 代码,而不支持 Go 代码。

如果您想同时调试 Go 和 Python 代码,您可以使用复合配置 Mixed Go/Python。 使用此配置,您可以同时对 Go 和 Python 代码执行断点调试,并检查 Go 和 Python 代码的变量。

在 Python 应用程序中调试

如果应用程序是用 Python 编写的,这意味着扩展可以使用 Python 或 C++ 编写。

使用 lldb 或 gdb 调试 C++ 代码

您可以使用以下配置来调试 C++ 代码:

{
    "name": "app (Python) (cpp, launch)",
    "type": "cppdbg", //
    "request": "launch", // "launch" or "attach"
    "program": "/usr/bin/python3", // Python 解释器路径
    "args": [
        "main.py"
    ],
    "cwd": "${workspaceFolder}/",
    "environment": [
        {
          "name": "PYTHONPATH",
          "value": "${workspaceFolder}/ten_packages/system/ten_runtime_python/lib:${workspaceFolder}/ten_packages/system/ten_runtime_python/interface"
        },
        {
          "name": "TEN_APP_BASE_DIR",
          "value": "${workspaceFolder}/"
        },
    ],
    "MIMode": "gdb", // "gdb" 或 "lldb"
}

使用 debugpy 调试 Python 代码

请参阅上面的部分,了解如何使用 debugpy 调试 Python 代码。 您可以使用以下配置来调试 Python 代码:

{
    "name": "app (Python) (debugpy, launch)",
    "type": "debugpy",
    "python": "/usr/bin/python3",
    "request": "launch",
    "program": "${workspaceFolder}/main.py",
    "console": "integratedTerminal",
    "cwd": "${workspaceFolder}/",
    "env": {
        "PYTHONPATH": "${workspaceFolder}/ten_packages/system/ten_runtime_python/lib:${workspaceFolder}/ten_packages/system/ten_runtime_python/interface",
        "TEN_APP_BASE_DIR": "${workspaceFolder}/",
        "TEN_ENABLE_PYTHON_DEBUG": "true",
    }
}

同时调试 C++ 和 Python 代码

如果您想同时启动 C++ 和 Python 代码的调试,您可以使用配置 app (Python) (debugpy, launch) 启动应用程序,并使用以下配置将调试器附加到正在运行的进程:

{
    "name": "app (Python) (cpp, attach)",
    "type": "cppdbg",
    "request": "attach", // "launch" 或 "attach"
    "program": "${workspaceFolder}/bin/worker", // 可执行文件的路径
    "cwd": "${workspaceFolder}/",
    "MIMode": "gdb",
    "environment": [
        {
            "name": "LD_LIBRARY_PATH",
            "value": "${workspaceFolder}/ten_packages/system/xxx/lib"
        },
        {
            "name": "DYLD_LIBRARY_PATH",
            "value": "${workspaceFolder}/ten_packages/system/xxx/lib"
        }
    ]
}

Last updated

Was this helpful?