如何进行断点调试工作流程

如何进行断点调试工作流程导读:在应用开发过程中,或者开发完成后,若出现执行结果不符合我们的预期时,通常需要进行一定的调试工作。但是在 Serverless 架构下,调试工作往往会受到一些环境因素限制,如所开发的应用在本地是比较健康的、且符合预期的

导读:在应用开发过程中,或者开发完成后,若出现执行结果不符合我们的预期时,通常需要进行一定的调试工作。但是在 Serverless 架构下,调试工作往往会受到一些环境因素限制,如所开发的应用在本地是比较健康的、且符合预期的运行,但是在 FaaS 平台上,出现了一些问题;或者是在某些特殊的环境下,本地没有办法模拟线上环境,难以进行项目的开发和调试怎么办?

概述

本文将借助 Serverless Devs 工具,对函数计算 (FC)应用的断点调试步骤进行详细指导,手把手带你实现 Serverless 的断点调试,并从以下四个方面为你厘清“硬核调试”的脉络步骤,干货满满:

一、概述部分介绍了调试能力的重要性,以及当前阿里云函数计算(FC)所能提供的调试能力;

二、调试之旅罗列了关于 “使用 Serverless Devs 在不同 IDE 中进行断点调试” 的详细步骤;

三、总结部分客观诉说断点调试的待改进之处;

四、附录则为各位开发者汇总了断点调试操作的详细动图。

在 Serverless 应用架构下,调试能力往往是应用开发者所十分关注的问题,它决定着程序的开发效率。Hackernoon 在关于 Serverless(无服务器)的业界调研报告指出:迄今为止,Debugging(调试)仍旧是 Serverless 落地最大的痛点与挑战。

如何进行断点调试工作流程

报告《Top 5 Serverless Trends》:https://hackernoon.com/top-5-serverless-trends-in-2020-wd1m3t8g

调试能力主要包含两种,一是运行程序的能力;二是断点调试能力。前者是调试的基础能力,可以判帮助开发者判断程序能否正常运行,验证程序运行结果的正确性;后者是调试的高级能力,能够帮助用户方便定位到导致程序运行出错或者不符合预期的位置。

目前业界已有的 Serverless 应用调试手段,主要是在本地模拟云端执行环境进行本地调试;或者将应用部署到云端运行后基于日志进行调试。然而,本地调试无法模拟云端的网络环境,云端调试又缺乏本地的灵活性。为了能够克服这些缺陷,将 Serverless 应用调试做到开箱即用,阿里云函数计算团队经过一番探索,开发出了一套业界创新的调试工具,全方位提供本地调试以及端云联调能力。

  • 本地调试:基于本地环境以及网络,依赖容器化技术,对 Serverless 应用进行拟运行,从而达到调试的目的,具体操作文档可参考。https://github.com/devsapp/fc/blob/main/docs/zh/command/local.md
  • 端云联调:基于本地环境,突破网络限制,依赖容器化技术,对 Serverless 应用进行拟运行,运行时打通本地与云端网络的壁垒,保证与云端资源的交互,使用文档请参考。

https://github.com/devsapp/fc/blob/main/docs/zh/command/proxied.md

本文所提到的本地调试工具,均提供断点调试能力,且与 Serverless 应用程序开发规范完全兼容,下面我们一起看一下关于断点调试的具体操作步骤。

调试之旅

断点调试步骤总结为如下流程,下面我将带领各位围绕这四个步骤,开启一场断点调试之旅:

  • 启动 Serverless 应用
  • 启动断点调试器
  • 开始断点调试
  • 结束断点调试

1、前置操作

在开始进行调试之前,需要进行一些前置操作,本文将前置操作分为通用前置操作以及端云联调附加的前置操作

  • 通用前置操作:
    • 安装调试 IDE:可选的 IDE 有 VSCode、Pycharm 以及 Intellij 三种;
    • 随后在开始使用这些功能之前,请安装好调试工具: 这里我们需要安装一下 Serverless Devs,具体的安装方式参考文档:

