捉虫记:SHGetSpecialFolderPath返回错误码为2

通常我们想获得系统的一些路径时,都会使用一些Shell函数。比如SHGetSpecialFolderPath,SHGetFolderPath,SHGetKnownFolderPath
等,传入我们想要的路径的CSIDL即可。通常情况下都会得到我们想要的结果。但是也存在例外。

目前从事的工业监控软件的研发,一般的监控软件通常都是属于中大型的系统,还包括组态期和运行期,所以复杂度相对来说还是比较高的。上周测试团队报告了一个Bug,在运行期时,监控日志的保存按钮点击没反应。咋一看,就感觉好像是类似FileDialog的窗口打开失败造成的。之后在我自己的机器上试了一下,保存对话框正常弹出。测试团队那边也不是必现,所以给排查问题带来了很大的不方便,只能在测试团队的机子上调试。最后发现代码中,在“FileDialog”打开前,调用了SHGetSpecialFolderPath方法来获取用户下的Documents文件夹路径,而此时,GetLastError返回的是2。

MSDN上关于SHGetSpecialFolderPath的记载不是很多,后来发现此方法最终是使用系统变量来获取路径的。自己又写了一个小Demo跑到测试那边测试,发现Demo的SHGetSpecialFolderPath返回的路径是正确的。调查到这,问题大概就很清晰了,监控中的某一个进程修改了系统变量!但是因为运行期的进程太多,基本没可能排查到具体是哪一个,什么时候修改了日志进程的系统环境变量。

而此刻另外一个同事为了他的一个Excel进程内存暴涨问题的已经头疼了快一周,刚好排查出是因为我们的一个类似TaskCenter的进程(此进程是所有监控运行期所以进程的父进程,是一个Job对象)在启动后,改变了由它启动的子进程的环境变量。导致有一个报表进程打开某一个excel文件失败,最终导致excel进程内存暴涨。那么问题的原因就很清楚了。在我自己的机子上,启动日志进程,使用procexp检查,username和userprofile是正确的。在测试团队的那边的日志进程的username居然是‘计算机名$‘,然后导致userprofile重定位到一个系统目录下,而系统目录并没有名为Documents的文件夹,所以返回的错误码为2。最终的原因是在做安装包时,错误设置了‘TaskCenter’进程的配置。

在产品最后的测试阶段,暴露的一些Bug都通都是很隐蔽,而且关联面都比较广。可能不仅仅是自己的代码有问题,还有可能跟运行的环境的上下文有关联。此时就需要从更大的视角去分析问题,而不是把问题只局限在它所发生的上下文。同时了解其他同事的动向,和他们沟通也对问题的解决起到一定作用。

时间: 2024-10-13 14:55:38

捉虫记:SHGetSpecialFolderPath返回错误码为2的相关文章

Cocos2d-x 3.8.1+Cocos Studio 2.3.2捉虫记之控制场景文件中的骨骼动画

Cocos2d-x 3.8.1+Cocos Studio 2.3.2捉虫记之控制场景文件中的骨骼动画 引子 这段时间一直努力在把早期版本的拇指接龙游戏(Cocos2d-x 2.2.3+CocoStudio 1.4.0.1)升级到当前相对稳定的高大上环境--Cocos2d-x 3.8.1+Cocos Studio 2.3.2.行程中遇到不少麻烦,时间不知不觉像流水一样悄然逝去(这正是我时不时酸酸地想起"程序猿"三字的主要原因).想之再三,还是努力记录下来,一来为自己可能逝去的记忆,二来为

捉虫记(四)线程安全导致的HighCpu

