一个CFile::Remove引起的奇怪问题

今天收到测试的一个反馈,我们的一个程序,在WIN7、WIN8下安装后,运行不起来,在进程列表中可以看到,但就是不出来窗口,同样的程序在XP下正常,在UAC关闭的情况下也正常,在以管理员权限运行时也正常。

现象有点奇怪,但也有一个规律,就是在UAC开启的情况下,如果不是以管理员权限运行,则会出问题,根据程序现象,我从代码上排查,发现就在程序启动的代码部分即“挂起”,这里的现象类似于挂起,因为是程序运行到某一处就不再往下运行了,我们可以确定的是单实例运行互斥的代码没有被执行到。


到这里就好跟了,因为往上走的代码是较少的,接下来通过逐段调试的方式,发现最终问题在于调用了一个MFC的类的静态函数导致:CFile::Remove,发现在调用这个函数的后续代码便没有再执行了。这里已经基本可以确定是由于没有权限删除相关文件导致出现这个问题了。


难道程序真的挂起了,这个函数会阻塞?


接着往下分析,我们通过查看这个函数的源码,具体如下:

void PASCAL CFile::Remove(LPCTSTR lpszFileName)
{
	if (!::DeleteFile((LPTSTR)lpszFileName))
		CFileException::ThrowOsError((LONG)::GetLastError(), lpszFileName);
}

这个函数其实只是调用了DeleteFile,当调用失败时,抛出异常。 问题又来了,如果是有异常,我们的程序应该会有异常抛出来才是啊,因为这部分代码没有在try块中,为什么他就悄无声息的停止运行,但进程又还在呢?

进一步分析发现,我们使用了minidump来进行结构化异常的捕获,以便在程序发布后,能够获取到程序异常的相关信息,找到问题点。

就是因为这个异常捕获,导致了这里CFile::Remove函数抛出来的异常没有在程序中暴露出来,变成了一个隐藏的BUG,导致了这样奇怪的问题现象。


在此记录此问题,以便后续查找,也希望能给有碰到类似问题的朋友提供参考。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值