https://help.aliyun.com/document_detail/195474.html;

熟悉新一代函数计算工具链的使用方式,可参考:https://github.com/devsapp/fc;

    • 下载安装 Docker:调试能力都需要依赖 Docker,因此需要本地环境中有 Docker 工具,安装方式请参考这里:https://docs.docker.com/get-docker/
    • 最后还需要注册一个阿里云账号,使用 Serverless Devs 配置阿里云账号,具体配置方式可以参考这里:https://help.aliyun.com/document_detail/295894.html
  • 端云联调附加的前置操作:
    • 准备一个阿里云账号,由于端云联调涉及到辅助资源的部署和删除,如果账号为子账号,需要为该子账号添加指定的一些权限,具体权限集合可以参考。https://github.com/devsapp/fc/blob/main/docs/zh/command/proxied.md#%E6%9D%83%E9%99%90%E4%B8%8E%E7%AD%96%E7%95%A5%E8%AF%B4%E6%98%8E

2、参数引入

完成以上前置条件的准备后,我们先了解一下调试指令中与断点调试所相关的具体参数:

-c, –config [vscode/pycharm/intellij] [Required] Select which IDE to use when

debugging and output related debug

config tips for the IDE. value:

vscode/pycharm/intellij

-d, –debug-port number [Required] Specify the local function

container starting in debug mode, and

exposing this port on localhost

–debug-args string [Optional] Additional parameters that

will be passed to the debugger

–debugger-path string [Optional] The path of the debugger on

the host

–tmp-dir string [Optional] The temp directory mounted to

‘/tmp’ , default:

‘http://www.toutiao.com/a7085906663332561438/.s/tmp/invoke/serviceName/functionName/’

使用断点调试时,–config 参数以及 –debug-port 参数是必要的:

    • –config 会指定断点调试的 IDE 环境,目前支持 VSCode、Pycharm 、Intellij 三种。
    • –debug-port 会指定调试的监听端口。

另外,其余三种参数是可选的:

    • –debug-args 会自定义程序启动时的调试参数,不指定时默认的调试参数可以参考文末附录部分
    • –debugger-path 会将本地指定路径挂载到程序运行环境的 /tmp/debugger_file之中。
    • –tmp-dir 会将本地指定路径挂载到程序运行环境中的 /tmp 目录上,在调试时,程序写入 /tmp 的结果文件则会在映射到本地目录,用于验证结果是否符合预期。

3、实操演练

1)VSCode

使用 VSCode 进行断点调试时,流程十分简单,下面我们将断点调试场景分为 Event 函数调试和 Http 函数调试两种,分别进行介绍。

  • 调试 Event 函数:

step1:首先启动 Serverless 应用,打开终端,进入目标项目下,输入启动指令:

# 本地调试

$ s local invoke –config vscode –debug-port 3000

# 端云联调

$ s proxied setup –config vscode –debug-port 3000

启动指令执行后,本地的函数计算执行环境会有一定阻塞,我们需要等待调用;与此同时当前项目会生成 .vscode/launch.json 文件,该文件是基于 VSCode 进行调试的配置文件,若该文件已经存在,那么启动指令会打印相应配置文本,如下图所示,需要利用这部分内容覆盖已有 .vscode/launch.json 中的内容。

如何进行断点调试工作流程

.vscode/launch.json 更新内容示例

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

如何进行断点调试工作流程

VSCode 启动调试器示意图

对于本地调试而言,启动调试器后,程序便已经启动,此时就可以开始进行我们的断点调试工作了。如果是端云联调的话,启动调试器后,在启动指令终端页面,会出现 “Debugger attached.” 字段,这时说明调试器也已启动成功,正在等待被调用,接下来我们继续进行如下步骤即可。

step3:开始断点调试:打开一个新的终端页面,输入调用指令 s proxied invoke –event “hello”后,程序启动,断点调试开始。

