Skip to content

本地调试函数

local 命令是在本地对函数调试的命令。

⚠️ 注意:该命令对 Docker 有所依赖,所以在使用该命令时,需要先进行 Docker 安装,版本 >= 19.03。

命令解析

当执行命令local -h/local --help时,可以获取帮助文档。

在该命令中,包括了两个子命令:

参数解析

参数全称 参数缩写 Yaml 模式下必填 参数含义
event e 选填 传入 event 函数的 event 事件数据
event-file f 选填 以文件形式传入 event 事件数据
config c 选填 指定断点调试时使用的 IDE,取值范围:vscode,intellij
debug-port d 选填 指定断点调试端

当前命令还支持部分全局参数(例如-a/--access, --debug, --help等),详情可参考 Serverless Devs 全局参数文档

Tips:

在进行调用时,如果需要指定相对应的事件,例如 oss 的事件,cdn 的事件......这些事件的格式,可以参考 event-template

此时,可以利用该路径的模板(可以额外进行修改)触发函数,例如:s invoke --event-file event-template/oss.json

local invoke 命令

local invoke 命令,是进行本地函数调试的命令, 本地函数容器实例执行完毕, 一次执行完毕会自动退出。

操作案例

有资源描述文件(Yaml)时,可以直接执行s local invoke进行本地调试,完成的输出示例:

FC Invoke Start RequestId: 0ba8ac3f-abf8-46d4-b61f-8e0f9f265d6a
2021-11-11T05:45:58.027Z 0ba8ac3f-abf8-46d4-b61f-8e0f9f265d6a [INFO] hello world
FC Invoke End RequestId: 0ba8ac3f-abf8-46d4-b61f-8e0f9f265d6a
hello world

RequestId: 0ba8ac3f-abf8-46d4-b61f-8e0f9f265d6a   Billed Duration: 146 ms   Memory Size: 128 MB   Max Memory Used: 23 MB

local start 命令

local start 命令,是进行本地函数调试的命令, 本地函数容器实例一直存在的调试模式,除非手动取消这次调试。

操作案例

有资源描述文件(Yaml)时,可以直接执行s local start进行资源部署,部署完成的输出示例:

⌛  Steps for [local] of [hello-world-app]
====================
[2024-03-25 14:41:26][INFO][hello_world] Local baseDir is: /Users/youyi/start-fc3-nodejs

······

Aliyun FunctionComputer runtime emulator start.
You can use curl or Postman to make an HTTP request to localhost:9001 to test the function

此时,可以根据命令行提示的url信息,使用 curl、Postman、浏览器等方式查看函数本地调试的具体内容。

断点调试

断点调试支持的 runtime 有:
nodejs10nodejs12nodejs14nodejs16nodejs18nodejs20
python3python3.9python3.10
php7.2
java8java11

VSCode

使用 VSCode 进行断点调试时,流程十分简单,支持的语言有 NodeJSPythonPHPJava

调试函数-通用流程(除PHP以外)

step1:打开终端,进入目标项目下(s.yaml 文件所在目录),输入启动指令
s local invoke --config vscode --debug-port 3000

启动指令执行后,本地的函数计算执行容器会有一定阻塞,我们需要等待调用;与此同时当前项目会自动生成 .vscode/launch.json 文件,该文件是基于 VSCode 进行调试的配置文件,若该文件已经存在,那么启动指令会生成新的配置文本,盖已有 .vscode/launch.json 中的内容。
启动成功后,输出示例:

⌛  Steps for [local] of [hello-world-app]
====================
[2024-03-25 16:53:54][INFO][hello_world] Local baseDir is: /Users/youyi/start-fc3-nodejs

······

Aliyun FunctionComputer runtime emulator start.
Debugger listening on ws://0.0.0.0:3000/c1e578a2-1395-4f9b-aa2c-38a7eaff1b92
For help, see: https://nodejs.org/en/docs/inspector

step2:启动断点调试器

打开 VSCode 界面,然后打开 s.yaml 中 codeUri 所存放的源代码,为其打上断点,接着点击开始调试按钮,具体执行如下图所示。 step2

启动调试器后,程序便已经启动,此时就可以开始进行我们的断点调试工作了。

断点调试实操视频

调试函数-PHP调试流程

step1:打开终端,进入目标项目下(s.yaml 文件所在目录),输入启动指令
s local invoke --config vscode --debug-port 3000

启动指令执行后,本地的函数计算执行容器会有一定阻塞,我们需要等待调用;与此同时当前项目会自动生成 .vscode/launch.json 文件,该文件是基于 VSCode 进行调试的配置文件,若该文件已经存在,那么启动指令会生成新的配置文本,盖已有 .vscode/launch.json 中的内容。

step2:完成或停止终端指令运行

如果您使用的是invoke命令,等待命令执行完毕即可。
如您使用的是start命令,可以按下command + C,停止终端指令的运行。若成功停止,终端输出 DEVS:SIGINT, stop container

step3:启动断点调试器

打开 VSCode 界面,然后打开 s.yaml 中 codeUri 所存放的源代码,为其打上断点,接着点击开始调试按钮,启动调试器。具体执行如下图所示。 step3

step4:回到终端,再次输入启动指令

s local invoke --config vscode --debug-port 3000
启动指令执行后,程序启动,此时就可以返回断点调试器界面,开始进行我们的断点调试工作了。

断点调试实操视频

Intellij

基于 Intellij 进行断点调试时,支持 Java 语言, 接下来我们将以本地调试 Java 函数为例,对"启动断点调试器"步骤进行详细说明。

step1:打开终端,进入目标项目下(s.yaml 文件所在的目录),输入启动指令

s local invoke --config intellij --debug-port 3000

step2:启动断点调试器

  • 打开 Intellij 界面,在菜单栏依次选择 运行(Run) -> 编辑配置(Edit Configurations), 随后如下图所示,新建一个 远程 JVM 调试(Remote JVM Debug)

step2_1

  • 接着,自定义调试器名称,并将端口设置为 3000,如下图所示。

step2_2

  • 最后,打开 s.yml 中 codeUri 存放的源代码,为其打上断点,接着点击开始调试按钮,如图所示。

step2_3

断点调试实操视频

附录

默认断点调试参数

Runtime Default Debug Args
nodejs 10/12/14/16/18/20 --inspect-brk=0.0.0.0:${debugPort}
python 3/3.9/3.10 -m debugpy --listen 0.0.0.0:${debugPort} --wait-for-client
java8 -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,quiet=y,address=${debugPort}
java11 -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,quiet=y,address=*:${debugPort}
php7.2 remote_enable=1 remote_autostart=1 remote_port=${debugPort} remote_host=${ip.address()}

注意事项

如您在函数构建过程中设置了局部 Action,也建议对local指令设置相关的局部 Action,以免项目无法正常调试。示例如下:

resources:
  hello_world:
    actions:
      pre-deploy: # 在 deploy 之前运行
        - run: mvn package -DskipTests
          path: ./
      pre-local: # 在 local 之前运行
        - run: mvn package -DskipTests
          path: ./
    props:
      region: ${vars.region}              
      functionName: "myFuntion1"
      runtime: "java8"
      ···