C#/C++;从Windows而不是Visual Studio运行时,应用程序崩溃

C#/C++;从Windows而不是Visual Studio运行时,应用程序崩溃,c#,c++,visual-studio-2010,pinvoke,visual-studio-debugging,C#,C++,Visual Studio 2010,Pinvoke,Visual Studio Debugging,我正在开发一个调用非托管(C++)dll的C应用程序。我发现,当从Windows资源管理器运行时,某个用户操作始终会导致应用程序崩溃。但是,从Visual Studio调试器启动时,不会发生崩溃。因此,我无法在崩溃时进入代码并调试到底发生了什么 当从资源管理器运行而不是从VisualStudio运行时,什么可能导致二进制文件崩溃?请注意,我使用的是发布版本;调试生成既不在Visual Studio中也不在资源管理器中崩溃 (如果它是相关的,我可以说崩溃与操作C++中的一个MALOC分配的数组有关

我正在开发一个调用非托管(C++)dll的C应用程序。我发现,当从Windows资源管理器运行时,某个用户操作始终会导致应用程序崩溃。但是,从Visual Studio调试器启动时,不会发生崩溃。因此,我无法在崩溃时进入代码并调试到底发生了什么

当从资源管理器运行而不是从VisualStudio运行时,什么可能导致二进制文件崩溃?请注意,我使用的是发布版本;调试生成既不在Visual Studio中也不在资源管理器中崩溃

(如果它是相关的,我可以说崩溃与操作C++中的一个MALOC分配的数组有关。我通过仔细地注释代码块、重建、从Windows运行、检查崩溃是否发生来跟踪它。但是,我已经达到了一个点,在没有AB的情况下,它变得非常困难。le以正确断开调试器)


我只是对能够在Visual Studio中重新创建崩溃感兴趣。

当程序在调试中工作,但在发布时崩溃时,问题通常是缓冲区溢出,因此您应该查找类似于不正确的缓冲区长度变量的内容

关于为什么调试时它没有崩溃,这里有一篇关于的小文章。正如您所读到的,当调试器启动程序时,堆可能会有不同的行为。缓冲区溢出经常发生在堆上,您说它可能发生在malloc-ed缓冲区中,这就是原因

现在,要使您的程序在调试时崩溃,唯一的方法可能是在启动后附加。如果在DLL项目中设置断点不起作用,请尝试使用DLL项目启动调试,并将您的可执行文件指定为DLL主机。如果您不能像那样命中断点,那么您可以始终在汇编代码中设置断点,这应该一直有效,但并不实际

请注意,即使在附加时也可能发生差异,调试器始终会略微更改目标行为。尽管只有未定义的行为应该更改


Edit:我错过了,但文章说可以通过设置环境变量
\u NO\u debug\u heap=1来禁用调试堆。这可能是调试问题的最简单解决方案(如果可行的话)

显示你的代码,也许是截图,为什么你在C++中使用<代码> MalCal?记住它只分配内存,它不调用对象的构造函数。你可以更改为<代码>新< /Cord>,并编写一些断言来测试你的不变量。你的应用程序是多线程的吗?如果是这样,从调试到发布可以切换到S。有时会显示竞争条件。或者,尝试编写C++代码的C++等价版本,看看代码中的OP部分是否有问题。@戴维:这里是崩溃的原因:DLL代码来自地震UNIX(),我(部分)移植到Windows以便在我的项目中使用。显示代码并不容易,因为原始代码是一个大杂烩(即,对“malloc”的实际调用埋藏在许多函数的深处,与使用它的位置不同,等等)。我更感兴趣的是让它在Visual Studio中崩溃,以便自己调试崩溃,而不是帮助找出崩溃。在进程启动后,使用工具+附加到进程来附加调试器。您也可以使用debugger.Launch()在你的C#代码中。非常好且彻底的回答…谢谢!通过对我的原始问题使用此和注释的组合,我能够附加并重现我遇到的这个(以及其他几个)运行时问题。已接受。对于感兴趣的人,以下是有关调试堆的更多信息: