跨网段远程调试vs_如何提高后台服务应用问题的排查效率?日志 VS 远程调试

转眼间,距离Jerry最近一篇文章推送已经过去了一个多月的时间了。

bd2e9a87b6bed3ecc5193184f9433a5e.png

公众号更新的频率降低,不是因为Jerry偷懒,而是由于从春节过后,我所在的SAP成都研究院数字创新空间整个团队,一直在忙一个5月份需要交付的项目上。

Jerry每天的工作量像下面这张图这样:

1f7572c587b3e137d74a1bf3025e8029.png

这个项目里Jerry负责的是后台开发工作,我用nodejs开发了若干微服务,每个微服务实现一个特定的业务逻辑。这些微服务由Jerry另外开发的一个编排器(Orchestra)统一调度。整套后台实现部署在亚马逊云平台(Amazon Web Service,以下简称AWS)上。

离交付日期越来越近了,我们的功能也赶得差不多了。本地测试运行得很好的场景,部署到AWS上运行后出现了一些bug。比如昨天就遇到一个棘手的bug,因此有了今天这篇文章。

2014年五一节的前一天,当时Jerry还在SAP CRM开发团队工作,负责处理SAP CRM中间件的一个bug。这个bug和代码执行时序有关,每执行一次只有40%的几率能重现,花了我整整一天(8个小时)的时间调试。因为重现bug的场景太复杂,需要调试的ABAP代码量太大,所以让我印象深刻。那个bug处理完之后,我也对自己花了8小时才搞定该bug的效率很不满意,因此写了一篇博客总结这次排错的经验教训:

My Tips about how to handle complex and tricky issues

https://blogs.sap.com/2014/05/01/my-tips-about-how-to-handle-complex-and-tricky-issues/

回到昨天我遇到的在AWS上出现的bug,根据问题的表象,一开始我和负责前端开发的同事,连这个问题出在前端还是后端都没办法判断。当微服务部署在本地并进行测试时一切正常,只有部署在AWS上进行集成测试时才会暴露,而运行在AWS上的nodejs应用,我昨天还不知道如何调试,因此只好采用我大二刚学C语言编程时用过的最笨的排查办法:打日志。

2001年,在结束了一年的计算机专业基础课学习后,Jerry开始了Unix环境下C语言编程的学习。当时我对gdb这种以命令提示行方式进行的调试风格很不适应,大多数时候的排错采用的还是在代码里添加printf语句打印变量内容的方式来进行,被寝室的同学鄙视了好久。

5d04d3c9eb00206145c79a5aa2ac4f1e.png

于是昨天我继续采用了这种自己18年前就曾经用过的排错方式:

1. 在可能引起bug的相关代码处逐一加上日志输出语句

2. 执行会出现bug的用户操作

3. 阅读AWS上生成的日志语句

上述三个步骤是一个不断迭代的过程。最开始我加了若干日志输出语句,执行操作后阅读生成的日志,发现没有任何异常。于是不断地增加新的日志打印代码,最后导致了执行一次操作,会生成1200行的日志输出。

669feab057f7db86c204fcb81279c162.png

我和负责前端开发的同事两人坐在显示器前,一行行检查这海量的日志输出。由于问题是用户第二次操作后才会暴露,每次操作会生成不同的会话,我们被迫不断的上下滑动屏幕来比较这两次会话的uuid和相关的WebSocket uuid等变量。Jerry很快发现,眼睛一眨不眨地盯着显示器逐条检查日志,时间一长眼睛就痛得受不了。无奈之下,只得把这些日志用打印机打印出来,用不同颜色的笔标注出两个会话对应的各种变量,在纸上来回比对。于是就有了下面这些纸张:

d1f915192fa99c7851a30530c4558770.png
77dda6a27a686c5501435e34cb961780.png
f21964e38ca1325bdf3c01cbfbd5f98d.png

虽然最后用这种办法,成功排除了后台出错的可能性,使我们得以把精力花在前台代码的审查上,但是像我一个同事评价的,“这种方式太不环保了”,并且我自己也觉得,效率太低了

后来好几位热心的同事告诉Jerry,就算运行在SAP Cloud Platform或者AWS这些云平台上的nodejs应用,也是可以单步调试的,Jerry Google了一下,发现远程调试确实很简单,就两条命令而已。

Jerry用我们创新空间团队另外一位同事Haytham开发并部署在AWS上的一个nodejs应用为例来尝试如何在我的本地电脑上对其进行调试。

Haytham虽然是一个大四本科生,但是已经在SAP成都研究院Jerry所在团队实习将近十个月的时间了,最近三个月一直在SAP德国总部参与一个项目的开发。

76a7191e0c9fc8e7512c17fe63b5101e.png
1a50517cd8763c1b0b8b573f72c7f560.png

等Haytham回到成都后,会将自己这十个月的工作感悟,从一个SAP新人的视角给大家分享出来,敬请期待。

Haytham之前写过的文章:

SAP成都研究院许聚龙:Hello, Coresystems!

Haytham写的这个nodejs应用实际上是Github Webhook的一部分。我们在本地进行微服务nodejs开发,本地git客户端推送代码到远端github仓库。然后需要在AWS上手动git pull把最新的代码拉下来,再用一个开源工具pm2进行微服务部署。Haytham写的这个nodejs应用,能实现本地git推送完毕后一切后续流程的完全自动化,节省了我们大量的部署时间。

下面就来对Haytham这个运行在AWS上的nodejs应用进行远程调试。

1. 用node --inspect-brk在AWS上以调试模式启动应用。

之后控制台上的输出表明有一个nodejs进程以WebSocket协议在127.0.0.1:9229这个地址上监听调试客户端的连接。

2bf7fe76bf91f66b2d3eda2a5739e292.png

2. 我在我的本地电脑上,用如下命令行将我本地电脑的端口9221映射到AWS调试进程监听的9229端口上:

ssh -i C:甥敳獲i042416.sshKOI.pem -L 9221:localhost:9229 ubuntu@ec2-us-east-2.compute.amazonaws.com

8d57e6cb2c25cd0a0a0d16a94fceacd2.png

现在,本地电脑上Chrome浏览器地址栏chrome://inspect里指定监听地址为localhost:9221,

8a1f716799a52adb84a2105050ea6188.png

通过第二步建立的SSH tunnel,

4fbba8a3aef4220577c0a53c6ee96231.png

我就可以用本地电脑连接到AWS上的nodejs应用并进行调试了。

现在终于可以在Chrome开发者工具里进行愉快的调试了:

81306cbeaa3dedc1a4fa00317396a2c8.png

因为我平时本地做nodejs开发和调试时,更喜欢用Visual Studio Code,所以下一步我准备试试用Visual Studio Code进行远程调试。

说到Visual Studio Code,Jerry突然想起今天在网上看到的一个关于这个IDE的有意思的扩展,名为"超越鼓励师"。

fa3fc2dbeac089213d7d8c997c47b46e.png

Jerry试着在自己的Visual Studio Code扩展安装栏里搜索了一下,这个扩展还真的可以下载。不过扩展里出现的"杨超越",Jerry又孤陋寡闻了,咨询了老婆后才知道她是谁。

ad35cc2d461001d14570de50e3254846.png

至于实际效果如何,Jerry不做评价,欢迎Visual Studio Code爱好者自行下载体验。

c041ec72af6578a8e9cb2eb8862cc656.png

最后,祝各位程序猿/程序媛们每天即使没有程序员鼓励师的陪伴,仍然可以愉快地编程。感谢阅读。

145d636d2b14f9091fd7aecec12b8d76.png
9b6c2f151bf586bfb7c4f0325354bdaa.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/271103.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机硬件知识:BIOS、EFI与UEFI详解!

本文估计很多小白看不懂,但是还是建议你硬着头皮看完,这篇文章主要讲解了这几种“BIOS”的启动方式,对电脑启动问题判断的理解会有益处。BIOS是个程序,存储在BIOS芯片中,而现在的新式电脑用的基本都是UEFI启动&#xf…

在db2数据库上模拟死锁场景 还是z上的

如果条件允许,起两个线程互相抢资源就行了,但问题是,时间上还需要同步,要做到完美控制,还得加其他逻辑,忒费事,所以可以用下面的办法: 在目标表上直接加个锁……简单,粗暴…

项目开发基础:常用测试方法介绍

1、集成测试集成测试就是把模块按照设计说明书的要求组合起来进行测试。1.1、集成测试方法:a、分别测试各个模块,再把这些模块组合起来进行整体测试,也就是非增量式集成。特点:可以对模块进行并行测试,能充分利用人力&…

