Debugging 调试发布模式应用程序的最佳方法

Debugging 调试发布模式应用程序的最佳方法,debugging,embedded,Debugging,Embedded,我确信这种情况以前也发生过,有些东西在调试模式下工作,有些东西在发行版中编译,有些东西坏了 这发生在我在嵌入式XP环境中工作时,我发现最好的方法是编写一个日志文件来确定哪里会出错 您在尝试解决恼人的发布模式错误时有哪些经验/发现?如果只是应用程序的一小部分需要调试,那么您可以更改这些源文件,使其只生成而不进行优化。您可能会为所有构建生成调试信息,因此这使应用程序的运行与发行版基本相同,但允许您正确调试感兴趣的部分。使用跟踪语句如何。它们用于释放模式值检查 Trace.WriteLine(myVa

我确信这种情况以前也发生过,有些东西在调试模式下工作,有些东西在发行版中编译,有些东西坏了

这发生在我在嵌入式XP环境中工作时,我发现最好的方法是编写一个日志文件来确定哪里会出错


您在尝试解决恼人的发布模式错误时有哪些经验/发现?

如果只是应用程序的一小部分需要调试,那么您可以更改这些源文件,使其只生成而不进行优化。您可能会为所有构建生成调试信息,因此这使应用程序的运行与发行版基本相同,但允许您正确调试感兴趣的部分。

使用跟踪语句如何。它们用于释放模式值检查

Trace.WriteLine(myVar);

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


我的经验是,一般情况下,这个bug与接近破损区域的代码有关。也就是说,如果您看到函数“LoadConfigInfoFromFile”中出现问题,那么您可能应该首先仔细分析该函数中的问题,而不是“DrawControlsOnScreen”,如果您知道我的意思的话。“远处的诡异动作”类型的bug并不经常出现(尽管当它们出现时,它们往往是一个主要的负担)。

我同意通过调试日志文件来缩小范围


我一直使用“输入FunctionName”和“离开FunctionName”,直到我能够找到它在崩溃之前输入的方法。然后我添加了更多的日志消息重新编译并重新发布。

除了如上所述关闭优化和/或打开发布版本的调试信息外,日志文件将非常有用。好的数据确实会有所帮助。我曾经编写过一个“跟踪”应用程序,如果该应用程序在发布版本启动时运行,它将捕获该应用程序的跟踪日志(否则,如果在调试器下运行,结果将转到调试器的输出窗口)。我能够让最终用户通过电子邮件向我发送日志文件,重现他们看到的bug,这是我至少在一个案例中发现问题的唯一方法。

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

您也可以将调试符号复制到生产环境中,即使它是在relase模式下编译的


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

如果问题在于文件中与同步相关的转储日志可能有问题。
在这种情况下,我通常会使用一些大字符串数组,并在问题重现后将其转储到屏幕/文件中。

这当然取决于您的内存限制,如果平台上的内存有限,有时我只使用少量符号和数字存储在数组中。阅读这样的日志不是一种很大的乐趣,但有时这是唯一的选择。

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

与调试版本相比,发布版本经过了大量优化,因此编译代码的方式会影响其行为。当多线程代码中的崩溃发生在发布版本中而不是调试版本中时,这基本上是正确的。adplus和windbg帮我找到了这件事发生的地方

这里对ADPlus进行了解释: httx://support.microsoft.com/?scid=kb%3Ben-美国%3B286350&x=15&y=12

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

  • 启动您的应用程序

  • 打开cmd和cd到c:\debuggers

  • 像这样启动adplus:

  • “adplus.bat-使_exe.exe崩溃”

  • 再现崩溃

  • 在vs2005或windbg中分析崩溃转储