精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
服务方向
联系方式
锐英源精品原创,禁止转载和任何形式的非法内容使用,违者必究。点名“简易百科”和“闲暇巴”盗用锐英源原创内容。
最近遇到gmtime时间解析异常错误,经过查找,问题解决,现把异常解决过程分离下。
执行的代码行是:
tmTme = *gmtime( &ttCurTme );
ttCurTme是time_t类型,tmTme是 struct tm类型,tm类型能够获取时间的年月日时分秒,而time_t是个整数类型,两种时间各有用处,也可以按照约定转换,但是解析异常了,在Debug模式下弹出了异常提示窗口。
在监视窗口里看到ttCurTme的值是0xffffffff7c526e01,开头是0xf,肯定是负值,负值进行转换肯定是异常。
就查找负值的来源,因为代码跨了模块,查找有点麻烦,这个时间值在这里相当于消费者,要找生产者地方。
查找函数名和变量名,找到时间对象的初始化位置是在读取文件后转换文件内容时初始化,在初始化地方设置断点,发现用了中文来转成整数对时间进行初始化,中文肯定不是正规数字,转换后肯定会是个错误的时间数值,用错误的时间数值来进行tmtime肯定有问题。
变量名定义的有意义,能清晰区分,能帮助异常解决。
初学者经常接触的例子是函数局部内赋值和转换,通常不会有错误,在跨模块代码情况下,遇到错误就不好解决,这个过程请大家记好。