我正在开发一个调用非托管(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运行
基础教程推荐
- 一个读写csv文件的C#类 2022-11-06
- C#类和结构详解 2023-05-30
- C# List实现行转列的通用方案 2022-11-02
- unity实现动态排行榜 2023-04-27
- C# windows语音识别与朗读实例 2023-04-27
- linux – 如何在Debian Jessie中安装dotnet core sdk 2023-09-26
- C#控制台实现飞行棋小游戏 2023-04-22
- winform把Office转成PDF文件 2023-06-14
- ZooKeeper的安装及部署教程 2023-01-22
- C# 调用WebService的方法 2023-03-09