通常我们想获得系统的一些路径时,都会使用一些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. 页面加载后的input change事件 1或2个框 ajax

    数据层没有,js和bll直接链接,数据层用的hqew. js: window.onload = function () { //型号input 改变 事件 $("#typeofproduct ...

  2. Java使用Flying Saucer实现HTML代码生成PDF文档

    1.需要的jar包:org.xhtmlrenderer.flying-saucer-pdf-itext5,Maven依赖如下: <dependency> <groupId>or ...

  3. 再也不要看到Eclipse万恶的arg0,arg1提示

    不知道大家跟我是否一下,遇到arg的提示. @Override public void onDateChanged(DatePicker arg0, int arg1, int arg2, int a ...

  4. [Effective Java读书笔记] 第二章 创建和销毁对象(1~7)

    我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3537576.html,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体验 ...

  5. linux下screen工具的简单使用

    有时候,希望即使退出终端了,下次登录linux的时候,还能回到程序的控制界面,这个时候,screen工具就很有用了例如,写了一个从控制台读取屏幕输入的程序input_test,如果从终端退出了,下次登 ...

  6. JS函数的参数对象arguments在严格模式下的限制

    在JS中,传入的函数的参数个数可以与定义函数的个数不一致,那么对于传入的实参的引用,则是arguments对象.然而改对象在严格模式和非严格模式下是由区分的: 1 在严格模式下arguments作为了 ...

  7. Unity帮助文档打开速度慢解决方法

    使用批量文本替换工具替换掉Unity安装目录中\Editor\Data\Documentation\en\Manual\下的所有文件中的如下两个部分:   1. <script type=&qu ...

  8. 升级iOS10后SearchController焦点无法获取的问题

    原来在没升级之前,是这样获取的,好使 - (void)viewWillAppear:(BOOL)animated{ [super viewWillAppear:animated]; [self.sea ...

  9. React Native在虚拟运行app时,报错RCTRootView not found,怎么解决?

    报错: 解决方案:

  10. IE6下input标签border问题

    IE6下input标签的border的样式border:none;是不起作用的!要设置border:0px;才行!