2

我有一个工作区,用于在循环中运行 H.263 视频编码器 31 次,即 main 执行 31 次以生成 31 个不同的编码比特流。此 MS Visual Studio 2005 工作区包含所有 C 源文件。当我为工作区创建“调试”配置并构建和执行它时,它运行良好,即它按预期生成所有 31 个输出文件。但是当我将工作区的配置设置为“RELEASE”mdoe 并重复该过程时,编码器在某些测试用例运行时崩溃。

现在要调试,验证如下:

  1. 分析代码以查看在每次运行编码器时是否遗漏了任何变量初始化
  2. 检查了两种模式(调试和发布)中的各种工作区(解决方案)选项。

有一些明显的差异,但我在两种模式下都明确地将优化相关选项设为相同。

但仍然无法确定问题并找到解决方法。任何指针?

-阿吉特。

4

8 回答 8

2

如果不仔细检查代码,很难说可能是什么问题。然而...

调试版本和发布版本之间的区别之一是函数调用堆栈框架的设置方式。您可以做某些类型的坏事(例如调用具有错误数量的参数的函数),它们在调试版本中不是致命的,但在发布版本中会严重崩溃。也许您可以尝试将发布版本中的堆栈框架相关选项(我忘记它们的名称,抱歉)更改为与调试版本相同,看看是否有帮助。

另一件事可能是启用所有可能的警告,并修复它们。

于 2008-08-12T08:51:01.053 回答
1

可能是两个线程的并发问题。DEBUG 配置会减慢执行速度,因此不会出现问题。但是,只是猜测。

于 2008-08-12T08:51:20.990 回答
1

有趣的问题.. 你确定你没有潜伏的条件编译代码不是在发布模式下编译的吗?IE:

#if (DEBUG)
// Debug Code here
#else
// Release Code here
#endif

这是我唯一能真正想到的事情。。我自己从来没有经历过这样的事情。。

于 2008-08-12T08:51:52.627 回答
1

您可以将调试符号添加到发布版本并在调试器中运行它以查看崩溃的位置和原因吗?

于 2008-08-12T10:12:57.737 回答
1

是的,那些混蛋崩溃是最难修复的。幸运的是,在您求助于手动查看代码并希望找到针头之前,您可以执行一些步骤来为您提供线索。

什么时候崩溃?每次考试?在特定的测试中?该测试有什么其他人没有的?

有什么错误?如果是访问冲突,是否有模式发生在哪里?如果地址较低,则可能意味着某处存在未初始化的指针。

程序是否因调试配置而崩溃但未连接调试器?如果是这样,这很可能是 John Smithers 指出的线程同步问题。

您是否尝试过通过 Purify 等分析器运行代码?它很慢,但通常值得等待。

无论如何都要尝试调试发布配置。它只会转储程序集,但它仍然可以指示发生的情况,例如代码指针在垃圾中间跳转或在外部库中遇到断点。

Are you on an Intel architecture? If not, watch for memory alignement errors, they hard crash without warning on some architectures and those codec algorithm tend to create those situations a lot since they are overly optimized.

于 2008-08-12T13:03:36.223 回答
0

你确定没有预编译指令,比如说,在发布模式下忽略一些非常重要的代码,但在调试中允许它们?

此外,您是否实施了任何可能指出引发错误的精确程序集的日志记录?

于 2008-08-12T08:48:45.380 回答
0

我会更详细地查看崩溃 - 如果它在测试用例中崩溃,那么听起来很容易重现,这通常是最大的挑战。

于 2008-08-12T10:04:14.590 回答
0

另一件需要考虑的事情:在调试模式下,变量初始化为 0xCCCCCCCC 而不是零。这可能会产生一些令人讨厌的副作用。

于 2008-08-12T10:48:18.663 回答