step4:结束断点调试:调试结束后,主动关闭断点调试器。端云联调场景下,会创建一系列辅助函数资源,因此调试完成后,这里需要进行辅助资源释放,防止额外的费用产生,只需执行 s proxied cleanup 即可释放辅助资源。

  • 调试 php7.2 Event 函数

php7.2 runtime 的本地调试 IDE 建议使用 VSCode,其断点调试步骤与其他语言有一定差异性,因此单独进行介绍。目前 php7.2 runtime 不支持端云联调断点调试。

step1:首先启动 Serverless 应用,打开终端,进入目标项目下,输入启动指令 s local invoke –config vscode –debug-port 3000。

与之前不同的是,Event 函数启动指令执行完成后,并不会出现阻塞的情况,而是会直接执行成功,同时在当前项目下会生成 .vscode/launch.json 文件,如前文所述。

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

如何进行断点调试工作流程

step3:开始断点调试:打开一个新的终端页面,再次输入启动指令 s local invoke –config vscode –debug-port 3000后,程序启动,断点调试开始。

step4:结束断点调试:调试结束后,主动关闭断点调试器。

  • 调试 Http 函数

端云联调中对 Http 函数的调试方式实际上与 Event 函数相同,因此不再赘述,本节我们主要介绍下本地调试关于 Http 函数应该如何进行调试。

step1:启动 Serverless 应用,首先,打开终端,进入目标项目下,输入启动指令 s local start –config vscode –debug-port 3000,启动指令执行后,本地的函数计算执行环境会阻塞等待调用,并打印访问 http 函数的 url 字段。

step2:启动断点调试器:打开 VSCode 界面,然后打开 s.yml 中 codeUri 存放的源代码,为其打上断点,接着点击开始调试按钮,如图所示。此时在启动指令终端页面,会出现 “Debugger attached.” 字段,说明调试器启动成功,等待被调用。

如何进行断点调试工作流程

VSCode 启动调试器示意图

step3:开始断点调试:可以通过 curl 指令、浏览器等方式访问 Http 函数的 URL,此时程序启动,断点调试开始。

step4:结束断点调试:调试完成后,主动关闭断点调试器,然后在启动指令终端页面,执行 Ctrl+C 即可退出调试进程。

  • 调试 php7.2 Http 函数

php7.2 runtime 的本地调试 IDE 建议使用 VSCode,其断点调试步骤与其他语言有一定差异性,因此单独进行介绍。目前 php7.2 runtime 不支持端云联调断点调试。

step1:首先启动 Serverless 应用,打开终端,进入目标项目下,输入启动指令 s local start –config vscode –debug-port 3000,启动指令执行后,会在当前项目下会生成 .vscode/launch.json 文件,如前文所述,同时项目会阻塞住,此时需要执行 Ctrl+C 退出。

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

如何进行断点调试工作流程

step3:开始断点调试:打开一个新的终端页面,再次输入启动指令 s local start –config vscode –debug-port 3000后,本地的函数计算执行环境会阻塞等待调用,并打印访问 http 函数的 url 字段,可以通过 curl 指令、浏览器等方式访问 Http 函数的 URL,此时程序启动,断点调试开始。

step4:结束断点调试:调试完成后,主动关闭断点调试器,然后在启动指令终端页面,执行 Ctrl+C 即可退出调试进程。

2)Intellij

基于 Intellij 进行断点调试时,针对不同语言需要手动在 IDE 中配置相应地断点调试器,由于使用 Intellij 开发最多的语言是 Java,同时更换 IDE 后,唯一不同的步骤只有“启动断点调试器”,因此接下来我们将以本地调试 Java Event 函数为例,对“启动断点调试器”步骤进行详细说明。

step1:启动 Serverless 应用: 由于 Java 是编译型语言,因此在开始前需要对程序进行打包,本文示例会使用 mvn package 对函数打包,然后执行启动指令 s local invoke –config intellij –debug-port 3000。

step2:启动断点调试器:打开 Intellij 界面,在菜单栏依次选择 Run -> Edit Configurations。

