诊断/调试潜在的堆栈损坏.NET应用程序

时间:2011-06-14 23:22:51

标签: c# .net winforms windbg memory-corruption

3 个答案:

答案 0 :(得分:3)

只是简单地想一想它听起来像是一个x64互操作问题(即,从x64托管代码调用x32本机函数充满了危险)。如果强制应用程序从项目属性中编译为x32平台,问题是否会消失?

您可以阅读有关在Dotnetrocks上x32 / x64开发期间强制x32编译的建议。 Richard Campbell的建议是Visual Studio应默认为x32平台而不是AnyCPU。 http://www.dotnetrocks.com/default.aspx?showNum=341transcript)。

关于高级调试,我没有机会调试x64互操作代码,但我听说这本书是一个很好的资源:Advanced .NET Debugging

最后,您可以尝试的一件事是force Visual Studio to break when an exception is thrown

答案 1 :(得分:2)

使用类似DebugDiag for x64或Windbg的内容在Kernel32!TerminateProcess上编写转储,在.NET上编写第二次机会异常,它应该为您提供发生的异常的实际.excr上下文框架。 / p>

这应该可以帮助您识别进程终止的调用堆栈。

IMO可能主要是因为PInvoke调用。您可以使用Managed Debugging Assistants来调试这些问题。

如果MDA与Windbg一起使用,它会发出有助于调试的消息

enter image description here

此外,我发现http://clrinterop.codeplex.com/团队的工具在处理互操作时非常方便

修改

这应该给出答案为什么它不能在64位Issue with callback method in SetTimer Windows API called from C# code中工作。

答案 2 :(得分:1)

这听起来像腐败问题。我将完成所有的互操作调用,并确保DllImport的函数的所有参数都是正确的类型。例如,使用int代替IntPtr将以32位代码工作,但可能会崩溃64位。

我会使用像PInvoke.net这样的网站来验证所有签名。