【问题标题】:How to execute GetLastError() while debugging in Visual Studio在 Visual Studio 中调试时如何执行 GetLastError()
【发布时间】:2010-09-14 15:57:17
【问题描述】:

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

如何在不重新编译和重现失败的情况下获得错误值?在 Watch 窗口中输入“GetLastError()”不起作用(“语法错误”)。

【问题讨论】:

    标签: visual-studio debugging winapi


    【解决方案1】:

    正如多次提到的,@err 伪寄存器将显示最后一个错误值,@err,hr 会将错误显示为字符串(如果可以的话)。

    根据 Visual Studio 团队成员 Andy Pennell 的说法,从 VS 7 (Visual Studio .NET 2002) 开始,不推荐使用“@”字符来指示伪寄存器 - 他们更喜欢使用“$”(如$err,hr)。 $和@都暂时支持。

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

    您可能会发现其他一些方便的伪寄存器(来自 John Robbins 的杰出著作,"Debugging Applications for Microsoft .NET and Microsoft Windows"):

    • $tib - 显示线程信息块
    • $clk - 显示时钟计数(对计时功能有用)。要更轻松地使用它,请放置一个 $clk 手表,然后再放置一个 $clk=0 手表。第二个手表将在显示当前值后清除伪寄存器,因此下一步或跨步只为您提供该操作的时间。请注意,这是一个粗略的时间安排,其中包含相当多的调试器开销,但它仍然非常有用。

    【讨论】:

    • 他们对“$”有着深厚的感情。请记住 DOS 的以“$”结尾的字符串。谈论象征主义:)
    • 嘿-有趣。我认为原因是他们试图让 VS 调试器与 WinDbg 及其表亲 ntsd/cdb 保持一致。
    • 添加 @ERR,hr 或 $ERR,hr 作为手表,右键单击更改时中断:无法设置数据断点。表达式“@ERR,hr”没有有效的数据断点地址。docs 说是 $Err,但效果相同。
    【解决方案2】:

    ERR,hr 在监视窗口中通常可以解决问题

    【讨论】:

    • 把它改成@err,hr,你就成功了。
    • 例如,您可以在范围内有 ERR 变量,这会打印出与上一个错误代码不同的内容。
    • 正确!所以@ERR,hr 更好
    【解决方案3】:

    “编辑并继续”添加代码以便您可以看到错误(只是不要创建新的全局变量来存储它)。如果您可以快速调用执行此类错误处理代码的预先存在的函数,它会非常有效。

    作为奖励,您也可以将新代码留在那里以备将来使用。

    如果你不能做到这一点,那么 QBziZ 是对的,“ERR,hr”做到了。

    【讨论】:

    • 编辑和继续在非常大的代码段中效果不佳
    猜你喜欢
    • 2015-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-12
    • 1970-01-01
    • 2017-10-02
    • 1970-01-01
    相关资源
    最近更新 更多