现象
线上排查问题时发现,有一组机器上docker里面的gdb程序有异常,执行gdb run或者gdb attch命令时,其中一台机器会卡主,其余机器会报一些错误。
查看卡主时候gdb进程的堆栈,发现gdb进程再等某个锁
执行 lsof -p <进程pid> 发现gdb进程锁住了/var/lib/rpm/.dbenv.lock,锁住了rpm db的锁
再到进程中执行rpm -qa这个命令也会卡主。推测是rpm db损坏或者锁损坏导致。
到gdb不卡主,但报错db打开失败的机器容器里,执行rpm -qa,会报db打开失败的信息,但不会卡主。
猜测原因
容器内rpm的db损坏,在容器内执行rpm -qa可能有2个后果
1.命令卡主
2.命令返回打开db异常,报错
gdb调试一个程序的时候,会打开rpm db做一些动作。可能要找debuginfo包之类的。
当rpm db损坏的时候,gdb run调试程序,同样会发生2种情况
1.gdb命令卡主
2.命令返回打开db异常,报错
解决
再上网根据资料重建rpm db。删除/var/lib/rpm/.dbenv.lock。
修复完成后,再次执行gdb 命令,不会卡主也不会报错,问题解决