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

问题描述

| 我正在linux服务器上运行C / C ++程序来提供视频。该程序(称为插件)的核心功能是转换视频,我们为每个视频请求分叉一个单独的插件过程。但是我遇到一个奇怪的问题,有时服务器平均负载会意外地变高。我在此阶段从最高命令看到的是,有些进程正在长时间运行并占用大量cpu。 当我使用gdb和backtrace堆栈调试此正在运行的程序时,我发现损坏的堆栈是:“此帧内部的先前帧(损坏的堆栈?)”。我搜索了网络,发现如果程序出现分段错误,就会发生这种情况。 但是我知道如果程序出现分段错误,程序应该崩溃并在那一点退出。但是令人惊讶的是,该程序在分段错误后仍然可以运行。 可能是什么原因造成的?我知道程序中肯定有一些大问题,但是我不知道从哪里开始解决问题...如果你们中的任何一个可以给我看看一些灯光,那将是非常不错的... 提前致谢     

解决方法

附加调试器会更改过程的行为,因此您很可能不会获得可靠的调查结果。来自调试器的堆栈消息损坏可能意味着特定的调试器无法理解二进制文件中的文本信息。 我建议随后在有问题的主机上运行pstack数次(这称为“ Monte Carlo性能分析”),并将strace或trus附加到有问题的主机上,并检查消耗CPU时系统在做什么。     ,在Valgrind下运行程序,并修复发现的所有无效内存写入。     ,某些优化(例如,省略了帧指针)会使调试器更难理解堆栈。     ,如果有代码,请在调试中编译程序并在其上运行Valgrind。 如果您没有该代码,请与该程序的作者/提供者联系。 损坏的堆栈消息仅表示代码正在对内存做一些奇怪的事情。这并不意味着程序有分段错误。此外,如果程序选择处理SIGSEGV信号,则程序仍然可以运行。 如果通过分叉来表示您有一些生成并运行其他较小进程的进程,则只需监视此类峰值并重新启动该进程即可。这假定您无权访问该程序。     ,通过汇编代码操作可能会对堆栈进行一些有趣的操作,例如真正的尾递归优化,自修改代码,不返回函数等,这些操作可能导致调试器无法正确地反向跟踪堆栈并导致它触发损坏的堆栈错误,但这并不一定意味着内存已损坏……但是肯定是在幕后发生了一些非传统的事情。