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

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

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

什么可能导致二进制文件从资源管理器运行时崩溃,但不是从Visual Studio运行?请注意,我正在使用Release版本;调试版本在Visual Studio和Explorer中都不会崩溃.

(如果它是相关的,我可以说崩溃与操纵C DLL中的malloc分配的数组有关.我通过精心评论代码块,重建,从Windows运行,以及检查是否跟踪它崩溃发生.然而,我已经达到了一个点,在没有能够在调试器中正确中断的情况下进行变得非常困难).

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

解决方法:

当程序在调试中工作但在发布时崩溃时,问题通常是缓冲区溢出,所以你应该寻找类似不正确的缓冲区长度变量.

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

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

请注意,即使在附加时仍可能发生差异,调试器总是会略微改变目标行为.虽然只有未定义的行为应该改变.

编辑:我错过了,但文章说您可以通过设置环境变量_NO_DEBUG_HEAP = 1来禁用调试堆.这可能是调试问题的最简单的解决方案(如果它可以工作).

本文标题为:从Windows运行时,C#/ C应用程序崩溃,但不是从Visual Studio运行

基础教程推荐