我现在在一个相当庞大的C++应用程序中出现了一个非常奇怪的错误(大量的CPU和RAM使用以及代码长度 - 超过100,000行).这是在双核Sun Solaris 10计算机上运行的.该程序订阅股票价格馈送并将其显示在用户配置的"页面"上(页面是由用户定制的窗口构造 - 该程序允许用户配置这些页面).在其中一个底层库变为多线程之前,该程序过去没有问题.受此影响的程序部分已相应更改.关于我的问题.
大约每三次执行一次,该程序将在启动时出现段错误.这不一定是一个严格的规则 - 有时它会连续三次崩溃,然后连续工作五次.这是有趣的段错(阅读:痛苦).它可以以多种方式表现出来,但最常见的是函数A调用函数B,并且在进入函数B时,帧指针将突然设置为0x000002.功能A:
result_type emit(typename type_trait::take _A_a1) const { return emitter_type::emit(impl_, _A_a1); }
这是一个简单的信号实现.impl_和_A_a1在崩溃时在其框架内定义良好.在实际执行该指令时,我们最终在程序计数器0x000002处.
这并不总是发生在该功能上.事实上,它发生在很多地方,但这是一个更简单的案例,不会留下太多的错误空间.有时会发生什么是堆栈分配的变量将突然出现在垃圾内存(总是在0x000002上),无论如何.其他时候,相同的代码将运行得很好.所以,我的问题是,什么能够严重破坏堆栈?什么可以实际改变帧指针的值?我当然没听说过这样的事情.关于我能想到的唯一一件事是在数组上写出越界,但是我用堆栈保护器构建了它,它应该提供任何发生的实例.我也在这里的堆栈范围内.我也不喜欢 看看另一个线程如何覆盖第一个线程堆栈上的变量,因为每个线程都有自己的堆栈(这都是pthreads).我已经尝试在linux机器上构建它,虽然我没有在那里得到段错误,但大约有三分之一它会冻结在我身上.
堆栈腐败,绝对是99.9%.
你应该仔细观察的气味是: -
使用'C'数组
使用'C'strcpy风格的功能
的memcpy
malloc和免费
任何使用指针的线程安全
未初始化的POD变量.
指针算术
尝试通过引用返回局部变量的函数