以keepalived为例说明程序不能正常被gdb调试的原因

现象

通过gdb att $keepalived_pid发起对当前运行keepalived的调试;

在放行keepalived继续执行后,想通过Ctrl+C按键中断执行,观察下被调试程序的当前内部状态,
但是,在终端输入Ctrl+C后,导致keepalived被调试进程退出。

gdb无法对keepalived进行正常的调试交互!

结论先行

  • gdbinferior process之间通过ptrace系统调用,以及对signal信号的拦截、传递进行调试交互过程
  • 由终端触发的signal会首先被Kernel路由到inferior process,然后再被gdb截获
  • Linux Kernel针对inferior process信号存在特别的路由机制,会导致某些应用使用了特别信号捕获机制,例如,sigwait or signalfd,并处理了SIGINT信号,则不能被gdb正常调试

缘由

以前就了解到,如果被调试程序使用到类似sigwait特殊的信号捕捉机制,将会导致gdb调试程序遇到麻烦,特别是无法正常使用Ctrl+C按键,中断暂停被调试程序,进行正常的交互操作。

最近遇到keepalived一些问题, 就想用调试的方法看看它的运行时逻辑,在这时就遭遇了现象一样的调试失败。

先搜索了下keepalived源码,并无sigwait的使用过程,因为以前看那篇介绍比较粗,不知道除了sigwait使用方式外,还有signalfd使用方式,也会导致GDB调试遭遇类似问题。
而且,当时觉得keepalived作为比较出名的开源软件,应该不会不支持被调试,所以,并没有在第一时间发现原因。

分析

采用了分掘挖进的方法:

  • 用不同的keepalived版本
  • 用不同的linux部署环境、不同的gdb版本

来分析、验证这个问题,结果发现表象却出奇的一致!

最后,懒得继续研究下去其中到底为什么了,就向keepalived社区提出了Keeppalived不能被正常调试的issue

社区解决方案

keepalived社区称之为Linux Kernel signal bug,但Linux社区保持这样的信号处理特性,有其原因。

最终,keepalived社区用新增启动参数项--ignore-sigint来解决这个问题。

图解

调试模型
信号调试交互序列图

参考

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
云服务器不能使用keepalived原因有以下几点: 首先,云服务器的虚拟化环境与传统服务器不同,云服务商通过软件虚拟化技术将物理服务器划分为多个虚拟服务器,每个虚拟服务器都运行在独立的虚拟环境中。这样做的好处是可以更高效地利用硬件资源,提供弹性和可扩展性。然而,由于云服务器的虚拟化环境,无法直接使用keepalived的功能,因为keepalived是一个基于网络通信的负载均衡和故障转移工具,在云服务器上运行可能会导致某些问题。 其次,云服务商通常已经提供了自己的负载均衡和故障转移解决方案,这些解决方案已经集成到他们的云平台中,例如AWS的ELB、阿里云的SLB等。使用这些云服务商提供的负载均衡和故障转移解决方案可以更好地适应云环境,并且可以与其他云服务(如自动扩容、自动部署)进行集成,提供更全面的解决方案。 最后,使用keepalived需要在虚拟服务器之间通过网络通信来实现状态同步和故障转移,这就需要保证网络延迟和带宽的稳定性和可靠性。而云服务器由于其特殊的虚拟化环境,网络延迟和带宽有时可能会受到限制。因此,在云服务器上使用keepalived可能会导致不稳定的故障转移和负载均衡效果。同时,由于云服务器的架构和网络设置是由云服务商所控制,一般用户无法直接干预和配置网络环境,这使得使用keepalived变得更加困难。 综上所述,虽然在传统服务器环境中,keepalived是一种广泛应用的负载均衡和故障转移解决方案,但由于云服务器的特殊性,不能直接使用keepalived作为负载均衡和故障转移工具。用户应当根据云服务商提供的负载均衡和故障转移解决方案来完成相关配置和管理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值