我正在开发一个调用非托管(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运行
- Unity Shader实现模糊效果 2023-04-27
- .NET CORE DI 依赖注入 2023-09-27
- 在C# 8中如何使用默认接口方法详解 2023-03-29
- C# 使用Aspose.Cells 导出Excel的步骤及问题记录 2023-05-16
- user32.dll 函数说明小结 2022-12-26
- 如何使用C# 捕获进程输出 2023-03-10
- c# 模拟线性回归的示例 2023-03-14
- WPF使用DrawingContext实现绘制刻度条 2023-07-04
- Oracle中for循环的使用方法 2023-07-04
- Unity3D实现渐变颜色效果 2023-01-16