svd奇异值分解_NCL专辑 | 奇异值分解(SVD)

奇异值分解SVD(Singular Value Decomposition)是一种矩阵分解方法,在气象领域中常用来分析两个气象场场之间的关系。NCL的函数库中与SVD相关的函数包括svd_lapack,svdcov,svdcov_sv,svdstd,svdstd_sv。svd_lapack&…

项目测试基础:白盒测试相关知识笔记

1、白盒测试概念白盒测试又称为结构测试,主要是根据程序的内部结构和逻辑来设计测试用例,然后对程序的路径和过程进行测试,检查是否满足设计的需要。2、白盒测试常用的技术介绍白盒测试常用的技术有逻辑覆盖、循环覆盖、基本路径测试。2.1 逻…

java全局变量和局部变量

分类: 变量按作用范围划分分为全局变量(成员变量)和局部变量 成员变量按调用方式划分分为实例属性与类属性 局部变量按定义位置划分分为形参,方法局部变量,代码块局部变量 成员变量: 直接在类中声明的…

电脑系统知识:Windows原版系统与Ghost系统的区别,你知道吗?

经常看到有电脑小白的朋友问原版操作系统跟Ghost的区别是什么,该怎么选择安装哪种系统?今天在这里就说说它们之间的联系与区别。Windows原版系统:原版系统就是微软推送给用户的原始“干净”的系统。系统不含第三方的软件,软件补丁…

sql server update触发器_SQL Server 触发器

T-SQL 触发器触发器分为BEFORE触发器*(SQL Server不支持,Oracle支持)在事件发生时触发。AFTER触发器是 SQLServer生成的最初用于自动相应数据修改的机制。在 SQLServer200以前的版本中 AFTER触发器是唯一的触发器,因此不用指明 AFTER,也可以用…

iOS 公司开发者账号申请

对于独立开发者很有用,收藏起来,以备不时之需! 苹果开发者账号分三种。 个人账号:个人申请用于开发苹果app所使用的账号,仅限于个人使用,申请比较容易,$99。 公司账号:以公司的名义申请的开发者账号,用于公…

php渲染视图,Laravel 视图渲染:Blade 模板引擎

Laravel 视图渲染:Blade 模板引擎由 学院君 创建于3年前, 最后更新于 2年前版本号 #153378 views27 likes0 collectsBlade 简介Blade 是由 Laravel 提供的非常简单但功能强大的模板引擎,不同于其他流行的 PHP 模板引擎,Blade 在视图中并不约束…

项目管理基础:系统切换相关知识笔记

1、系统试运行主要任务对新系统进行初始化、补录各种原始数据记录记录系统运行过程中的数据和状况核对新旧系统输出结果是否正确对实际系统的输入方式进行考察主要包括是否方便、效率、可靠性、误操作保护等方面。对系统实际运行、响应速度进行实际测试,确定是否满足…

sql 分组统计_leetcode-sql面试题十七篇精讲合集

这可能是全网最干货的sql讲解系列文章。全系列共十七讲。做了大量的知识点的拓展,涵盖了sql的方方面面。欢迎关注点赞收藏,正在整理三年数据分析的点点滴滴。包括Excel、python、sql、power BI、各种分析模型框架。保证输出最干的干货。涉及知识点包括&a…

项目管理基础:系统维护相关知识笔记

1、系统的可维护性系统的可维护性就是项目维护人员理解、改正、改动和改进该软件的难易程度。提高系统的可维护性是开发软件吸引所有步骤的关键目的,系统能否被很好地维护,可用系统的可维护性这一指标来衡量。1.1 系统可维护性的评价指标可理解性&#x…

一个栈桢对应着一个方法

一个栈桢对应着一个方法

程序员幽默:39个奇葩代码注释,每一个都能笑抽

1. 只有上帝知道//我写这一行的时候,只有上帝和我知道我在写什么//现在,只有上帝知道了2. 相隔时空的diss//somedev1 - 6/7/02 添加对登录屏幕的暂时追踪功能//somedev2 - 5/22/07 暂时个屁(仿佛看到两个程序员相隔时空的diss)3…

栈出现的异常和设置栈的大小-Xss

异常 java.lang.StackOverflowError 看下面的例子,默认的栈内存 设置栈内存 使用参数-Xss大小来设置栈的大小