msdn之调试杂项

来源:互联网 发布:mac 下载不在dock 编辑:程序博客网 时间:2024/05/17 22:51

问题描述

我认为我的一个指针可能损坏了地址 0x00408000 处的内存。如何查明该地址处所发生的情况?

解决方案

检查堆损坏

  • 大多数内存损坏实际上是由堆损坏引起的。尝试使用 Global Flags Utility (gflags.exe) 或 pageheap.exe。请参见http://support.microsoft.com/default.aspx?scid=kb;en-us;286470。

若要查找内存地址改变的位置

  1. 在 0x00408000 处设置一个数据断点。有关更多信息,请参见如何:设置数据断点(仅限本机)。

  2. 当命中断点时,使用“内存”窗口查看从 0x00408000 开始的内存内容。有关更多信息,请参见“内存”窗口。

问题描述

给我的某个函数传递的是错误的参数值。很多地方都在调用该函数。如何查明是谁在传递错误值?

解决方案

解决此问题

  1. 在函数的开始处设置一个位置断点。

  2. 右击该断点并选择“条件”。

  3. 在“断点条件”对话框中,单击“条件”复选框。有关更多信息,请参见如何:指定断点条件。

  4. 在文本框中输入一个表达式(例如 Var==3),此处 Var 是包含错误值的参数的名称,3 是传给此参数的错误值。

  5. 选择“为真”单选按钮,单击“确定”按钮。

  6. 现在再次运行程序。当 Var 参数的值为 3 时,断点导致程序在函数开始处暂停。

  7. 然后可以使用“调用堆栈”窗口查找调用函数并定位到其源代码。有关更多信息,请参见如何:使用“调用堆栈”窗口。

    问题描述

    程序在调用某函数(如 CnvtV)时失败。失败以前该程序可能已调用了该函数数百次。如果我在 CnvtV 上设置一个位置断点,程序在每次调用该函数时都停止,而我不希望这样。我不知道什么条件导致调用失败,所以无法设置条件断点。我该怎么办?

    解决方案

    在函数上设置断点时可以将“命中次数”字段设置为一个大到永远无法达到的值。在这种情况中,由于您确信函数 CnvtV 被调用了数百次,所以将“命中次数”设置为 1000 或更高。然后运行程序,等待调用失败。程序失败后,打开“断点”窗口并查看断点列表。将显示您在 CnvtV 上设置的断点,其后跟着命中次数和剩余迭代次数:

    CnvtV(int) (no condition) when hit count is equal to 1000 (currently 101)

    现在您知道函数在第 101 次调用时失败。如果重置断点,将命中次数设置为 101,然后再次运行程序,程序将在导致 CnvtV 调用失败的位置停止所有 CnvtV 调用。

    问题描述

    在哪里可以查看win32错误代码

    解决方案

    默认系统安装的 INCLUDE 目录中的 WINERROR.H 包含 Win32 API 函数的错误代码定义。

    可以通过在“监视”窗口或“快速监视”对话框中键入错误代码来查阅该代码。例如:

    0x80000004,hr

    问题描述

    我的程序存在窗口激活问题。用调试器逐句通过程序时,因为程序不断失去焦点,所以妨碍了再现问题。是否有方法可以避免该问题?

    解决方案

    如果有另一台计算机,请使用远程调试。可以在远程计算机上运行您的程序,而在主机上运行调试器。有关更多信息,请参见如何:选择远程计算机。


    问题描述

    如何调试win32api?

    解决方案

    如果要调试加载了 NT 符号的 Windows API 函数,需要执行以下步骤。

    若要在加载了 NT 符号的 Windows API 函数中设置断点

    • 输入函数名的修饰格式以及函数所在的 DLL 的名称。例如,若要在 MessageBeep 上设置断点,必须输入:

      {,,USER32.DLL}_MessageBeep@4

      可以从使用 /MAP 创建的映射文件中获得修饰名。




0 0
原创粉丝点击