2012-02-23 69 views
0

我处理目前一个非常奇特的问题:我有一个应用程序,在调试-Buildmode充分的工作,无论是我从MSVC环境中运行或启动生成的可执行自己。如果我在Release-Buildmode中构建这个应用程序,当我从MSVC环境运行它时它已经完全工作,但是当我自己启动它时会显示意外的行为。差异和发布环境

调试和发布模式之间的区别可能是此行为的原因,以及为什么只有在手动启动可执行文件时才会出现这些问题?

很难给代码,因为这是一个相当大的项目,我绝对没有什么线索,可能会造成问题。该程序流程基本上是:从文件

  • 读取设置(不是问题,双重检查读取值,并使用ini-和libconfig ++ - 库可以肯定的)
  • 分配值,以单独的类(双重检查传递的值)
  • 其中一个类启动一个线程(boost::thread),并触发某些事件的回调函数(如果是手动执行的发布版本这些不触发)

的东西,我能想象的威力造成问题,但我不知道的:

  • 由于各个班级由不同的人写的,还有的std::stringstd::wstring用法不一致。我使用std::wstring(s.begin(), s.end())从一个转换到另一个,反之亦然。

这可能是我的问题的原因,如果是的话,我该如何解决这个问题?我非常感谢这方面的帮助。提前致谢。

更新:

  • 程序不崩溃和变量似乎并没有当我使用臭名昭著的打印调试方法(因为在调试器中一切顺利罚款)有不同的值
  • 我已阅读,未初始化变量可能会造成这个问题,并通过triplechecked我使用的每个变量,每个变量正确初始化
  • 在单元测试中,我使用的作品如预期(虽然我不知道我得到了每个模块因为我有,每次都有正确的边界案例e不是自己写的所有模块)。

更新2:

  • 同时禁用一步优化步骤和使释放buildmode接近调试buildmode我能够缩小问题下:**在代码生成选项卡,我的程序与Multithreaded-Debug-DLL,而不是Multithreaded-DLL,无论优化设置。

这似乎是一个很好的成就,但我缺乏对这个问题的理解。

+0

究竟是什么问题?程序崩溃了吗?你有没有尝试找到触发这些事件的代码?你是否修复了完全字符串不一致? – 2012-02-23 11:28:49

+0

通常这是一个未经初始化的变量,取决于程序的启动方式,它会得到不同的随机值。 – 2012-02-23 11:29:16

+0

@Bojan Komazec你是什么意思与“固定完全字符串不一致”?如上所述,我必须将std :: string转换为std :: wstring几次。 – nijansen 2012-02-23 11:57:28

回答

1

添加日志记录或消除一些代码块。这应该允许找到问题出现的地方。对于差异看这里:

What is the difference between Debug and Release in Visual Studio?

+0

我已经实现了日志记录功能,但不幸的是我无法确定问题出在哪里。我会尽量去除目前所推荐的所有内容。 查看调试/版本差异时,我想知道为什么只有在手动执行应用程序(不在MSVC调试器中)时出现此问题。这可能是由优化引起的吗? – nijansen 2012-02-23 11:53:36

+0

不知道问题的原因是什么,使用日志记录时使用二进制搜索规则:在代码中间的某处添加日志记录,并检查它是否显示,如果是,则在前半部分中间添加日志记录等等。您也可以尝试向您添加调试信息发布项目并从调试器启动它,同时禁用优化。 – marcinj 2012-02-23 12:02:52

1

调试不使用的优化也有在这就是为什么exe文件大小是不同的释放模式的优化。即使使用相同的代码,使用的库也不同。您可以通过关闭优化选项来释放调试版本。