背景
钉钉突然收到一个crash的告警,然后下载了dump分析。
过程
使用
1 | .ecxr 查看异常上下文 |
很明显是由于 调用了 std::copy_file 函数抛出了异常。
首先查看指定路径下 filesystem 的源代码
1 | [[noreturn]] inline void _Throw_fs_error( |
copy_file 函数调用了std_fs_copy_file,结果返回 != std_win_error::_Success 结果导致异常。
查看__std_win_error 错误类型有哪些
1 | enum class __std_win_error : unsigned long { |
先查看 From “d://xxx.ini” To “d://xxx.ini.bak” 参数没有问题,可以排除以上大部分错误
最后应该只剩下 _File_not_found 可能性最大了
历史记忆
说到这个问题,不得不说一直使用的windows函数 WritePrivateProfileString/GetPrivateProfileInt 函数。这个函数单独使用并不存在问题,但是如果和fopen 等函数配合使用时,就会出现问题。
比如A线程在WritePrivateProfileString/GetPrivateProfileInt,而B线程写模式fopen相同的文件,那么fopen成功之后,调用fwrite/fflush 会失败,并会把文件内容清空;错误原因非常相似。
修改方法
因为 copy_file 并不是必须的,所以
1、增加try_catch 保护
2、WritePrivateProfileString/GetPrivateProfileInt 这类函数替换成自己重载的 memini::GetPrivateProfileInt/WritePrivateProfileString [https://github.com/yingchengpa/memIni]