我正在尝试为我编写的 C++ 应用程序生成发布版本。当您从 VS2008 中运行该应用程序时,该应用程序运行良好(调试和发布);但是当您运行可执行文件时,它几乎每次都会崩溃。

现在,是否有一种破解方法可以使我可以将此应用程序作为独立应用程序运行,而不必运行所有代码并找到导致它的错误?

提前致谢。

有帮助吗?

解决方案

简而言之,没有。

你必须找到这个bug,如果它在VS中工作,那么我会猜测这是一个时间问题,可能你要覆盖共享的线程数据,这样的可能性会降低(尽管仍然可能在VS内部,因为它在一个调试环境中运行,这会使它慢一点。

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

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

其他提示

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

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

您的程序需要 SeDebugPrivilege 将在其进程令牌中设置。调试器在其进程令牌中启用此权限,其副作用是从调试器启动的所有程序都继承此权限。如果你的程序试图使用 OpenProcess() / ReadProcessMemory() / WriteProcessMemory()并且没有正确处理错误,那么可以想象它可能会崩溃。

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

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

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

我发现在发布版本中调试的最佳方法是在发生崩溃时创建崩溃转储,然后转储允许我在我的开发计算机上加载调试符号并找出最新情况。更多信息: http://www.debuginfo.com/articles/effminidumps.html

你也可以去file =>在Visual Studio中打开并打开.exe,因此您不会在调试器本身下启动它。不确定它是否会有所帮助。

http://blogs.msdn.com/saraford/archive/2008 / 08/21 /做,你知道是友可以调试的可执行 - 即-ISN-TA-部分的-A-视觉工作室项目不-使用的工具 - 附加到进程-296.aspx

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top