我在linux服务器上运行C / C ++程序来提供视频服务。该程序(称为插件)的核心功能是转换视频,我们为每个视频请求分配一个单独的插件流程。但我有一个奇怪的问题,有时服务器负载平均值会出乎意料地高。我在这个阶段从top命令看到的是有一些进程长时间运行并占用了一些巨大的CPU。
当我使用gdb和backtrace堆栈调试这个正在运行的程序时,我发现的是损坏的堆栈:“此框架内部的前一帧(损坏的堆栈?)”。我搜索过网,发现如果程序出现分段错误就会发生这种情况。
但我知道如果程序出现分段错误,程序应该崩溃并在那时退出。但令人惊讶的是,该程序仍然在分段故障后运行。
这可能是什么原因?我知道程序中一定存在一些大问题,但我无法理解从哪里开始解决问题...如果你们中的任何一个人能给我看一些灯就会很棒......
提前致谢
答案 0 :(得分:2)
附加调试器会更改进程的行为,因此您很可能无法获得可靠的调查结果。来自调试器的损坏的堆栈消息可能意味着特定的调试器无法理解二进制文件中的文本信息。
我建议随后在问题上多次运行 pstack (这称为“蒙特卡罗性能分析”)并附加 strace 或 truss < / em>解决问题并检查进程在消耗CPU时进行的系统调用。
答案 1 :(得分:1)
在Valgrind下运行您的程序并修复它找到的任何无效内存写入。
答案 2 :(得分:0)
某些优化(例如帧指针遗漏)会使调试器更难理解堆栈。
答案 3 :(得分:0)
如果您有代码,请在debug中编译程序并在其上运行Valgrind。
如果您没有该代码,请与该计划的作者/提供者联系。
损坏的堆栈消息只是意味着代码正在对内存做一些奇怪的事情。这并不意味着程序存在分段错误。此外,如果程序选择处理SIGSEGV信号,程序仍然可以运行。
如果通过分叉意味着您有一些产生并运行其他较小进程的进程,则只需监视此类尖峰并重新启动该进程。这假设您无法访问修复程序。
答案 4 :(得分:0)
通过汇编代码操作可能会对堆栈进行一些有趣的操作,例如真正的尾递归优化,自修改代码,非返回函数等,可能导致调试器无法正常返回 - 支持堆栈并导致它触发损坏的堆栈错误,但这并不一定意味着内存已损坏......但绝对是非传统的东西正在发生在幕后。