我处理目前一个非常奇特的问题:我有一个应用程序,在调试-Buildmode充分的工作,无论是我从MSVC环境中运行或启动生成的可执行自己。如果我在Release-Buildmode中构建这个应用程序,当我从MSVC环境运行它时它已经完全工作,但是当我自己启动它时会显示意外的行为。差异和发布环境
调试和发布模式之间的区别可能是此行为的原因,以及为什么只有在手动启动可执行文件时才会出现这些问题?
很难给代码,因为这是一个相当大的项目,我绝对没有什么线索,可能会造成问题。该程序流程基本上是:从文件
- 读取设置(不是问题,双重检查读取值,并使用ini-和libconfig ++ - 库可以肯定的)
- 分配值,以单独的类(双重检查传递的值)
- 其中一个类启动一个线程(
boost::thread
),并触发某些事件的回调函数(如果是手动执行的发布版本这些不触发)
的东西,我能想象的威力造成问题,但我不知道的:
- 由于各个班级由不同的人写的,还有的
std::string
和std::wstring
用法不一致。我使用std::wstring(s.begin(), s.end())
从一个转换到另一个,反之亦然。
这可能是我的问题的原因,如果是的话,我该如何解决这个问题?我非常感谢这方面的帮助。提前致谢。
更新:
- 程序不崩溃和变量似乎并没有当我使用臭名昭著的打印调试方法(因为在调试器中一切顺利罚款)有不同的值
- 我已阅读,未初始化变量可能会造成这个问题,并通过triplechecked我使用的每个变量,每个变量正确初始化
- 在单元测试中,我使用的作品如预期(虽然我不知道我得到了每个模块因为我有,每次都有正确的边界案例e不是自己写的所有模块)。
更新2:
- 同时禁用一步优化步骤和使释放buildmode接近调试buildmode我能够缩小问题下:**在代码生成选项卡,我的程序与
Multithreaded-Debug-DLL
,而不是Multithreaded-DLL
,无论优化设置。
这似乎是一个很好的成就,但我缺乏对这个问题的理解。
究竟是什么问题?程序崩溃了吗?你有没有尝试找到触发这些事件的代码?你是否修复了完全字符串不一致? – 2012-02-23 11:28:49
通常这是一个未经初始化的变量,取决于程序的启动方式,它会得到不同的随机值。 – 2012-02-23 11:29:16
@Bojan Komazec你是什么意思与“固定完全字符串不一致”?如上所述,我必须将std :: string转换为std :: wstring几次。 – nijansen 2012-02-23 11:57:28