C/ c++程序中的堆栈损坏问题

Corrupt stack problem in C/C++ program

本文关键字:堆栈 损坏 问题 c++ 程序      更新时间:2023-10-16

我在linux服务器上运行C/c++程序来提供视频。该程序的(比如名为Plugin)核心功能是转换视频,我们为每个视频请求fork一个单独的Plugin进程。但我有一个奇怪的问题,有时服务器的平均负载会出乎意料地高。在这个阶段,我从top命令中看到的是,有一些进程运行了很长时间,占用了大量的CPU。

当我用gdb和backtrace堆栈调试这个正在运行的程序时,我发现的是损坏的堆栈:"前一帧在此帧内部(损坏的堆栈?)"。我搜索了网络,发现如果程序得到分段错误,就会发生这种情况。

但是我知道如果程序得到分段错误,程序应该崩溃并退出。但令人惊讶的是,程序仍然运行后分割故障。

这可能是什么原因?我知道这个项目肯定有一些大问题,但我就是不明白从哪里开始解决问题……如果你们谁能给我看几盏灯就太好了……

Thanks in advance

附加调试器会改变进程的行为,因此您很可能无法获得可靠的调查结果。来自调试器的损坏的堆栈消息可能意味着特定的调试器不理解二进制文件中的文本信息。

我建议随后在问题上运行pstack几次(这被称为"蒙特卡罗性能分析"),并将stracetruss附加到问题上,并检查进程在消耗CPU时正在做什么系统调用。

在Valgrind下运行程序并修复它发现的任何无效内存写入

某些优化,如帧指针省略,会使调试器更难理解堆栈。

如果您有代码,请在调试中编译程序并在其上运行Valgrind。

如果您没有代码,请联系程序的作者/提供者。

损坏的堆栈消息仅仅意味着代码对内存做了一些奇怪的事情。这并不意味着程序有分段错误。此外,如果程序选择处理SIGSEGV信号,它仍然可以运行。

如果通过分叉你的意思是你有一些进程产生并运行其他较小的进程,只监视这样的峰值并重启进程。这假定您无法访问修复程序。

通过汇编代码操作可能会对堆栈进行一些有趣的操作,例如真正的尾部递归优化、自修改代码、非返回函数等,这可能会导致调试器无法正确地反向跟踪堆栈并导致它触发损坏的堆栈错误,但这并不一定意味着内存损坏了……但绝对有一些非传统的东西在幕后发生。