C/ c++程序中的堆栈损坏问题
Corrupt stack problem in C/C++ program
我在linux服务器上运行C/c++程序来提供视频。该程序的(比如名为Plugin)核心功能是转换视频,我们为每个视频请求fork一个单独的Plugin进程。但我有一个奇怪的问题,有时服务器的平均负载会出乎意料地高。在这个阶段,我从top命令中看到的是,有一些进程运行了很长时间,占用了大量的CPU。
当我用gdb和backtrace堆栈调试这个正在运行的程序时,我发现的是损坏的堆栈:"前一帧在此帧内部(损坏的堆栈?)"。我搜索了网络,发现如果程序得到分段错误,就会发生这种情况。
但是我知道如果程序得到分段错误,程序应该崩溃并退出。但令人惊讶的是,程序仍然运行后分割故障。
这可能是什么原因?我知道这个项目肯定有一些大问题,但我就是不明白从哪里开始解决问题……如果你们谁能给我看几盏灯就太好了……
Thanks in advance
附加调试器会改变进程的行为,因此您很可能无法获得可靠的调查结果。来自调试器的损坏的堆栈消息可能意味着特定的调试器不理解二进制文件中的文本信息。
我建议随后在问题上运行pstack几次(这被称为"蒙特卡罗性能分析"),并将strace或truss附加到问题上,并检查进程在消耗CPU时正在做什么系统调用。
在Valgrind下运行程序并修复它发现的任何无效内存写入
某些优化,如帧指针省略,会使调试器更难理解堆栈。
如果您有代码,请在调试中编译程序并在其上运行Valgrind。
如果您没有代码,请联系程序的作者/提供者。
损坏的堆栈消息仅仅意味着代码对内存做了一些奇怪的事情。这并不意味着程序有分段错误。此外,如果程序选择处理SIGSEGV信号,它仍然可以运行。
如果通过分叉你的意思是你有一些进程产生并运行其他较小的进程,只监视这样的峰值并重启进程。这假定您无法访问修复程序。
通过汇编代码操作可能会对堆栈进行一些有趣的操作,例如真正的尾部递归优化、自修改代码、非返回函数等,这可能会导致调试器无法正确地反向跟踪堆栈并导致它触发损坏的堆栈错误,但这并不一定意味着内存损坏了……但绝对有一些非传统的东西在幕后发生。
- 将大双精度转换为无符号 int 期间堆栈损坏
- 程序终止时堆栈损坏?
- 为什么我的visual c++在堆栈损坏的情况下没有触发堆栈损坏错误
- 调试堆栈损坏问题
- 如何在退出时修复OpenGL堆栈损坏
- OpenCV C++:声明一个新变量会导致堆栈损坏
- 使用 sscanf 堆栈损坏
- C#到C代码P/调用多个std:字符串声明导致堆栈损坏
- 填充数组会导致数组周围的堆栈损坏
- 试图计算fibonacci(n)的变量“f”周围的堆栈损坏
- C++-如何在程序退出时找到堆/堆栈损坏的源
- 链表实现的堆栈损坏
- 可视化C++映射迭代和堆栈损坏
- 在 c++ 中 int 数组周围堆栈损坏错误
- 测试《毁灭战士3》堆栈实现时堆栈损坏
- 如何知道析构函数中的堆栈损坏来自何处
- 在c++中添加int数组时,试图找出堆栈损坏的问题
- 用错误的“”调用构造函数;这个“;指针.这是堆栈损坏吗
- GetCPUDescriptorHandleForHeapStart堆栈损坏
- memcpy之后堆栈损坏