一个很有意思的序列化崩溃问题 -- 简化问题找到根源
2010-02-18 16:11
337 查看
一个很有意思的序列化崩溃问题
现象是这样的,我们的一个C++Appplication 打开一个 以前版本的文件,崩溃。而且从崩溃的地方看很难看出是什么原因的崩溃的,因为崩溃在CObList中。
我想做过S3K的人都知道我们做本版兼容问题的方法,就是存储当前的版本号,然后作一定的处理。
从当时的崩溃Context我找不出任何线索,是什么原因崩溃的,看上去像是 Heap破坏,因为其中一个序列化出来的 CObject的vptb是垃圾数据。然后是使用Application Verifier
来监控程序,运行也没有发现 Heap破坏的问题。这样半天时间也没查出个所以然来。
后来仔细思考,检查各个本版中序列化的主要的change, 没有什么发现。最后发现一个主要的变化,就是当前版本是unicode编译,而以前是multibyte
想起了这个,我怀疑是CString序列化会有问题,我写了个小程序作试验,分正就是用CFile 和CArchive来保存一个字符串到二进制文件,一开始用Multibte编译保存,然后用Unicode编译,并打开文件,发现绝然没有问题,呵呵
仔细看CString的实现,发现它内部的做了相应的处理,会转换。经过一系列的排查,发现是在序列化LOGFONT结构的时候会出问题,因为这个结构有个成员是TCHAR数组,这个肯定会有问题,最后修正方法也简单,我就是把读出来的char数组,转换为一下就可以了
我的问题是,如果我没有怀疑到Unicode支持的问题上,一般我们怎么快速定位序列化兼容性的问题呢?
我的想法是进行数据简化. 1,用老版本软件打开这个文件,简化文件内容,保存 2,用新版本软件打开 3,重复步骤1和2,直到找到兼容有问题的对象,再设断点跟踪
现象是这样的,我们的一个C++Appplication 打开一个 以前版本的文件,崩溃。而且从崩溃的地方看很难看出是什么原因的崩溃的,因为崩溃在CObList中。
我想做过S3K的人都知道我们做本版兼容问题的方法,就是存储当前的版本号,然后作一定的处理。
从当时的崩溃Context我找不出任何线索,是什么原因崩溃的,看上去像是 Heap破坏,因为其中一个序列化出来的 CObject的vptb是垃圾数据。然后是使用Application Verifier
来监控程序,运行也没有发现 Heap破坏的问题。这样半天时间也没查出个所以然来。
后来仔细思考,检查各个本版中序列化的主要的change, 没有什么发现。最后发现一个主要的变化,就是当前版本是unicode编译,而以前是multibyte
想起了这个,我怀疑是CString序列化会有问题,我写了个小程序作试验,分正就是用CFile 和CArchive来保存一个字符串到二进制文件,一开始用Multibte编译保存,然后用Unicode编译,并打开文件,发现绝然没有问题,呵呵
仔细看CString的实现,发现它内部的做了相应的处理,会转换。经过一系列的排查,发现是在序列化LOGFONT结构的时候会出问题,因为这个结构有个成员是TCHAR数组,这个肯定会有问题,最后修正方法也简单,我就是把读出来的char数组,转换为一下就可以了
我的问题是,如果我没有怀疑到Unicode支持的问题上,一般我们怎么快速定位序列化兼容性的问题呢?
我的想法是进行数据简化. 1,用老版本软件打开这个文件,简化文件内容,保存 2,用新版本软件打开 3,重复步骤1和2,直到找到兼容有问题的对象,再设断点跟踪
相关文章推荐
- 一个看上去很有意思的崩溃问题
- 从爬网时候遇到的一个问题看如何找到错误的根源
- java序列化多次序列化到同一个文件及反序列化的问题[转载]
- MongoDB中对象反序列化的一个小问题
- java的接口相关的,一个有意思的问题
- 一个有意思的UNICODE问题:导出excel表格
- 今天有同学提了一个很有意思的问题, 涉及到曲线坐标, 我没做出来...
- 初学unity 3D 遇到的一个问题--预制体选项没有找到。
- 一个目前没找到原因的问题
- 工作中遇到的一个相当有意思的问题(关于Windows和linux环境下执行PHP,ajax,javascript,flexigrid的一个莫名异常)
- 使用eclipse进行Android编程发生崩溃的一个问题及解决办法
- 三年前一个域名问题,现在找到原因了
- 清结算内部勾兑业务一个比较有意思的问题整理
- 一个由sizeof引出的有意思的问题
- 遇到一个比较有意思的NIO问题!
- 一个有意思的小问题
- 一个有意思的类扩展 有效解决判空问题
- 一个关于解决序列化问题的编程技巧
- 很有意思的一个小问题
- 经常遇到的一个问题是 MFC中开启多线程后 在非主线程中使用updata函数出现崩溃的情况。