将可执行文件重命名为game.exe在运行时导致15秒延迟--奇怪的问题

4
这让我对计算机和操作系统的理解产生了不安。我刚刚花了大约一个小时输入不同版本的编译命令到g++中,当我感到沮丧时,我将可执行文件从game.exe更改为gameg.exe,结果问题神奇地消失了。
以下是更多背景信息:最近我注意到,在运行我的Eclipse单元测试构建时,如果我从启用SDL的测试开始,它会打开SDL窗口并在能够启动测试之前冻结约20秒钟。在随后的测试中(其中调用SDL_Quit()并重新初始化SDL作为测试过程的一部分),此延迟不存在。现在我已经确定,只有当可执行文件的名称恰好为"game.exe"时才会发生这种情况!如果我将其重命名为任何其他文件名,则可以快乐地运行测试,像通常一样在一秒内初始化SDL系统。以前我曾认为,可能存在某种错误导致我的Eclipse构建出现这种行为,而在makefile构建中则不存在,但事实证明,如果我取出Eclipse构建并重命名其可执行文件(它所在的项目文件夹称为game,因此为game.exe),则它不会表现出这种行为。
同样,我将我的makefile构建(其文件名为entropy_unittest_disp.exe)重命名为game.exe,然后它就开始这样做了。我将其重命名为game,它也会这样做(当我使用mingw的bash时运行,不带.exe扩展名,资源管理器无法识别它是可执行文件)。但是,如果我将其更改为game.exx,则它会正常工作。
这是什么黑魔法?为什么程序的功能取决于其文件名?我确实查询argv[0],并且实际上我打印它的值到控制台(用于调试目的),但毫不奇怪,它只打印程序及其路径。在我的程序中从未对其执行任何逻辑。
我尝试运行GDB以查找它在哪里冻结,但是一旦我按下Ctrl + C,GDB就会退出。
有人知道可能是什么原因吗?病毒吗?
编辑:我从此网站下载了这个演示:http://www.sdltutorials.com/sdl-opengl-tutorial-basics/ 提取它,将文件重命名为game.exe,是的,同样的事情发生了。这是什么情况?接下来我将尝试运行依赖项检查器,看看是否有什么东西试图钩入它。

你用的是哪个版本的Windows?你尝试过使用Process Monitor来查看是否有什么异常吗?最近的Windows版本(我相信是Vista和7)有时会对具有特殊文件名的可执行文件进行不同的处理,例如安装程序,但据我所知,“game.exe”不是其中之一。 - Adam Rosenfield
我使用的是Windows 7 Ultimate操作系统... 我尝试了Process Monitor,它真的很神奇,能够捕获所有发生的事情。但它每秒钟生成100到1000个事件。我想在尝试解决问题之前,可以尝试杀死尽可能多的后台进程。不过还是谢谢你向我展示这个工具。 - Steven Lu
1
将game.exe添加为包含过滤器,这样您的日志中就不会有背景事件了。(过滤器对话框具有漏斗图标,并且在启动时也会出现) - 0x5f3759df
6个回答

10

假设你有AMD(ATI)或Nvidia图形卡,并且安装了官方驱动程序。

很可能,game.exe是实际游戏的可执行文件名称,而你的驱动程序正在为这个“game”运行特殊优化,或者加载这个游戏的Crossfire或SLI配置文件。快速搜索发现,Resident Evil 4将其可执行文件命名为“game.exe”。

我建议查看以下链接以了解可能发生的情况的更多详细信息:

http://www.kn00tcn.net/site/ati-catalyst-profiles/


1
我认为答案肯定与此有关。进程管理器帮助我获得了一些线索(或者说,大约五千个)。就像其他所有东西一样,有大量的注册表查询,但它似乎进入了一个在C:\ProgramData\NVIDIA\...中创建和读取文件的循环,然后有一长串尝试在与我的游戏可执行文件相同的目录中创建名为ra2.exe的文件。我谷歌了一下,找到了这个:http://forums.nvidia.com/index.php?showtopic=201944 我想他们从来没有解决这个问题。这就是我们所说的软件膨胀,各位。 - Steven Lu
顺便问一下,我很好奇...他们用什么机制来做这种事情?我想,一旦你开始在操作系统中使用驱动程序进行操作,那么你几乎可以做任何事情了,对吧? - Steven Lu

2

不确定如何回复Steven在最佳答案上的评论,但是关于驱动程序配置文件,它只是对.exe文件名进行基本的暴力检查。

有些游戏保证在特定的子文件夹中,因此驱动程序寻找exe所在位置,例如'\ 球队堡垒2 \ hl2.exe'。

但由于大多数游戏允许您选择安装到哪个文件夹,并且很多时候exe就在同一根目录下,驱动程序别无选择,只能盲目地假设gameX.exe将变成gameX。

这样做的一个好处是可以强制执行其他游戏配置文件以进行故障排除或尝试启用CF / SLI缩放。

因此,始终确保您的可执行文件具有原始名称,以知道图形驱动程序不会尝试运行专门针对其他游戏进行的“优化”。


1

这可能是由于您操作系统上运行的反病毒软件引起的吗?某些文件通常用于病毒,“Game.exe”可能是其中之一,因此操作系统/防病毒软件需要额外注意以确保其安全。


1

在没有任何额外软件安装的情况下,在干净的 Windows 环境中进行测试,如果正常工作,则可能您有一些保护软件,如防病毒或沙盒等,如果您有任何此类软件,请将其禁用,然后再次进行测试。


0

检查 Image File Execution Options 注册表项中是否列出了 game.exe:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options。它可用于将特定程序作为应用程序调试器来启动具有特定名称的应用程序。(有关 Image File Execution Options 的更多信息


0

由于应用兼容性 Shimming,EXE 根据其名称的不同会表现出不同的行为。检查已加载的模块列表,看看是否有一堆以“ac”开头的 DLL 加载到您的应用程序中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接