虽然问题解决了,但其中的奥秘还不甚了解,这里只是暂时做一个存档。
今天项目中遇到一个崩溃问题,崩溃点随机,调试的时候,单步跟踪调试也很诡异,处理了好一段时间也没有解决 ,然后组长说该项目其他人也在维护,他们修改了某个模块,但是头文件好像没有上传,更新头文件后,重新编译运行,果然不再崩溃了,bug解决了。
总结:
问题的原因是:头文件和源文件不匹配导致的,但是能够编译过。
这样的问题这是第二次遇到,在遇到运行时崩溃,崩溃点随机,且单步跟踪调试代码比较诡异(如感觉调试时代码不匹配,某个变量值发生莫名的变化(赋值之后不应该变化)等)的现象时,可以考虑是不是头文件与库文件或是源文件不匹配的情况。但是头文件不匹配会怎样,原理是什么还没有搞明白。
以下是转载:原文链接:http://blog.csdn.net/zdl1016/article/details/8690061
头文件和.a(库文件不匹配)导致虚函数错位,进而导致的bug
头文件和.a(库文件不匹配)导致虚函数错位,进而导致的bug
该bug的快速定位技巧
bt查看函数调用堆栈. 如果堆栈的顺序错乱, 则可能是虚函数表错乱导致.
本例中, GetTPLContent 的上层很明显不应该是 DealInput, 因为DealInput没有调用GetTPLContent
故障回顾:
某日遇到一个奇葩bug, 进程core, 查看堆栈, core的位置没有任何异常, 在一个不可能出问题的地方出错了. 只根据core文件在生产环境无法排查.
在开发机生把cgi编译成可执行文件, 用gdb跟踪, 发现在 单步跟进 BeforeProcess() 函数时, 却意外的跳到了 GetTPLContent()函数接下来就是core了.
中断现场如下:
rogram received signal SIGSEGV, Segmentation fault.
[Switching to Thread -1211028832 (LWP 10060)]
0xb7ef2422 in std::string::compare () from /usr/lib/libstdc++.