36 | 盘点OpenResty的各种调试手段
温铭
该思维导图由 AI 生成,仅供参考
你好,我是温铭。
在 OpenResty 的交流群里面,经常会有开发者提出这样的疑问:OpenResty 里面怎么调试呢?据我所知,OpenResty 中有一些支持断点调试的工具,包括 VSCode 中的插件,但至今使用并不广泛。包括作者 agentzh 以及我认识的几个贡献者在内,大家都是使用最简单的 ngx.log 和 ngx.say 来做调试。
显然,这对于大部分的新手来说并不友好。难道说众多 OpenResty 的核心维护者们,在遇到疑难杂症的时候,手里就只有打印日志这个原始的方法了吗?
当然不是,在 OpenResty 的世界中,SystemTap 和火焰图,才是处理棘手问题和性能问题的标准利器。如果你在邮件列表或者 issue 里面有这方面的提问,项目的维护者肯定会让你上传火焰图,要求用图说话而不是文字描述。
接下来的两节课,我就和你聊聊调试,以及 OpenResty 专门为调试而创造的工具集。今天我们先来看下,有哪些调试程序的方法。
断点和打印日志
在我工作的很长一段时间里面,我都是依赖编辑器的高级调试功能来跟踪程序的,这个看上去也是理所当然的。对于能在测试环境中重现的问题,不管有多复杂,我都有信心可以找到问题的根源,这是因为,这个 bug 可以被不停地重复制造出来。只要通过设置断点和增加日志,问题的根源就会慢慢浮出水面,你所需要的,只是耐心罢了。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
本文介绍了OpenResty的调试工具和方法,为读者提供了全面的调试指南。OpenResty的调试手段包括断点和打印日志、二分查找和注释、动态调试等多种方法。对于测试环境中稳定复现的bug,可以使用编辑器的高级调试功能来跟踪程序,或者使用Mozilla RR录制程序行为进行反复重放。对于大型项目或涉及多个系统的bug,可以采用二分查找和注释的方法,或者使用OpenTracing进行分布式追踪。此外,针对线上才会偶然出现的故障,动态调试工具如Dtrace和Systemtap则可以实现无感知、无侵入的调试。Systemtap的工作原理是将stap脚本转换为C,运行系统C编译器创建kernel模块,通过hook内核的方式激活探测事件。除了Systemtap外,eBPF和Intel的VTune也是其他动态追踪框架的选择。文章还介绍了火焰图的使用方法,以及动态跟踪技术的局限性。总的来说,本文为读者提供了丰富的调试工具和技术,帮助他们更好地解决程序中的bug和故障。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《OpenResty 从入门到实战》,新⼈⾸单¥59
《OpenResty 从入门到实战》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(8)
- 最新
- 精选
- 阳光梦老师说了这么多,哪个去重点啊?
作者回复: 这个看情况了,一般是日志和火焰图
2019-08-162 - kruglecoroutine 0: [C]: in function 'send' ...ocal/webserver/openresty-1.15.8.1/lualib/resty/redis.lua:255: in function 'get' /data/script/dynamicssl.lua:125: in function 'getCertRedis' /data/script/dynamicssl.lua:258: in function 'main' /data/script/dynamicssl.lua:286: in main chunk, context: ssl_certificate_by_lua*, client: 183.17.230.47, server: 0.0.0.0:443 2019/08/16 18:02:02 [crit] 21643#0: *47373 SSL_do_handshake() failed (SSL: error:1408A179:SSL routines:ssl3_get_client_hello:cert cb error) while SSL handshaking, client: 183.17.230.47, server: 0.0.0.0:443 2019/08/16 18:02:02 [error] 21643#0: *47376 [lua] dynamicssl.lua:261: main(): youyouwx.club,set cert by redis, context: ssl_certificate_by_lua*, client: 183.17.230.47, server: 0.0.0.0:443 2019/08/16 18:02:02 [error] 21644#0: *47379 attempt to send data on a closed socket: u:0000000000000000, c:0000000000000000, ft:0 eof:0, context: ssl_certificate_by_lua*, client: 183.17.230.47, server: 0.0.0.0:443 2019/08/16 18:02:02 [error] 21644#0: *47379 [lua] dynamicssl.lua:261: main(): youyouwx.club,set cert by redis, context: ssl_certificate_by_lua*, client: 183.17.230.47, server: 0.0.0.0:443 这个是什么问题,看了好多文章也找不到啊
作者回复: 从错误信息里面只能看到是 ssl 握手失败了。具体的还需要描述下这个错误是如何产生的。
2019-08-1621 - krugle求助,我们有几千个域名绑定,导致nginx每个进程800m,现在使用openresty动态加载 刚弄完还没上线 这个有没有什么坑,就是每次获取servername 然后清除之前的证书 在重新设置证书,请教下有没有什么坑,会不会有并发问题
作者回复: lrucache+共享字典两层缓存,不用把所有证书都加载在内存中
2019-08-163 - 许童童不要给我说什么动态调试,火焰图!老夫用console高度代码就是一把梭!2019-08-1644
- 阳光梦个人觉得,1,日志调试; 2,二分法日志调试;3,火焰图; 4,gdb。够了2019-08-162
- 猪小擎色块的宽带代表调用次数的多少,性能消耗多少鼠标悬浮上边有CPU消耗百分比。2022-04-081
- helloworld老师,最近写项目遇到了一个奇怪的问题,ngx.location.capture 请求其他的内部location的时候,会跳过该location的access阶段,反复测试发现rewrite阶段代码执行了,content阶段代码也执行了,就是access阶段代码不执行,这个是什么原因呢?2019-08-17
- 连边好范。2019-08-16
收起评论