7

Im sure this has happened to folks before, something works in debug mode, you compile in release, and something breaks.

This happened to me while working on a Embedded XP environment, the best way i found to do it really was to write a log file to determine where it would go wrong.

What are your experiences/ discoveries trying to tackle an annoying Release-mode bug?

4

9 回答 9

3

确保您有良好的调试符号可用(即使使用发布版本,甚至在嵌入式设备上也可以这样做)。您应该能够获得堆栈跟踪,并希望获得一些变量的值。在这一点上,良好的汇编语言知识可能也很有用。

我的经验是,通常该错误与损坏区域附近的代码有关。也就是说,如果您看到函数“LoadConfigInfoFromFile”中出现问题,那么如果您知道我的意思,那么您可能应该从仔细分析问题开始,而不是“DrawControlsOnScreen”。“远处的幽灵行动”类型的错误往往不会经常出现(尽管当它们出现时,它们往往是一个主要的熊)。

于 2008-08-28T21:05:47.047 回答
2

Tracefile 总是一个好主意。当涉及崩溃时,我使用的是 adplus,它是 windows 调试工具的一部分。基本上 adplus 的作用是,它将 windbg 附加到您正在监视的可执行文件中。当应用程序崩溃时,您会获得崩溃转储和日志文件。您可以在首选调试器中加载故障转储并找出导致崩溃的指令。

由于发布版本与调试版本相比进行了高度优化,因此编译代码的方式会影响其行为。当多线程代码中的崩溃发生在发布版本而不是调试版本时,这基本上是正确的。adplus 和 windbg 帮助我找出了发生这种情况的地方。

ADPlus 在这里解释:httx://support.microsoft.com/?scid=kb%3Ben-us%3B286350&x=15&y=12

基本上你要做的是: 1. 下载 WinDbg 并将其安装到 C:\debuggers httx://www.microsoft.com/whdc/devtools/debugging/default.mspx

  1. 启动您的应用程序

  2. 打开一个 cmd 和 cd 到 c:\debuggers

  3. 像这样启动adplus:

“adplus.bat -crash your_exe.exe”

  1. 重现崩溃

  2. 分析 vs2005 或 windbg 中的 crashdump

于 2009-05-26T15:19:59.103 回答
0

If it's only a small portion of the application that needs debugging then you can change those source files only to be built without optimisations. Presumably you generate debug info for all builds, and so this makes the application run mostly as it would in release, but allows you to debug the interesting parts properly.

于 2008-08-28T21:03:30.080 回答
0

How about using Trace statements. They are there for Release mode value checking.

Trace.WriteLine(myVar);
于 2008-08-28T21:03:41.937 回答
0

我同意日志文件调试以缩小范围。

我已经使用“输入函数名称”“离开函数名称”,直到我能找到它在崩溃前输入的方法。然后我添加更多的日志消息重新编译并重新发布。

于 2008-08-28T21:06:29.073 回答
0

除了像pauldoo所说的那样关闭优化和/或打开发布版本的调试信息之外,日志文件将是好的数据真的可以提供帮助。我曾经写过一个“跟踪”应用程序,如果它在发布构建开始时正在运行,它将捕获应用程序的跟踪日志(否则,如果在调试器下运行,结果将进入调试器的输出窗口)。我能够让最终用户通过电子邮件向我发送他们所看到的错误的日志文件,这是我至少在一种情况下发现问题的唯一方法。

于 2008-08-28T21:08:53.453 回答
0

虽然它可能无法在嵌入式环境中使用,但我在调试发布模式 Windows 应用程序时使用WinDbg很幸运。即使应用程序没有使用符号信息编译,您至少可以获得可用的堆栈跟踪和大量其他有用的崩溃信息。

于 2008-08-29T00:17:35.667 回答
0

即使在发布模式下编译,您也可以将调试符号复制到生产环境

是一篇包含更多信息的文章

于 2008-08-29T00:38:22.857 回答
0

如果您的问题是文件中与同步相关的转储日志可能有问题。
在这种情况下,我通常会使用一些大的字符串数组,并在问题重现后将其转储到屏幕/文件中。
这当然取决于您的内存限制,如果平台上的内存有限,有时我只使用几个符号和数字来存储在数组中。阅读这样的日志并不是什么大乐趣,但有时这是唯一的选择。

于 2008-09-16T08:47:42.967 回答