OpenResty 从入门到实战
温铭
OpenResty 软件基金会第一任主席,Apache APISIX 项目 VP
20903 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 52 讲
结束语 (1讲)
OpenResty 从入门到实战
15
15
1.0x
00:00/00:00
登录|注册

36 | 盘点OpenResty的各种调试手段

VTune
eBPF
Systemtap
Dtrace
分布式追踪技术
on CPU火焰图
VTune
eBPF
作者Frank Ch. Eigler
示例
安装
DSL
动态调试
二分查找和注释
线上环境的调试方法
测试环境中的断点和打印日志
动态调试
Zipkin、Apache SkyWalking
OpenTracing
二分查找和注释
Mozilla RR
火焰图
SystemTap
ngx.log和ngx.say
VSCode插件
完美性能调试
火焰图
其他动态追踪框架
Systemtap
调试方法
调试工具
分享和讨论
调试工具和技术的使用
OpenResty的调试问题
总结
温铭
盘点OpenResty的各种调试手段

该思维导图由 AI 生成,仅供参考

你好,我是温铭。
在 OpenResty 的交流群里面,经常会有开发者提出这样的疑问:OpenResty 里面怎么调试呢?据我所知,OpenResty 中有一些支持断点调试的工具,包括 VSCode 中的插件,但至今使用并不广泛。包括作者 agentzh 以及我认识的几个贡献者在内,大家都是使用最简单的 ngx.logngx.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
立即购买
登录 后留言

全部留言(8)

  • 最新
  • 精选
  • 阳光梦
    老师说了这么多,哪个去重点啊?

    作者回复: 这个看情况了,一般是日志和火焰图

    2019-08-16
    2
  • krugle
    coroutine 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-16
    2
    1
  • krugle
    求助,我们有几千个域名绑定,导致nginx每个进程800m,现在使用openresty动态加载 刚弄完还没上线 这个有没有什么坑,就是每次获取servername 然后清除之前的证书 在重新设置证书,请教下有没有什么坑,会不会有并发问题

    作者回复: lrucache+共享字典两层缓存,不用把所有证书都加载在内存中

    2019-08-16
    3
  • 许童童
    不要给我说什么动态调试,火焰图!老夫用console高度代码就是一把梭!
    2019-08-16
    4
    4
  • 阳光梦
    个人觉得,1,日志调试; 2,二分法日志调试;3,火焰图; 4,gdb。够了
    2019-08-16
    2
  • 猪小擎
    色块的宽带代表调用次数的多少,性能消耗多少鼠标悬浮上边有CPU消耗百分比。
    2022-04-08
    1
  • helloworld
    老师,最近写项目遇到了一个奇怪的问题,ngx.location.capture 请求其他的内部location的时候,会跳过该location的access阶段,反复测试发现rewrite阶段代码执行了,content阶段代码也执行了,就是access阶段代码不执行,这个是什么原因呢?
    2019-08-17
  • 连边
    好范。
    2019-08-16
收起评论
显示
设置
留言
8
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部