Debug 日志:eCapture GH-604

Debug 日志:eCapture GH-604

💡 原文中文,约13200字,阅读约需32分钟。
📝

内容提要

这篇文章讨论了eCapture项目在Ubuntu下编译二进制文件时出现Segment Fault的问题。经过排查发现,问题是由于使用了Gin框架导致的。进一步分析发现,问题是由于Golang在CGO调用getaddrinfo时使用了glibc的变量导致的。解决方法是避免使用glibc提供的DNS查找,而使用Go内置的DNS来处理。文章还讨论了使用外部链接器以静态链接方式进行链接时,不同版本的glibc中特定字段的offset不一致导致的Segment Fault问题。

🎯

关键要点

  • eCapture项目在Ubuntu下编译二进制文件时出现Segment Fault问题。
  • 问题源于使用Gin框架,导致Golang在CGO调用getaddrinfo时使用了glibc的变量。
  • 解决方法是避免使用glibc提供的DNS查找,改用Go内置的DNS处理。
  • 不同版本的glibc中特定字段的offset不一致,导致静态链接时出现Segment Fault。
  • 使用git bisect确定问题是由938fcffb95e23015af8643ae046c0e912de0a438引入的。
  • 通过调试发现,使用localhost作为监听地址时触发DNS Lookup,导致CGO使用glibc的getaddrinfo。
  • 在构建参数中新增-tags 'netgo'后,问题得到解决。
  • 静态链接时,__ctype_init等方法被静态编译至二进制中,导致不同glibc版本间的offset不一致。
  • 总结指出,问题的根本原因在于不同glibc版本间的结构变化导致的offset不一致。
🏷️

标签

➡️

继续阅读