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

标签 c# c++ visual-studio-2010 pinvoke visual-studio-debugging

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

从 Explorer 而不是从 Visual Studio 运行时,什么可能导致二进制文件崩溃?请注意,我使用的是发布版本;调试构建在 Visual Studio 和 Explorer 中都不会崩溃。

(如果相关,我可以说崩溃与在 C++ DLL 中操作 malloc 分配的数组有关。我通过煞费苦心地注释掉代码块、重建、从 Windows 运行并检查是否或没有发生崩溃。但是,我已经达到了这样一个地步,如果不能正确地中断调试器,就很难继续进行。

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

最佳答案

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

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

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

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

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

关于从 Windows 而不是从 Visual Studio 运行时,C#/C++ 应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27815594/

相关文章:

c# - 如何在一个查询中合并多个选择查询

c# - 检查 url 是否在域名后有任何内容

c# - 通用接口(interface)问题

c++ - 如何在 C++ ( Linux ) 中查找格式为 $INPUTDIR/*/*/*/results.txt 的文件

visual-studio-2010 - 有没有更好的方法来使用 Visual Studio 2010 部署 Web 应用程序?

c# - 一个 C# 项目中的多个 EXE

c++ - 你可以在 C++ 中按位移动 bool 值吗?

java - Android NDK 困惑

sql-server - SSIS Excel 连接管理器无法连接到源

c++ - 在VS2010 Debug模式下启用多核编译?