STL对象出现运行时错误Core的几个可能原因
来源:互联网 发布:日本演员知乎 编辑:程序博客网 时间:2024/05/02 04:27
写C++服务器程序时发现几次Core在了STL对象操作中,这种问题非常难以定位,因为基本上不用去怀疑STL的正确性。而且这种问题往往很少复现,所以分析起来就更头疼了。下面分享下几次定位出的问题点,以供分享,同时也作为自己的一个记录。
1. gcc版本不一致,编译环境的GCC版本和运行环境的GCC版本不一致。
---这种情况出现core后,从上下文分析完全没有逻辑,所以自己部署程序时必须保证编译环境和运行环境GCC完全一致,包括程序用到的其它动态库,如libssl, libmysqlclient 等等都尽量保证一致,这样才能避免莫名其妙问题的产生。
2. 修改代码后没有Make clean;直接Make
---这种做法在少数情况下同样会产生莫名奇妙的问题,所以建议大家不要省那么写重新make的时间以避免问题。
3.stl对象内存被踩
---这种情况常出现在stl对象作为静态或全局变量时,解决这种问题的方法和分析通常问题一样,可以分为3步:
A. review代码,分析上下文,分析内存位置和出错对象相近的地方。(可通过工具查看静态空间分配,堆上的动态则可以通过打印地址来查看)
B. 增加log,在整个运行栈都增加对出错stl对象的打印以及模拟操作。(适用于不可复现的情况)
C. 屏蔽代码,定位出错位置。即逐步的减少代码。(仅适用于可复现的问题)
4.*.h文件包含顺序(这个问题相当诡异,没有找到任何文章说明这种问题的原因)
---通常*.h包含顺序为系统库,外部库,内部*.h,并且*.h的包含问题一般都能在编译,链接时检测出来,但我就遇到了这种编译链接都没问题,运行时却偶尔core,调整*.h顺序后OK的情况。 对于这种问题没有什么好的方法,只能提出下面几个原则性的建议。
A. 尽量在*.cpp里面包含*.h,而不要在*.h包含。
B. 避免循环包含,如a.h include b.h, b.h include a.h, 可以重构为 a.h inlcude c.h, b.h include c.h
C.在以上方法都没有解决问题时则可以尝试将内部代码的*.h包换在所有*.h之前。(这招没有什么规律,需要多次尝试,但本人的问题就是这样解决的...)
-------希望以上的方法对大家有帮助,提供下思路,不至于碰到stl对象core就头大了。
- STL对象出现运行时错误Core的几个可能原因
- 几个可能导致链接错误的原因
- makefile 时出现 undefined reference 错误的可能原因
- makefile 时出现 undefined reference 错误的可能原因
- Android: 运行android avd时,可能出现的错误
- 报堆栈错误问题,可能的几个原因
- 加载struts,spring,hibernate出现404错误可能的原因
- 加载struts,spring,hibernate出现404错误可能的原因
- vs2010 运行时出现无法启动程序 拒绝访问的一个可能的原因
- Erlang程序运行时 出现错误原因
- Android APP发布混淆版本时可能出现错误的原因--简记(1)
- make redis出现错误可能原因
- 出现diskioexception可能的原因
- shiny运行如果出现致命错误的可能解决方法
- org.apache.mina.core.RuntimeIoException: Failed to get the session 异常可能出现的原因
- 使用stl标准容器,遍历容器时出现 iterators incompatible 错误的其中两种原因
- CPU 发热的几个可能原因
- CPU 发热的几个可能原因
- 一、目前在ASP.NET中页面传值共有这么几种方式:
- JS延时
- J2ME如何移植到ophone
- 少年不努力,老大徒伤悲
- SVN分支与合并透析
- STL对象出现运行时错误Core的几个可能原因
- 数据的绑定DataBinder
- 解惑 spring 嵌套事务
- bash中的$0,$@,$*等的意义
- P2P项目总结--序:总结经验展望未来
- Intel千兆网卡驱动Linux系统下安装方法
- 驴生态度
- bash中特殊的变量赋值
- 就要爱美眉