如何在调试.net进程时找到LastError的值?

时间:2009-05-22 17:44:00

标签: .net visual-studio debugging winapi

我从.net进程获得一个异常,它正在使用对win32 api函数的interop调用。 我附加了一个调试器,我想看看LastError的值。 是否可以从Visual Studio调试器中看到LastError的值?

两个注意事项:抛出异常的进程不是我的,我无法修改其源代码以获取LastError的值。
我正在使用Visual Studio 2010的测试版我假设适用于VS 2008的解决方案将适用于2010.

感谢。

2 个答案:

答案 0 :(得分:9)

您可以致电Marshal.GetLastWin32Error()以获取最新的Windows API错误消息。这是建议的方法(与使用P / Invoke相反)。

来自文档:“GetLastWin32Error从Kernel32.DLL公开Win32 GetLastError API方法。此方法的存在是因为直接平台调用GetLastError来获取此信息是不安全的。如果要访问此错误代码,你必须调用GetLastWin32Error,而不是为GetLastError编写自己的平台调用定义并调用它。公共语言运行库可以对API进行内部调用,覆盖操作系统维护的GetLastError。“

另外,就不修改来源而言:

如果P / Invoke调用用DllImportAttribute.SetLastError修饰,这将在Visual Studio立即窗口中起作用。但是,如果P / Invoke对Windows API的调用缺少该属性,那么你将有点不幸,因为编组api很可能会在你看到它之前覆盖GetLastError中的值。

答案 1 :(得分:3)

尝试观看“$ err”(请参阅​​this question)。另外,请考虑查看讨论在您的P / Invoke调用中添加“SetLastError”的this question