一个朋友QQ群里说网站启动后会cpu很高,想要帮忙看一下dump. 1.打开windbg加载dump文件后第一个命令lmf,这个命令显示加载的dll以及路径,这样子可以找个dll来帮忙加载sos,(额,我记不住load那么长的路径啊) 0:000> lmf start end module name …… 00007ffb`a3750000 00007ffb`a375a000 version C:\Windows\System32\version.dll 00007ffb`a37e0000 00

MapReduce全局变量之捉虫记

Sublime 2 如何配置Java运行环境 第一步:配置JDK 之前玩过Java的都应该知道,在这里我就不赘述了. 第二步:创建runJava.bat 批处理文件 用记事本创建一个文件命名为runJava.bat 将下面的内容粘贴进记事本即可: @ECHO OFF cd %~dp1 ECHO Compiling %~nx1....... IF EXIST %~n1.class ( DEL %~n1.class ) javac -encoding utf-8 %~nx1 IF EXIST %~n

捉虫记:QT5.2 SSL握手失败问题

最近在测试项目的时候,出现了这样一个bug:在某些win7和 win8主机上,我们的客户端使用paypal进行付款时,出现SSL握手失败的问题. 项目使用QT5.2.1开发,由于QT移植了开源的webkit,我们在项目中内置了一个浏览器,用来完成商品浏览和付款. 问题来了,当然需要进行"捉虫"了. 自从上次OpenSSL爆出"心脏出血"(见wiki),我们也使用了最新的openssl代码. 首先,需要定位问题出现的位置具体在哪里. 好在QT是开源的,方便我们定位问题

ErrorCode枚举类型返回错误码信息测试,手动抛出异常信息,在事务中根据错误码来回滚事务的思路。

ErrorCode.java 简单测试代码,具体应用思路:手动抛出异常信息,在事务中根据错误码来回滚事务的思路. public enum ErrorCode { //系统级 SUCCESS("000000","success"), SYS_ERROR("999999","系统异常"), FAILED("900000","操作失败!"), //交易部分 OWNER_NOT_EXIST(&q

寒假捉虫记——从一段损坏的调用栈开始折腾

放假在家,继续调试<家园>.目前的进度是MinGW上的编译链接都已通过,游戏程序也已经可以跑起来并进入主菜单界面,但加载关卡之后就会闪退.这让我想起了以前上中学时玩盗版游戏的日子.那个年代的单机游戏估计大多是用C/C++写的,一个不小心的内存操作就会让进程崩掉:而且那个年代的操作系统没现在稳定,可能破解技术也不够先进,从电脑城里买来的五六块钱的盗版游戏质量参差不齐.很多游戏跑着跑着就闪退,有的甚至连打都打不开,让人甚为恼火.如今源代码在手,并且我也是程序员了,可以对闪退的原因一探究竟,再也不用

[Jmeter]jemeter启动报错,返回错误码 5,处理方法

今天在使用jmeter的时候,启动GUI,发现bat文件执行有告警,告警内容如下: java.util.prefs.WindowsPreferences <init>WARNING: Could not open/create prefs root node Software\JavaSoft\Prefs at root 0x80000002. Windows RegCreateKeyEx(...) returned error code 5. 报错原因: jmeter需要写注册表 解决办法:

C++异常 返回错误码

一种比异常终止更灵活的方法是,使用函数的返回值来指出问题.例如,ostream类的get(void)成员ASCII码,但到达文件尾时,将返回特殊值EOF.对hmean()来说,这种方法不管用.任何树脂都是有效的返回值,因此不存在可用于指出问题的特殊值.在这种情况下,可使用指针参数或引用参数来将值返回给调用能够程序,并使用函数的返回值来指出成功还是失败.istream族重载>>运算符使用了这种技术的变体.通过告知调用程序是成功了还是失败了,使得程序可以采取异常终止程序之外的其他措施.下面的程序是

一次MySQL(INNODB存储引擎) 死锁捉虫记

前言 任何系统不管在什么阶段都需要关注生产环境错误日志,最近几个月内,发现偶尔会出现数据库死锁情况.以前碰到的数据库类错误大部分是SQL语法造成的错误,来到新东家之后才第一次碰到死锁情况,以前是搞游戏开发,现在是搞电商类开发,可能是不同的项目不同的业务的原因吧,查阅了各种资料后发现,是我想错了:(.一般业务瓶颈在数据库层,对于数据库层的问题需要重点关注,以为死锁这种情况是很严重的问题,这个要分情况,偶尔死锁对业务不会有太大的影响,我又想错了:(. 虫子发现  第一次发现死锁很惊讶,这个是什么鬼?