c++ - 什么可以修改帧指针?

标签 c++ callstack corruption

我现在在工作中的一个相当大的 C++ 应用程序中突然出现了一个非常奇怪的错误(在 CPU 和 RAM 使用以及代码长度方面很大 - 超过 100,000 行)。这是在双核 Sun Solaris 10 机器上运行的。该程序订阅股票价格提要并将它们显示在用户配置的“页面”上(页面是用户定制的窗口结构——该程序允许用户配置此类页面)。在其中一个底层库变成多线程之前,这个程序过去一直没有问题。受此影响的程序部分已相应更改。关于我的问题。

大约每执行三次程序就会在启动时出现段错误。这不一定是一个硬性规定——有时它会连续崩溃 3 次,然后连续工作 5 次。有趣的是段错误(阅读:痛苦)。它可能以多种方式表现出来,但最常见的情况是函数 A 调用函数 B,并且在进入函数 B 时,帧指针将突然设置为 0x000002。函数 A:

   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 机器上构建它,虽然我没有在那里遇到段错误,但大约三分之一的时间它会卡住在我身上。

最佳答案

堆栈损坏,绝对是 99.9%。

您应该仔细寻找的气味是:-

  • “C”数组的使用
  • 使用“C”strcpy 风格的函数
  • 内存复制
  • malloc 和免费
  • 任何使用指针的线程安全
  • 未初始化的 POD 变量。
  • 指针运算
  • 尝试通过引用返回局部变量的函数

关于c++ - 什么可以修改帧指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/252028/

相关文章:

c - malloc问题和内存堆

git - 使用Git时如何解析 "Error: bad index – Fatal: index file corrupt"

c++ - C++中的静态公共(public)值函数

c++ - 为什么将我的程序与 iso_c_binding 链接会导致对 __gfortran_ 的 undefined reference ?

c++ - Visual Studio 的图形诊断未捕获任何数据

c# - Visual Studio 2010 线程窗口中的 <Not Available> 和 [Thread Destroyed] 详细信息

c - 双链表 - 内存损坏

c++ - 从左值中推导模板返回类型?

c++ - 从头开始创建,还是在 Scratch 上构建?

node.js - Node.js 14.15.0 中的异步堆栈跟踪