我现在在一个相当庞大的 C++ 应用程序中出现了一个非常奇怪的错误(在 CPU 和 RAM 使用以及代码长度方面非常大 - 超过 100,000 行)。这是在双核 Sun Solaris 10 机器上运行的。该程序订阅股票价格馈送并将它们显示在用户配置的“页面”上(页面是用户自定义的窗口结构 - 该程序允许用户配置此类页面)。在其中一个底层库变为多线程之前,该程序一直可以正常工作。受此影响的程序部分已相应更改。关于我的问题。
大约在每三次执行中,程序将在启动时出现段错误。这不一定是硬性规则——有时它会连续崩溃 3 次,然后连续工作 5 次。有趣的是段错误(阅读:痛苦)。它可能以多种方式表现出来,但最常见的情况是函数 A 调用函数 B,进入函数 B 时,帧指针会突然设置为 0x000002。功能一:
result_type emit(typename type_trait<T_arg1>::take _A_a1) const
{ return emitter_type::emit(impl_, _A_a1); }
这是一个简单的信号实现。impl_ 和 _A_a1 在崩溃时的框架内定义良好。在实际执行该指令时,我们最终到达程序计数器 0x000002。
这并不总是发生在该功能上。事实上,它发生在很多地方,但这是最简单的情况之一,不会留下太大的错误空间。有时会发生的情况是堆栈分配的变量会突然无缘无故地坐在垃圾内存上(总是在 0x000002 上)。其他时候,相同的代码会运行得很好。所以,我的问题是,什么可以如此严重地破坏堆栈?什么实际上可以改变帧指针的值?我当然从来没有听说过这样的事情。我能想到的唯一一件事就是在数组上越界写入,但我已经使用堆栈保护器构建了它,它应该会出现这种情况的任何实例。我在这里的堆栈范围内也很好。我也不 看不到另一个线程如何覆盖第一个线程的堆栈上的变量,因为每个线程都有自己的堆栈(这都是 pthreads)。我已经尝试在 linux 机器上构建它,虽然我没有在那里遇到段错误,但大约有三分之一的时间它会冻结在我身上。