随后如下图所示,新建一个 Remote JVM Debug。

如何进行断点调试工作流程

新建 Remote JVM Debug

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

如何进行断点调试工作流程

Intellij 调试器配置

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

如何进行断点调试工作流程

Intellij 启动断点调试器

3)Pycharm

当前只有本地调试能够在 Pycharm 中进行断点调试操作,支持的运行时有 python2.7 和 python3两个版本。在 Pycharm 中进行断点调试时,不仅需要在 IDE 中配置断点调试器,还需要对使用者的源码进行侵入式修改,由于操作步骤内容与常规内容有所不同,接下来我们详解一下这部分的调试步骤。

step1:启动 Serverless 应用:首先,打开终端,进入目标项目下,输入启动指令:

# event 函数

$ s local invoke –config pycharm –debug-port 3000

# http 函数

$ s local start –config pycharm –debug-port 3000

与之前不同的是,Event 函数启动指令执行完成后,并不会出现阻塞的情况,而是会直接执行成功。此时就需要记录 “Tips for PyCharm remote debug” 内容,具体内容示例如图所示,记录完成后,如果是 Http 函数,则输入 Ctrl+C 退出启动程序。

如何进行断点调试工作流程

Tips for PyCharm remote debug 内容示例

step2:接下来启动断点调试器:启动断点调试器主要包含 IDE 断点调试器配置和源码更新两部分。

首先,打开 pycharm 界面,在菜单栏依次选择 Run -> Edit Configurations。

接下来如图中所示,新建一个 Python Debug Server。

如何进行断点调试工作流程

新建 Python Debug Server

随后设置自定义调试器名称,并基于图五中获取的内容配置 IDE host name、Port 以及 Path mappings 这三个调试器配置的详情,如图中所示。

如何进行断点调试工作流程

pycharm 调试器配置

随后打开 s.yml 中 codeUri 存放的源代码,将例图中(Tips for PyCharm remote debug 内容示例)的代码内容粘贴到代码开头,然后按需在源码指定位置打上断点,接着点击开始调试按钮,具体操作如图 (pycharm 启动断点调试器)所示。

如何进行断点调试工作流程

Tips for PyCharm remote debug 内容示例

如何进行断点调试工作流程

pycharm 启动断点调试器

step3:开始断点调试:打开终端,并进入目标项目,执行启动指令,p.S.此时可以不用带上断点调试的相关参数。

# event 函数

$ s local invoke

# http 函数

$ s local start

Event 函数启动指令执行后会直接进入断点调试阶段;Http 函数启动指令执行后,可以先通过 curl 指令、浏览器等方式访问 Http 函数的 URL,此时程序会启动,断点调试就开始了。

step4:结束断点调试:调试完成后,主动关闭断点调试器,对于 Http 函数而言,在启动指令终端页面,需执行 Ctrl+C 方可退出调试进程。

结语

Serverless 应用的调试虽然备受诟病,但是各个云厂商并没有因此放弃在调试方向的不断深入探索。以阿里云函数计算为例,目前支持提供在线调试、本地调试、端云联调等多种调试方案。而 Serverless Devs 工具所提供的应用调试能力也十分全面了。

上文是我所分享的一些实操经验,但是在过程中也发现了一些待改进的点,如:

    • 断点调试步骤繁琐,需要在多个页面来回切换,如果能将工具集成到 IDE,以插件化形态供所用户使用,简化流程,那么体验感会大幅提升。
    • 断点调试模式下的热更能力:Http 函数的断点调试过程中,并不支持代码热更新,每次修改完代码后,都需要重新执行一遍断点调试流程,体验不太流畅。
    • 断点调试能力目前还未全面覆盖所有 Runtime,例如 custom runtime 不支持断点调试,php runtime 不支持端云联调断点调试等。

希望本文对你有些帮助。

附录

默认调试参数

Runtime

Default Debug Args

nodejs 6

–debug-brk=${debugPort}

