如何在Visual Studio中调试时执行GetLastError()

Pet*_*aer 45 debugging winapi visual-studio

您正在单步执行C/C++代码,并且刚刚调用了失败的Win32 API(通常通过返回一些无用的通用错误代码,如0).您的代码不会进行后续的GetLastError()调用,您可以检查其返回值以获取更多错误信息.

如何在不重新编译和重现故障的情况下获得错误值?在Watch窗口中输入"GetLastError()"不起作用("语法错误").

Mic*_*urr 61

如前所述,@err伪寄存器将显示最后一个错误值,并将@err,hr错误显示为字符串(如果可以).

根据Visual Studio团队成员Andy Pennell的说法,从VS 7开始(Visual Studio .NET 2002),使用'@'字符表示伪寄存器已被弃用 - 他们更喜欢使用'$'(如$err,hr) .暂时支持$和@.

您还可以在条件断点中使用$ err伪寄存器; 因此,只有在最后一个错误为非零时才能中断一行代码.这可能是一个非常方便的技巧.

您可能会发现其他一些伪寄存器(来自John Robbins的优秀书籍"Microsoft .NET和Microsoft Windows调试应用程序"):

  • $tib - 显示线程信息块
  • $clk - 显示时钟计数(对计时功能有用).为了更方便地使用它,请放置一块$clk手表,然后再放一块$clk=0手表.第二个监视器将在显示当前值后清除伪寄存器,因此下一步或步骤将为您提供仅执行该操作的时间.请注意,这是一个粗略的时序,包括相当多的调试器开销,但它仍然非常有用.

  • 嘿 - 搞笑.我认为原因是他们试图使VS调试器与WinDbg及其堂兄ntsd/cdb保持一致. (3认同)

QBz*_*ziZ 6

ERR,hr 在观察窗口通常可以做到这一点

  • 将它改为@ err,hr,你就是金色的. (2认同)