通常我们想获得系统的一些路径时,都会使用一些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. 微软阵营企稳的利好消息:.NET开源、Visual Studio免费

    今天各个IT社区,头版头条说的是微软.NET开源了.宇宙中最好的IED–Visual Studio Community 2013将免费提供给用户的消息. <宇宙中最强大的开发环境免费了!> ...

  2. (转)unity开发相关环境(vs、MonoDevelop)windows平台编码问题

    转自: http://www.cnblogs.com/sevenyuan/archive/2012/12/06/2805114.html 1.unity会爆出错误: There are inconsi ...

  3. 客户调用COM流程

    参考:COM技术内幕 DllGetClassObjecthttps://msdn.microsoft.com/en-us/library/windows/desktop/ms680760.aspx   ...

  4. How to hide an entry in the Add/Remove Programs applet?

    Original link: http://www.winhelponline.com/articles/15/1/How-to-hide-an-entry-in-the-AddRemove-Prog ...

  5. a标签根据js返回值判断页面是否跳转

    a标签再跳转之前先判断是否符合条件,符合可以跳转,不符合不可以跳转. 自己遇到的问题是:在js方法中根据条件就return结果,但是不行. 原因是:在js方法中return后不会结束整个js方法(ac ...

  6. IOPS和Throughput

    IOPS和Throughput吞吐量两个参数是衡量存储性能的主要指标.IOPS表示存储每秒传输IO的数量,Throughput吞吐量则表示每秒数据的传输总量.两者在不同的情况下都能表示存储的性能状况, ...

  7. free -m

    free -m total used free shared buffers cached Mem: 7760 1572   6187          0              9       ...

  8. object-fit: 炒鸡方便的图片居中方法

    今天在项目中遇到图片居中的问题,嗯,之前也有写过解决这个问题的文章,有n种方法.不过今天要说一个新的方案:object-fit ,嗯,这个才是真的方便的方案啊. 先看预览: object-fit 只能 ...

  9. mysql触发器的例子--插入前更新数据

    本文介绍下,一个mysql触发器的例子,在数据插入前更新相关内容,有需要的朋友参考下. mysql触发器的例子,如下: view source print? 001 mysql> CREATE  ...

  10. 微调Win8.1这台电脑

    从前有个笑话:一位朋友在办公室受到领导教育:“我说小王同志啊,虽然这电脑是你打了报告组织上买给你用的,可是你也不好这么狂妄嘛...”可怜的他只好把图标的名字改为“大家的电脑”. 想必大家已经知道这个笑 ...