调试

适用于 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"
    }
  ]
}