有生以来遇到的最匪夷所思的bug
今天在写项目的一些测试代码,要做的事情很简单,就是在gpgpu-sim上加一些数据统计。
目标很简单,实现也没有什么非常困难的地方,也用常用的测试跑出来了结果。
当我开始跑大批量的测试的时候,问题来了。大部分的测试都能正常运行,当我准备做点其他事等测试的时候,看到了5个测试报了segmentation fault。
我debug segmentation fault的经验还算多,所以就直接打开debugger挂上去跑。
没想到seg fault落在了一个和我修改的内容完全不相关的地方。
我的修改主要是在一个类里加了个二维数组
和原本的代码是没有任何关联的。
所有新增的代码也都是对这个数组进行修改,没有碰到任何其他的数据。
但就是在一个八竿子打不着的std::map里产生了Seg fault。
后面的几个小时我就开始一点点注释掉添加的代码去缩小错误的范围。一般来说,找到引发bug的地方就可以很轻松的解决bug,但这次完全不一样。
我花了一段时间,把错误精确到了一行
就是这一个循环里的数组自加让遥远的一个std::map产生了seg fault。
当我看到这个地方有问题的时候,就觉得这肯定不是我码的问题了。
后面进一步缩小范围(其实已经没有什么用了,只是好奇),把循环手动展开后,定位到了更精确的一行
只有这一个数组访问会引发错误
最后的解决办法是把数组的两个维度调换了下位置,就莫名其妙的解决了
最大的可能就是编译器或者STL出了bug,或者gpgpu-sim里面用到了一些undefined behavior
以为解决了,但好像并没有完全解决