nodejs 8/10/12/14

–inspect-brk=0.0.0.0:${debugPort}

python 2.7/3

-m ptvsd –host 0.0.0.0 –port ${debugPort} –wait

java 8/11

-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()}

断点调试动图

下面的动图教程均已提前完成文中提到的“前置操作”步骤,若要参考具体动图进行实践,请先完成上文“前置操作”的相关流程。

1) VSCode

本地调试 Event 函数

具体操作请前往下方链接查看:

https://www.bilibili.com/video/BV1Ba41147wq?spm_id_from=333.999.0.0

本地调试 php7.2 event 函数

具体操作请前往下方链接查看:https://www.bilibili.com/video/BV1dL4y1L7HZ?spm_id_from=333.999.0.0

端云联调 Event 函数

具体操作请前往下方链接查看:https://www.bilibili.com/video/BV15S4y117Kz?spm_id_from=333.999.0.0

本地调试 Http 函数

具体操作请前往下方链接查看:https://www.bilibili.com/video/BV1gi4y1X7g4?spm_id_from=333.999.0.0

本地调试 php7.2 Http 函数

具体操作请前往下方链接查看:https://www.bilibili.com/video/BV1nY411772A?spm_id_from=333.999.0.0

端云联调 Http 函数

具体操作请前往下方链接查看:https://www.bilibili.com/video/BV1A44y1P7yg?spm_id_from=333.999.0.0

2) Intellij

本地调试 Event 函数

具体操作请前往下方链接查看:https://www.bilibili.com/video/BV1S34y147Zf?spm_id_from=333.999.0.0

端云联调 Event 函数

具体操作请前往下方链接查看:https://www.bilibili.com/video/BV19L4y1L7AF?spm_id_from=333.999.0.0

3) Pycharm

本地调试 Event 函数

具体操作请前往下方链接查看:https://www.bilibili.com/video/BV1GF41137x5?spm_id_from=333.999.0.0

本地调试 Http 函数

具体操作请前往下方链接查看:https://www.bilibili.com/video/BV1HF41137dQ?spm_id_from=333.999.0.0

Serverlesss Devs 社区官网:http://www.serverless-devs.com/

原文链接:https://developer.aliyun.com/article/880880?utm_content=g_1000335158

本文为阿里云原创内容,未经允许不得转载。

激活谷谷主为您准备了激活教程,为节约您的时间请移步至置顶文章:https://sigusoft.com/99576.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/15115.html

(0)
上一篇 2024年 5月 17日
下一篇 2024年 5月 17日

