事件过程,很杂乱,可以不看。
一个服务程序,在客户部署环节,时不时就会出现服务启动就崩溃的问题。非常奇怪,本地完全无法复现。
这一次,经研发远程调试发现,反复启动几次就能成功启动服务(后来证明其中漏掉了关键步骤)。
反馈到我这里,安排了测试工程师复现问题。测试工程师在自己测试电脑上反复安装、启动、重启、卸载,无法复现。
我又找来和客户一模一样的设备,交给测试工程师验证,安装卸载多次,依然无法复现。
困局啊。。。
找来研发工程师,远程调试的那位,“小A,你来一下,你把你在远程操作的过程,重新操作一遍。”,坐下,然后开始安装,设置,隐藏目录。
“等会,隐藏目录干什么?”
“实施工程师在客户那就是这么干的,我按照那边步骤来的。”
“好,你继续”
启动服务,服务崩溃,问题复现。
查看dump文件,崩溃在算法,找算法工程师,看吧,崩溃在算法,解决一下呗。
给算法演示,一遍,设置显示,设置隐藏崩溃;二遍设置不隐藏,服务启动成功,第三遍,设置隐藏,服务启动成功,耶服务成功了。从头再来。。。
过程很是折腾,简单点,最后工程师定位在算法模块调用的printf函数上。
----------------------------------------------------------------------------------------------------------
个人习惯比较特别,特别爱解决别人解决得模模糊糊的或解决不了的问题。
模仿服务,写代码,重定向stdout,然后隐藏文件夹,运行,没崩溃,再运行没崩溃,反复10余次,没崩溃。
重新设置为显示,再隐藏,运行,崩溃。终于复现。
崩溃在printf中,好,顺腾摸瓜,检查freopen_s返回错误(所有的错误其实都是这里没有检查函数返回状态引起的,然后逐步传递加深,导致排查越来越麻烦。)返回13,错误,但难于分辨是什么原因。
继续去掉多层目录的隐藏属性,逐层设置,哦,最后确认跟目录的隐藏没关系,只要被重定向的文件有隐藏属性就会崩溃。
好,再继续,文件设置成隐藏,修改文件打开方式,w,w+,,wb,a,a+等全部试验一遍,带W的都失败。
缩小问题范围了,google吧,找到官方文档:
https://docs.microsoft.com/zh-cn/windows/win32/api/fileapi/nf-fileapi-createfilea
这就是为什么文件存在,且是隐藏的时候,w模式会失败,这等于从原文件继承了hidden属性,w则是create_always属性,函数执行失败,而c语言的freopen_s函数想来是包装了createfile函数(未经验证),错误就藏得更深了。