当前位置:  开发笔记 > 编程语言 > 正文

什么可以修改帧指针?

如何解决《什么可以修改帧指针?》经验,为你挑选了1个好方法。

我现在在一个相当庞大的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机器上构建它,虽然我没有在那里得到段错误,但大约有三分之一它会冻结在我身上.



1> Roddy..:

堆栈腐败,绝对是99.9%.

你应该仔细观察的气味是: -

使用'C'数组

使用'C'strcpy风格的功能

的memcpy

malloc和免费

任何使用指针的线程安全

未初始化的POD变量.

指针算术

尝试通过引用返回局部变量的函数

推荐阅读
mobiledu2402851377
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有