2009-06-22 137 views
0

我试图为我编写的C++应用程序生成发布版本。当您在VS2008中运行应用程序时,应用程序运行正常(调试&版本);但是当您运行可执行文件时,几乎每次都会崩溃。Visual Studio发布版本

现在,是否存在黑客行为,因此我可以将此应用程序作为独立应用程序运行,而无需运行所有代码并查找导致它的错误?

在此先感谢。

回答

6

总之,没有。

你将不得不发现错误,如果它在VS内工作,那么我会冒险猜测它是一个计时问题,可能你正在覆盖共享线程数据,这是不太可能的(尽管仍然可能看到)内部VS作为其在一个调试环境中运行,它减慢了一点。

如果你想找到你的bug的帮助,然后告诉我们更多。否则,使用调试符号(pdbs)构建您的发行版,将DrWatson安装为系统调试器并单独运行。当它崩溃时,DrWatson将创建一个小型转储文件,将其加载到WinDbg(我的最爱)中,并且您将能够确切地看到错误的位置(它甚至会告诉您转储包含异常并默认显示它。您需要在WinDbg中将您的源代码路径和路径添加到您的符号中才能正确执行此操作)。

然后,您还将知道如何在应用程序在现场运行时诊断崩溃。

+0

我们跑在调试模式下的旧的C++应用程序在我们的客户站点超过6年之前,我们终于找到了错误。单个字节在缓冲区溢出,在调试模式下,由于某种原因它从来没有出现问题。 – 2010-09-09 02:51:22

+0

原因是调试模式用4个字节的“保护页”填充所有内存分配,因此可以很容易地找到缓冲区溢出。 http://stackoverflow.com/questions/127386/in-visual-studio-c-what-are-the-memory-allocation-representations – gbjbaanb 2010-09-09 11:36:36

1

您是否正在加载外部资源?如果您在C++程序中检查您的相对路径是否正确。

+0

相对路径是正确的。 – Charles 2009-06-22 00:25:10

1

一种可能性是您的程序使用未初始化的堆数据。从调试器启动程序启用NT调试堆,这会导致堆分配器使用填充模式填充新的内存块,并启用一些堆检查。从调试器外部启动相同的程序会禁用NT调试堆,但如果程序与C运行时的调试版链接,则CRT调试堆仍将被启用。

一个不太可能的可能性是您的程序要求SeDebugPrivilege设置在其流程标记中。调试器在其进程标记中启用此特权,这具有副作用,即从调试器启动的所有程序都会继承此特权。如果您的程序尝试使用OpenProcess()/ReadProcessMemory()/WriteProcessMemory()并且不能正确处理错误,则可以想象它可能会崩溃。

0

有几种可能性。除了已经提到的内容之外,从Visual Studio运行应用程序将在与Visual Studio实例相同的安全上下文中执行。因此,例如,如果您正在使用Vista,那么如果您尝试访问受保护的文件或注册表,您可能会遇到未处理的安全侵害。

如果您构建一个调试版本并单独运行,该怎么办?它会崩溃吗?如果是这样,通常可以从那里闯入调试器并获得调用堆栈以查看故障是什么。

+0

调试版运行良好 – Charles 2009-06-22 00:30:41

0

从您提供的详细信息中,听起来像是可能存在图书馆问题。你在同一台计算机上运行程序吗?如果没有,那么你也必须为你的应用程序部署适当的库。如果您在开发环境之外的同一台计算机上运行,​​请确保您的应用程序可以看到相应的库。

相关问题