Met*_*450 4 c# c++ pinvoke visual-studio-2010 visual-studio-debugging
我正在开发一个调用非托管(C++)DLL的C#应用程序.我发现某个用户操作从Windows资源管理器运行时始终导致应用程序崩溃.但是,从Visual Studio调试器启动时,不会发生崩溃.因此,我无法在崩溃时进入代码并完全调试正在发生的事情.
什么可能导致二进制文件从资源管理器运行时崩溃,但不是从Visual Studio运行?请注意,我正在使用Release版本; 调试版本在Visual Studio 和 Explorer中都不会崩溃.
(如果它是相关的,我可以说崩溃与在C++ DLL中操作malloc分配的数组有关.我通过精心评论代码块,重建,从Windows运行并检查是否跟踪它来跟踪它.发生了崩溃.然而,我已经达到了一个难以在没有能够正确打破调试器的情况下继续进行的程度).
我只对能够在Visual Studio中重新创建崩溃感兴趣.
当程序在调试中工作但在发布时崩溃时,问题通常是缓冲区溢出,所以你应该寻找类似不正确的缓冲区长度变量.
关于调试时它没有崩溃的原因,这里有一篇关于调试器副作用的小文章.正如您所看到的,当调试器启动程序时,堆可能会有不同的行为.缓冲区溢出经常发生在堆上,你说它可能发生在malloc-ed缓冲区中,所以这就是原因.
现在,为了使程序在调试时崩溃,唯一的方法可能是在启动后附加.如果在DLL项目中设置断点不起作用,请尝试使用DLL项目启动调试,并将可执行文件指定为DLL主机.如果你不能点击这样的断点,那么你总是可以在汇编代码中设置断点,这应该始终有效,但实际上并不实用.
请注意,即使在附加时仍可能发生差异,调试器总是会略微改变目标行为.虽然只有未定义的行为应该改变.
编辑:我错过了,但文章说你可以通过设置环境变量来禁用调试堆_NO_DEBUG_HEAP = 1.这可能是调试问题的最简单的解决方案(如果有效).
| 归档时间: |
|
| 查看次数: |
2184 次 |
| 最近记录: |