0

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

现在,是否有一个 hack,所以我可以将这个应用程序作为一个独立的应用程序运行,而不必运行所有代码并找到导致它的错误?

提前致谢。

4

7 回答 7

6

简而言之,没有。

你必须找到这个错误,如果它在 VS 中工作,那么我会冒险猜测这是一个时间问题,可能你正在覆盖共享线程数据,这不太可能(尽管仍然可以看到)在里面VS 因为它在调试环境中运行,这会减慢它的速度。

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

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

于 2009-06-22T00:06:13.950 回答
1

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

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

于 2009-06-22T00:16:24.787 回答
1

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

于 2009-06-22T00:06:16.257 回答
0

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

http://blogs.msdn.com/saraford/archive/2008/08/21/did-you-know-you-can-debug-an-executable-that-isn-ta-part-of-a-visual- studio-project-without-using-tools-attach-to-process-296.aspx

于 2009-09-28T20:50:59.640 回答
0

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

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

于 2009-06-22T00:28:54.310 回答
0

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

于 2009-06-22T00:31:39.623 回答
0

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

于 2009-06-22T08:00:42.780 回答