{"componentChunkName":"component---src-templates-best-practice-detail-tsx","path":"/best-practice/2021-01-06-remote-debugging","result":{"data":{"currentBlog":{"id":"776e3baf-a065-5ca0-aafd-e3af9e050975","frontmatter":{"thumbnail":"https://main.qcloudimg.com/raw/007bbdc60ded777b71353a480bb6cb66.jpg","authors":["松鹅"],"categories":["best-practice"],"date":"2021-01-06T00:00:00.000Z","title":"再见，本地环境！腾讯云全球首发：Serverless 在线远程调试","description":"本文将以一段内存泄漏的代码为例，给大家展示如何使用在线调试功能定位和解决问题","authorslink":null,"translators":null,"translatorslink":null,"tags":["Serverless","在线调试"],"keywords":null,"outdated":null},"wordCount":{"words":110,"sentences":22,"paragraphs":22},"fileAbsolutePath":"/opt/build/repo/content/best-practice/2021-01-06-remote-debugging.md","fields":{"slug":"/best-practice/2021-01-06-remote-debugging/","keywords":["serverless","云函数","内存","快照","泄漏","调试"]},"html":"<p>在线调试是云函数为了解决用户在本地搭建调试环境复杂，云上环境不便于定位等问题推出的功能。</p>\n<p>云上的各种服务，在本地无法完全模拟，程序员大都遇到过本地和远程环境运行结果不一致的情形，追查起来费时费力，不仅效率低下，也造成非常郁闷的工作体验。</p>\n<p>所以，能否直接在远程环境中完成全部的开发流程，是提升开发体验的最直接手段，然而在其他问题都解决后，远程调试功能是最后的一公里。</p>\n<p>本篇文章将以一段内存泄漏的代码为例，给大家展示如何使用云函数在线调试功能定位和解决问题。Node10 及以上版本的 runtime，使用 Chrome 浏览器打开云函数控制台，在函数代码页即可看到在线调试的入口。</p>\n<h2 id=\"开启调试模式\"><a href=\"#%E5%BC%80%E5%90%AF%E8%B0%83%E8%AF%95%E6%A8%A1%E5%BC%8F\" aria-label=\"开启调试模式 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>开启调试模式</h2>\n<p>使用Chrome浏览器打开函数代码编辑页，可以看到在【远程调试】页。为保障调试的体验，开启调试模式将修改函数的部分配置，包括函数进入单实例模式、函数超时时间修改为900秒等。开启前请务必确认这些调整。</p>\n<p><img src=\"https://main.qcloudimg.com/raw/a0f3bc3fcb92b6f2ce15e5fb4ce6f6d3.png\"></p>\n<p>待加载完成后，页面将自动展示入口文件。</p>\n<h2 id=\"找不到需要的文件？\"><a href=\"#%E6%89%BE%E4%B8%8D%E5%88%B0%E9%9C%80%E8%A6%81%E7%9A%84%E6%96%87%E4%BB%B6%EF%BC%9F\" aria-label=\"找不到需要的文件？ permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>找不到需要的文件？</h2>\n<p>使用快捷键 Cmd + P（Mac）或 Ctrl + P（Windows）可以打开所需要的文件。但大家可能会发现，刚开启调试模式时，打开文件的列表中找不到所需要的文件。\n这是因为对于动态脚本语言来说，调试器不会加载所有的内容，只会加载执行过的文件。我们先点击测试，让函数运行一次。在运行一次后，我们就可以打开所需要的文件了。</p>\n<p><img src=\"https://main.qcloudimg.com/raw/92dc6684760ab1494d92fc3ecd15a3d8.png\"></p>\n<h2 id=\"设置断点\"><a href=\"#%E8%AE%BE%E7%BD%AE%E6%96%AD%E7%82%B9\" aria-label=\"设置断点 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>设置断点</h2>\n<p>在代码前点击即可设置断点，在右上角的工具中可以进行继续执行、跨步执行、单步执行等操作，也可以灵活地启动或禁用断点。</p>\n<p><img src=\"https://main.qcloudimg.com/raw/9011a1f90d376cdb09490c9292fd31ba.png\"></p>\n<h2 id=\"内存泄漏排查---内存快照\"><a href=\"#%E5%86%85%E5%AD%98%E6%B3%84%E6%BC%8F%E6%8E%92%E6%9F%A5---%E5%86%85%E5%AD%98%E5%BF%AB%E7%85%A7\" aria-label=\"内存泄漏排查   内存快照 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>内存泄漏排查 - 内存快照</h2>\n<p>这部分介绍如何使用内存快照功能排查内存泄漏的问题。内存泄漏的排查方法大致为：找准内存泄漏的时机，在泄漏的前后对内存进行快照，通过对比快照的内容判断内存泄漏的问题点。</p>\n<p>首先，我们将调试的窗口切换到 Memory 页面，点击左上方的实心圆形按钮捕捉内存快照。</p>\n<p><img src=\"https://main.qcloudimg.com/raw/a0e7d82647a863614d53c8fa38720059.png\"></p>\n<p>这样，我们就有了运行前的内存快照。现在我们执行存在内存泄漏的代码。这行代码有一个从未清理的全局缓存，随着调用的增加，越来越占内存。</p>\n<p><img src=\"https://main.qcloudimg.com/raw/44cc6ed0029efe5b4e1b793cec8b7e8e.png\"></p>\n<p>随后，我们进行第二次内存快照，打开对比页面，通过对Delta值的分析，可以发现 concatenated string 这个部分增加了很多，很有可能有问题。</p>\n<p><img src=\"https://main.qcloudimg.com/raw/45e324ad9269a17f5082adc9812e2420.png\"></p>\n<p>打开以后，便可以发现内存中多存储了很多“recording time”的数据。</p>\n<p><img src=\"https://main.qcloudimg.com/raw/d24d71be88c697bc85096bf476a35b18.png\"></p>\n<p>这些重复性的数据也就意味着代码中出现了内存泄漏，在代码中找到相关内容，进行调整，解决内存泄漏的问题。</p>\n<p>除了云函数的控制台，也可以使用 <strong>Serverless Framework Dev 模式</strong>开启在线调试的功能。</p>\n<hr>\n<hr>\n<div id='scf-deploy-iframe-or-md'></div>\n<hr>\n<p>欢迎访问：<a href=\"https://serverlesscloud.cn/\">Serverless 中文网</a>，您可以在 <a href=\"https://serverlesscloud.cn/best-practice\">最佳实践</a> 里体验更多关于 Serverless 应用的开发！</p>","tableOfContents":"<ul>\n<li><a href=\"/best-practice/2021-01-06-remote-debugging/#%E5%BC%80%E5%90%AF%E8%B0%83%E8%AF%95%E6%A8%A1%E5%BC%8F\">开启调试模式</a></li>\n<li><a href=\"/best-practice/2021-01-06-remote-debugging/#%E6%89%BE%E4%B8%8D%E5%88%B0%E9%9C%80%E8%A6%81%E7%9A%84%E6%96%87%E4%BB%B6%EF%BC%9F\">找不到需要的文件？</a></li>\n<li><a href=\"/best-practice/2021-01-06-remote-debugging/#%E8%AE%BE%E7%BD%AE%E6%96%AD%E7%82%B9\">设置断点</a></li>\n<li><a href=\"/best-practice/2021-01-06-remote-debugging/#%E5%86%85%E5%AD%98%E6%B3%84%E6%BC%8F%E6%8E%92%E6%9F%A5---%E5%86%85%E5%AD%98%E5%BF%AB%E7%85%A7\">内存泄漏排查 - 内存快照</a></li>\n</ul>"},"previousBlog":{"id":"664a969f-5a20-526c-b0a5-64e95ce6f15d","frontmatter":{"thumbnail":"https://main.qcloudimg.com/raw/9210c0ec6a7f9bdd76f9e0da399df425.jpg","authors":["April"],"categories":["best-practice"],"date":"2021-01-07T00:00:00.000Z","title":"国内首款 Serverless MySQL 数据库重磅发布！","description":"腾讯云 Serverless 生态中 MySQL 数据库版块补齐，试用期间免费！","authorslink":null,"translators":null,"translatorslink":null,"tags":["Serverless","数据库"],"keywords":null,"outdated":null},"wordCount":{"words":288,"sentences":49,"paragraphs":49},"fileAbsolutePath":"/opt/build/repo/content/best-practice/2021-01-07-serverless-mysql.md","fields":{"slug":"/best-practice/2021-01-07-serverless-mysql/","keywords":["serverless","函数计算","函数计算服务","云函数","云原生","Serverless","mysql","serverless","数据库","vpc","yml"]}},"nextBlog":{"id":"57be3d6e-1cba-5083-8dcf-647ede3ab15a","frontmatter":{"thumbnail":"https://main.qcloudimg.com/raw/f1c0252cbf776c2639c323348cced6f1.jpg","authors":["Alfred"],"categories":["best-practice"],"date":"2020-12-30T00:00:00.000Z","title":"腾讯云 Serverless 云函数并发管理能力解读","description":"提供多层次的并发配额管理能力，用户可获得更强的函数并发管理控制的权限，无需等待即可快速调整业务并发","authorslink":null,"translators":null,"translatorslink":null,"tags":["Serverless","并发管理"],"keywords":null,"outdated":null},"wordCount":{"words":270,"sentences":48,"paragraphs":48},"fileAbsolutePath":"/opt/build/repo/content/best-practice/2020-12-30-scf-concurrency-control.md","fields":{"slug":"/best-practice/2020-12-30-scf-concurrency-control/","keywords":["serverless","云函数","并发","函数","额度","业务","账号","配额"]}}},"pageContext":{"isCreatedByStatefulCreatePages":false,"blogId":"776e3baf-a065-5ca0-aafd-e3af9e050975","previousBlogId":"664a969f-5a20-526c-b0a5-64e95ce6f15d","nextBlogId":"57be3d6e-1cba-5083-8dcf-647ede3ab15a"}}}