【问题标题】:Compiled application executable crashes unless renamed. Why?除非重命名,否则编译的应用程序可执行文件会崩溃。为什么?
【发布时间】:2014-08-22 11:03:30
【问题描述】:

我在将模拟应用程序部署到另一台计算机时遇到了一些问题。直到几周前,只需将可执行文件和所需的 DLL 检出到目标机器上,它都可以正常工作。但是,由于最近我无法在目标机器上启动应用程序,而不会收到一条 Windows (7) 消息,指出应用程序无法正常工作并需要关闭。但是,如果我将应用程序重命名为任何其他名称,它可以正常工作。重命名后,它不会重新启动。顺便说一句,原来的名称“simspray.exe”似乎是问题所在。

有人知道问题出在哪里吗? (尽管有重命名解决方法,但我真的很好奇)

应用使用了一些libs,主要是qt 4.8.3、qwt、nvToolsExtension (nvidia)、glew。

我们已经尝试了以下方法: - 使用全新安装的 Win7 电脑 -depends 显示没有丢失的依赖项 - 没有运行防病毒程序,禁用 Windows Defender 和防火墙,没有其他第三方安全工具 - 除非在项目设置中重命名输出 exe 名称,否则应用程序也不会从 Visual Studio 中启动

感谢您的帮助。

【问题讨论】:

  • 这可能与此处提到的问题相似吗? stackoverflow.com/questions/22103044/…
  • 我建议查看事件日志(控制面板 + 管理工具 + 事件)以获取一些信息并将其发布在此处。我不知道任何可能导致失败的同名 Windows 进程
  • 感谢您的想法。 Mathiasdm:这似乎不适用,解决方案中提到的注册表项对于我的应用程序不存在。 @Slartibartfast:Eventviewer 显示访问冲突 (0xc0000005)。但是,要么调试堆栈跟踪出现乱码,要么在到达 main 之前崩溃。

标签: c++ windows visual-studio-2008 executable


【解决方案1】:
  1. 如果您在全新安装上尝试过,那么它与平台或环境没有任何关系,它必须是源代码或构建过程中的某些东西。
  2. 如果它直到几周前都正常工作,那么它一定是最近几周引入的错误。您能检查一下您的源代码控制系统,了解当时所做的更改吗?
  3. 尝试改变您重命名的文件名 - 更长或更短的文件名会产生不同的结果吗?

尝试以愚蠢的方式搜索使用可执行文件名称的代码,如下所示:

char buffer[sizeof(argv[0])+1];
strcpy(buffer, argv[0]);

或者这个:

int len = strlen("simspray.exe");
char *buffer = malloc(len);
strcpy(buffer, GetCommandLine());

我知道一些人为的例子,但是如果你将文件重命名为正确的长度,这两个都会缓冲区溢出,但它们会神奇地起作用。

【讨论】:

  • 我现在进行了深入的搜索,但是,除了将 argv 传递给在 main 中创建的 QCoreApplication 之外,它没有被使用。我还搜索了任何 argv、arguments() 或 getApplicationName()(来自 QCoreApplication)——什么都没有。字符串“simspray.exe”被使用了 200 多次,但仅用于将其传递给日志文件或设置窗口标题。我还注意到,在崩溃之前调试没有到达 main 的第一行并显示堆栈跟踪深入到随机数库中我前段时间在未使用过的自动取款机中使用过。此外,任何库都不应该有硬编码的“simspray.exe”字符串......?!
  • 与 .exe 一起部署了哪些其他文件?其中一个是否会导致命名冲突并首先被“执行”?
  • 我不确定你的意思。有几个 dll 和数据文件,但是如果我双击 exe 文件,如何根据 exe 的名称“首先”执行任何不同的操作?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多