捉虫记: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都通都是很隐蔽,而且关联面都比较广。可能不仅仅是自己的代码有问题,还有可能跟运行的环境的上下文有关联。此时就需要从更大的视角去分析问题,而不是把问题只局限在它所发生的上下文。同时了解其他同事的动向,和他们沟通也对问题的解决起到一定作用。
捉虫记:SHGetSpecialFolderPath返回错误码为2的更多相关文章
- 捉虫记(四)线程安全导致的HighCpu
一个朋友QQ群里说网站启动后会cpu很高,想要帮忙看一下dump. 1.打开windbg加载dump文件后第一个命令lmf,这个命令显示加载的dll以及路径,这样子可以找个dll来帮忙加载sos,(额 ...
- ErrorCode枚举类型返回错误码信息测试,手动抛出异常信息,在事务中根据错误码来回滚事务的思路。
ErrorCode.java 简单测试代码,具体应用思路:手动抛出异常信息,在事务中根据错误码来回滚事务的思路. public enum ErrorCode { //系统级 SUCCESS(" ...
- libcurl 调用curl_easy_getinfo( ) 返回错误码对照
//执行设置好的操作 res = curl_easy_perform(easy_handle); //获取HTTP错误码 ; curl_easy_getinfo(easy_handle, CURLIN ...
- Spring Boot 如何自定义返回错误码错误信息
说明 在实际的开发过程中,很多时候要定义符合自己业务的错误码和错误信息,而不是统一的而不是统一的下面这种格式返回到调用端 INTERNAL_SERVER_ERROR(500, "Intern ...
- 如何解决加载动态链接库DLL失败,返回0,GetLastError返回错误码126
通常情况下使用LoadLibrary加载DLL都可以成功,但是当被加载的DLL内部依赖其他DLL无法被找到时,该函数会返回126(ERROR_MOD_NOT_FOUND)错误. 解决办法有2种: 1) ...
- [Jmeter]jemeter启动报错,返回错误码 5,处理方法
今天在使用jmeter的时候,启动GUI,发现bat文件执行有告警,告警内容如下: java.util.prefs.WindowsPreferences <init>WARNING: Co ...
- PHP(SentCMS)网站 “新手”捉虫记
我拖着疲惫的身躯,努力打开眼皮在写...... 昨晚弄到12点,我感觉应该弄好了. 故事开头是这样的:我呢朋友有个网站需要开发,我当时没时间就包给外面的公司了,由于外面公司维护费用比较贵. 那么网站维 ...
- flask请求钩子、HTTP响应、响应报文、重定向、手动返回错误码、修改MIME类型、jsonify()方法
请求钩子: 当我们需要对请求进行预处理和后处理时,就可以用Flask提供的回调函数(钩子),他们可用来注册在请求处理的不同阶段执行的处理函数.这些请求钩子使用装饰器实现,通过程序实例app调用,以 b ...
- C++异常 返回错误码
一种比异常终止更灵活的方法是,使用函数的返回值来指出问题.例如,ostream类的get(void)成员ASCII码,但到达文件尾时,将返回特殊值EOF.对hmean()来说,这种方法不管用.任何树脂 ...
随机推荐
- linux安装缺失服务
sudo apt-get install ssh Reading package lists... Done Building dependency tree... Done Package ssh ...
- TCP/IP 学习博客
原作者地址:http://blog.csdn.net/goodboy1881/article/category/204448
- Java编写ArrayBasic制作一个简单的酒店管理系统
听老师讲了一些ArrayBasic的一些知识,让制作一个酒店管理系统,要求:显示酒店所有房间列表,预订房间.... 经过老师的指导写了一个代码,如下: import java.util.Scanner ...
- VS2013开发Windows服务项目
这篇随笔里,我将介绍如何用VS2013开发Windows服务项目,实现的功能是定时发送电子邮件. 开发环境:VS2013,SQL Server2008,采用C#语言开发 步骤一:创建Windows服务 ...
- Core Animation之CABasicAnimation
在iOS中,图形可分为以下几个层次: 越上层,封装程度越高,动画实现越简洁越简单,但是自由度越低:反之亦然.本文着重介绍Core Animation层的基本动画实现方案. 在iOS中,展示动画可以类比 ...
- ASP.NET 5 初识
ASP.NET 5 是一个跨平台的全新框架,不再依赖IIS.下面介绍一下简单的Hello World 例子. 1. 安装kvm 用管理员权限打开cmd .如下图: 执行如下的脚本: @powershe ...
- MySQL5.7 linux二进制安装
200 ? "200px" : this.width)!important;} --> 介绍 MySQL5.7出来也有大半年了,业内也一直在宣传5.7有多么的N,官网的也是宣 ...
- 在ctex环境下利用Metapost作图
使用Metapost作图,是LaTeX的好搭档.下面介绍如何在ctex环境下的使用Metapost作图. 首先新建一个test.mp的Metapost文件. 在文件开始需要声明如下代码: prolog ...
- JQuery(三) Ajax相关
JQuery大大简化了Ajax通用操作,开发者只需要指定请求URL,回调函数即可. 三个主要方法: $().param(obj):将obj参数(对象或数组)转化成查询字符串. {name:" ...
- Centos 6.4 /usr/src/kernels 目录为空解决方法
/usr/src/kernels 目录下是Linux的内核源码,如果其为空,则需要安装安装 kernel-headers 和 kernel-devel包