静态初始化期间的死锁

Deadlock during static initialization

我 运行 在 Solaris 的静态初始化过程中陷入僵局。这种情况与 this user's problem.

非常相似

我的环境是:

症状:

由于跨过第一行没有用,所以我跨了进去,然后又跨了出去,断点又被击中了。

我重新启动了进程并在遇到断点后介入然后开始步进。跳过对 boost::system::error_category::error_category() 的调用,我 运行 遇到了同样的问题。

我又试了一次,这次是在我到达 error_category() 调用时步进指令。它试图通过调用 elf_rtbndr() 的 PLT 调用它,它应该 return %o0 中的真实函数地址,但是当我再次跨过对 elf_rtbndr() 的调用时命中断点而不是从中断处继续。

当第 2 次遇到断点时,它会在其他一些共享库的 _init() 中调用 generic_category();那就是死锁发生的时候。

提前感谢您的宝贵时间和帮助。

这已被报告多次(参见 this post in Boost and another in GCC)。这似乎是 Boost 初始化期间的循环依赖问题,出于某种原因,它只在 Solaris 上出现。通常的建议是通过搞乱库初始化来解决这个问题(例如,像使用 -lboost_system 那样打乱库顺序)。

另一种选择是禁用线程安全保护(-fno-threadsafe-statics 标志),这将消除死锁,但会保留错误的嵌套构造函数调用,这是不可取的。