过去几个月,我们一直试图在我们的大型遗留应用中追踪一些奇怪的行为。它遭受随机和偶然的内存损坏,vtable损坏(??),以及其他奇怪和随机的行为,如std :: rbl_tree,std :: map中的无限循环,甚至std :: string s =“abcd”。
目标机器是32位Centos 6所以我们从内置g++
4.4开始,但是地址清理程序不可用,所以在devtoolset-2中移动到4.8并且现在编译了{{1}来自消息来源。
gcc 4.9
(v3.8.1)不适用于其中任何一项 - 它会Valgrind
unhandled instruction bytes: 0xC5 0xF9 0x6E 0xC5
报告gcc 4.8和4.9之间的不同错误,并经常报告虚假全局缓冲区溢出错误,如
读取0x080e3ad4时出错,其中0x080e3ad4位于0字节 全局变量'x'的权利
除了0x080e3ad4 x的地址外
更糟糕的是,gcc版本之间的错误行为是不同的。
我已经阅读了很多帖子,比较了gcc v5,6,7的速度优势,但没有关于它们产生的代码的稳定性。
由于需要花费很多精力来构建一个新的gcc并重新配置我们的大型应用程序来构建它,并且测试&为客户打包分发,问题在于:
AddressSanitizer
如何改进? 所有建议都表示赞赏。这个问题花了好几个月。
修改
要清楚,我希望得到有效的工具(例如AddressSanitizer
,AddressSanitizer
或其他),以便我们可以修复基础行为。这些调试工具是否工作与编译器环境相关,而不是我们的C ++程序。 (例如,程序中没有汇编程序,因此Valgrind
应该理解编译器的指令和/或编译器应该发出Valgrind理解的操作码,作为一个例子。
编辑II
G ++编译器标志(用于调试编译)
Valgrind
目标硬件:i5-6500