可执行文件突然停止工作:无声退出,没有错误,没有任何错误

时间:2015-05-22 21:49:37

标签: c++ qt visual-studio-2012 executable exit

我面临一个相当特殊的问题:我有一个Qt C ++应用程序,以前工作正常。现在,突然间我再也无法启动了。没有错误,没有任何错误。

更多信息:

  • 使用Visual Studio 2012在调试模式下启动应用程序时的最后一行输出:
  

该程序' [4456] App.exe'退出时使用代码-1(0xffffffff)。

  • 从不调用实际应用程序代码(= main()中的第一行)或至少没有触发断点,因此无法进行调试。
  • 几秒钟的可执行进程出现在进程列表中,然后再次消失。
  • 使用最新的Windows更新赢得7 x64。
  • 问题同时出现在两台不同的机器上。
  • 应用程序最初是使用Qt 5.2.1构建的。今天我测试明智切换到Qt 5.4.1。但正如预期的那样没有变化。
  • 未对源代码进行任何更改。该问题也适用于应用程序的现有版本。
  • 从我的角度来看,运行DependencyWalker并没有引起任何兴趣。

我没有想法。关于尝试或看什么的任何指示?一个可执行文件如何突然停止工作而没有错误?

2 个答案:

答案 0 :(得分:1)

我最终找到了这种行为的原因......有点儿。编码(例如我的单身人士)从来都不是问题(正如我预期的那样,因为代码总是有效)。相反,外部库(SAP RFC SDK)引起了麻烦。

此库依赖于ICU Unicode库以及明显特定的版本。由于我不知道这个事实,我只有我目前在我的应用程序目录中使用的Qt版本所需的ICU库。到目前为止,必须从标准的Windows路径加载SAP RFC SDK的ICU库。

最后,一些软件更改(Windows更新,手动应用程序卸载等)必须删除那些导致描述静默失败的库。只需将所需的ICU库版本DLL复制到我的应用程序文件夹中,就可以解决问题。

我唯一不确定的是,当通过DependencyWalker跟踪加载的DLL时,这是不可见的。

答案 1 :(得分:0)

  

永远不会调用实际应用程序代码(= main()中的第一行)。因此无法进行调试。

您可能有一些静态存储初始化失败,这是在调用main()之前应用的。

您是否在代码中使用任何相互依赖的单身人士?如果是这样,请将它们合并为单个单例(请记住,不应超过一个单例)。

另请注意,对于这种情况,调试仍然可能很好,陷阱是, - 对于我的答案中描述的情况 - ,main()的主体的第一行被设置为第一个中断当您在调试器中启动程序时,默认为point 没有什么阻碍你设置断点,在实际开始代码达到main()之前就会遇到断点。

至于您对评论的澄清:

  

“我确实使用一些单身人士......”

如上所述,如果您确定需要使用单身人士,请使用单人

否则你最终可能会遇到未定义的静态存储初始化顺序。

无论如何,如果静态存储数据相互依赖,在整个代码中为它提供单一访问点,那么这并不重要,以避免因与各种各样的重度耦合而混淆它实例

与单个实例耦合,可以更容易地重构代码以使用接口,如果事实证明 singleton 不是一个。