相关推荐

  • 字符串指针数组输出只有四位怎么办_字符串指针数组输出只有四位怎么办啊

    字符串指针数组输出只有四位怎么办_字符串指针数组输出只有四位怎么办啊c语言输出保留4位小数C语言是一种广泛使用的计算机编程语言,其输出保留4位小数的功能是程序设计中经常用到的一个功能。在本文中,我们将从多个角度分析如何使用C语言输出保留4位小数的方法。一、使用printf函数输出保留4位小数在C语言

    2024年 5月 29日
  • redis 缓存穿透,击穿,雪崩英文_redis雪崩和穿透、击穿的解决方法

    redis 缓存穿透,击穿,雪崩英文_redis雪崩和穿透、击穿的解决方法Redis缓存穿透、击穿、雪崩问题及解决方法系列文章目录 Spring Cache的使用–快速上手篇 分页查询–Java项目实战篇 全局异常处理–Java实战项目篇 完善登录功能–过滤器的使用 上述只是部分文章,对该系列文章感

    激活谷笔记 2024年 5月 11日
  • 介质测试失败检查电缆啥意思_介质测试失败 检查电缆

    介质测试失败检查电缆啥意思_介质测试失败 检查电缆PXE-E61:介质测试失败,检查电缆错误答案对人有帮助,有参考价值 0tracyli1991 发表于 2018-11-12 08:52让我改变我的问题,因为我不希望它从网络启动。我是否需要优先移动硬盘:Intel Volume0?我有相当的技术背景,但我

    2024年 5月 28日
  • DataSpell激活2024.1.1(JetBrains DataGrip 2024.1.3 激活成功教程版 – 数据库管理工具)

    DataSpell激活2024.1.1(JetBrains DataGrip 2024.1.3 激活成功教程版 – 数据库管理工具)

    激活谷笔记 2024年 6月 7日
  • piglet翻译_piglet翻译中文

    piglet翻译_piglet翻译中文piglet是什么意思_piglet用英语怎么说_piglet的翻译_piglet翻译成_piglet的中文意思_piglet怎么读,piglet的读音,piglet的用法,piglet的例句全部小猪Li minority children who have no t

    激活谷笔记 2024年 5月 23日
  • 多线程同步执行的命令_多线程同步执行的命令有哪些

    多线程同步执行的命令_多线程同步执行的命令有哪些2021互联网公司java开发工程师面试题汇总!(附答案)2021年互联网大厂,校园招聘java开发工程师面试题大全!(附答案),本篇文章包含java基础+JVM+JMM面试题。Java 基础 40语言特性 12Q1:Java 语言的优点?Q2:Java 如何实现平台无关?Q3:J

    2024年 5月 21日
  • word文档怎么转换成excel_word文字内容转为excel表格

    word文档怎么转换成excel_word文字内容转为excel表格无纸化办公指南 | 快来掌握不加班的秘诀,高效还节能!2022年第53个世界地球日的主题新鲜出炉——“珍爱地球 人与自然和谐共生”。“共生”即指人与自然关系应是一种可持续发展的状态,当下科技的高速发展背面

    2024年 5月 14日
  • html怎么让表格内容居中_html表格怎么设置居中

    html怎么让表格内容居中_html表格怎么设置居中HTML中让元素居中的方法对于前端攻城狮,最重要的就是页面,页面的好看程度直接影响咱们的产品效益,所以,接下来呢我就给大家总结一下咱们前端攻城狮常用的居中效果的几种实现方法:1.文字的垂直水平居中ps:以上方法仅针对文字的水平居中2.盒子的垂直水平居中3.图片在盒子中的居中ps:图片的特殊

    2024年 5月 24日
  • 什么叫开窗函数_什么叫开窗函数

    什么叫开窗函数_什么叫开窗函数开窗函数详解(保姆级实操)窗口函数类似于聚合函数,但又不同于聚合函数。聚合函数是将组内多个数据聚合成一个值,而窗口函数除了可以将组内数据聚合成一个值,还可以保留原始的每条数据。本文举例场景:分组求和以及累计求和分组排序行偏移计算移动均值和移

    2024年 5月 27日
  • Datagrip激活2024.1.3(JetBrains DataGrip For Mac数据库管理工具 V2024.1.3)

    Datagrip激活2024.1.3(JetBrains DataGrip For Mac数据库管理工具 V2024.1.3)

    2024年 6月 7日
  • ubuntu系统装Win10双系统_win10乌班图双系统安装

    ubuntu系统装Win10双系统_win10乌班图双系统安装【转载】Win10安装Ubuntu18.04双系统,全网最详细教程(20.4通用)(A卡装novelAI)一、查看电脑信息1、BIOS模式Win+R,输入msinfo32回车,出现系统界面,可查看BIOS模式:本教程只适合BIOS模式为UEFI的电脑,如果BIOS模式为传统的,请查看其他对应

    2024年 5月 8日
  • 怎样创建自己的博客账号和密码

    怎样创建自己的博客账号和密码最近代码君兴趣来潮,想搭建一个自己的博客,说干就干,搭建过程遇到不少坑特此记录下来,希望对后来要搭建自己博客的读者有用~搭建准备下载Node.js以为Hexo是基于Node.js的所以需要按照这个,选择自己电脑对应的版本就好,这个很简单,

    激活谷笔记 2024年 5月 18日
关注微信