【发布时间】:2015-01-07 08:53:40
【问题描述】:
我正在开发一个调用非托管 (C++) dll 的 C# 应用程序。我发现某个用户操作在从 Windows 资源管理器运行时始终导致应用程序崩溃。但是,当从 Visual Studio 调试器启动时,不会发生崩溃。因此,我无法在崩溃时进入代码并准确调试正在发生的事情。
从资源管理器运行而不是从 Visual Studio 运行时,什么可能导致二进制文件崩溃?请注意,我使用的是发布版本;调试构建既不会在 Visual Studio 中崩溃也不在资源管理器中。
(如果相关,我可以说崩溃与在 C++ DLL 中操作分配了 malloc 的数组有关。我通过煞费苦心地注释掉代码块、重建、从 Windows 运行并检查是否或不发生崩溃。但是,我已经到了一个地步,如果无法正确中断调试器,就很难继续进行。
我只是对能够在 Visual Studio 中重现崩溃感兴趣。
【问题讨论】:
-
显示你的代码,可能还有错误截图
-
为什么在 C++ 中使用
malloc?请记住,它只分配内存,不调用对象的构造函数。您可以更改为new,并编写一些断言来测试您的不变量。 -
您的应用程序是多线程的吗?如果是这样,从调试切换到发布有时会揭示竞争条件。或者,尝试编写 C# 代码的 C++ 等效版本,看看代码的互操作部分是否存在问题。
-
@David:这是崩溃产生的结果:screencast.com/t/ecDZ4K5pAXbq。 dll 代码来自 Seismic Unix (tinyurl.com/ntoyxcd),我正在(部分)移植到 Windows 以在我的项目中使用。显示代码并不容易,因为原始代码是一团乱七八糟的意大利面条(即对“malloc”的实际调用隐藏在许多函数深处,与使用它的位置不同等)。我更感兴趣的是让它在 Visual Studio 中崩溃以自己调试崩溃,而不是帮助找出崩溃。
-
在进程启动后使用工具+附加到进程来附加调试器。您还可以在 C# 代码中使用 Debugger.Launch()。
标签: c# c++ visual-studio-2010 pinvoke visual-studio-debugging