通常我们想获得系统的一些路径时,都会使用一些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都通都是很隐蔽,而且关联面都比较广。可能不仅仅是自己的代码有问题,还有可能跟运行的环境的上下文有关联。此时就需要从更大的视角去分析问题,而不是把问题只局限在它所发生的上下文。同时了解其他同事的动向,和他们沟通也对问题的解决起到一定作用。

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

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

    一个朋友QQ群里说网站启动后会cpu很高,想要帮忙看一下dump. 1.打开windbg加载dump文件后第一个命令lmf,这个命令显示加载的dll以及路径,这样子可以找个dll来帮忙加载sos,(额 ...

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

    ErrorCode.java 简单测试代码,具体应用思路:手动抛出异常信息,在事务中根据错误码来回滚事务的思路. public enum ErrorCode { //系统级 SUCCESS(" ...

  3. libcurl 调用curl_easy_getinfo( ) 返回错误码对照

    //执行设置好的操作 res = curl_easy_perform(easy_handle); //获取HTTP错误码 ; curl_easy_getinfo(easy_handle, CURLIN ...

  4. Spring Boot 如何自定义返回错误码错误信息

    说明 在实际的开发过程中,很多时候要定义符合自己业务的错误码和错误信息,而不是统一的而不是统一的下面这种格式返回到调用端 INTERNAL_SERVER_ERROR(500, "Intern ...

  5. 如何解决加载动态链接库DLL失败,返回0,GetLastError返回错误码126

    通常情况下使用LoadLibrary加载DLL都可以成功,但是当被加载的DLL内部依赖其他DLL无法被找到时,该函数会返回126(ERROR_MOD_NOT_FOUND)错误. 解决办法有2种: 1) ...

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

    今天在使用jmeter的时候,启动GUI,发现bat文件执行有告警,告警内容如下: java.util.prefs.WindowsPreferences <init>WARNING: Co ...

  7. PHP(SentCMS)网站 “新手”捉虫记

    我拖着疲惫的身躯,努力打开眼皮在写...... 昨晚弄到12点,我感觉应该弄好了. 故事开头是这样的:我呢朋友有个网站需要开发,我当时没时间就包给外面的公司了,由于外面公司维护费用比较贵. 那么网站维 ...

  8. flask请求钩子、HTTP响应、响应报文、重定向、手动返回错误码、修改MIME类型、jsonify()方法

    请求钩子: 当我们需要对请求进行预处理和后处理时,就可以用Flask提供的回调函数(钩子),他们可用来注册在请求处理的不同阶段执行的处理函数.这些请求钩子使用装饰器实现,通过程序实例app调用,以 b ...

  9. C++异常 返回错误码

    一种比异常终止更灵活的方法是,使用函数的返回值来指出问题.例如,ostream类的get(void)成员ASCII码,但到达文件尾时,将返回特殊值EOF.对hmean()来说,这种方法不管用.任何树脂 ...

随机推荐

  1. asp:第三平台登陆

    第三平台登陆接口申请网址: http://open.51094.com/ 文档: 第三方合作登录平台使用说明 为方便更多的开发朋友,本人特将当前市面上所有支持第三方联合登录的接口集为一体,以前需要多次 ...

  2. Dorado浏览器调试

    通常在项目中我们对js脚本进行调试有以下2种方式: alert调试法 首先是最原始也是最简单的使用alert,在页面中需要输出需要的变量的地方加上alert函数,将变量弹出显示:alert方式虽然简单 ...

  3. CentOS7 firewall的使用

    # 查看区域 firewall-cmd --get-zones # 查看默认区域 firewall-cmd --get-default-zone # 给区域添加永久性服务 firewall-cmd - ...

  4. mysql alter的常用用法

    增加字段,并加注释: ALTER TABLE table_name ADD field_name field_type [not null|null|default value][comment '注 ...

  5. 把DataSet转换成JSON

    /// <summary> /// dataTable转换成Json格式 /// </summary> /// <param name="dt"> ...

  6. opcache运行时配置参数详解

    PHP的opcode缓存又出 了新成员(说新不新,也有一段日子了),那就是opcache.新浪微博等都在使用,惠新宸老师强力推荐.本人最近根据官网地址 (http://www.php.net/manu ...

  7. Linux下GPIO驱动(五) ----misc_register();

    // struct miscdevice { int minor; const char *name; const struct file_operations *fops; struct list_ ...

  8. 用PLSQL Developer粘贴数据的时候报oracle variant conversion error for variable v0

    参考文章:http://bugcool.blog.51cto.com/2080571/664434 两个数据库表对着copy粘贴的时候,报这个错.只是我这边不是顺序不对,不知道为什么其中的一行换行了. ...

  9. jQuery编写插件--封装全局函数的插件(一些常用的js验证表达式)

    上一篇写到了jQuery插件的3种类型,介绍了第一种类型的写法--封装jQuery对象的方法插件.这一篇要介绍第二种插件类型:封装全局函数的插件:这类插件就是在jQuery命名空间内部添加函数:这类插 ...

  10. 【BZOJ】1925: [Sdoi2010]地精部落 DP+滚动数组

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1925 题意:输入一个数N(1 <= N <= 4200),问将这些数排列成折线 ...