7

当我在VS2005中使用条件断点而不是使用临时代码来检查特定条件时,我注意到它需要更多时间并且执行速度降低了!!你知道为什么吗?以及如何解决这个问题?

示例:

    int sequence = atoi(m_SequenceNumber.GetAscii());
    if( sequence == 392914)//temporary code to check to step into code
    {
        int x = 0;//I put breakpoint here
    }

前面的代码将比我使用条件断点(序列 == 392914)更快地执行

4

5 回答 5

4

使用内存观察点比使用条件断点更好(如果可能)。条件断点(正如其他人指出的那样)必须在每次执行指针越过该点时运行额外的代码,以确定它是否会中断 - 显然这需要额外的时间。某种类型的内存观察点可以使用某些特殊的硬件寄存器——你可以设置多少个可以加速的观察点是有限制的,但如果你可以使用它们,几乎不会有速度损失。

使用断点窗口设置内存观察点。您不是在一行代码上设置它,而是在内存中的一个地址上设置它。这表明了明显的限制,它仅适用于您实际上可以获取地址的东西,例如全局变量和动态分配的内存区域(使用new等)。您可以观看多少内存是有限的(基于 CPU,我认为您可能会获得或多或少的特殊寄存器分配)。

我现在实际上并没有坐在 VS 前面,但粗略地说,您在断点窗口中单击鼠标右键并选择“新数据断点”之类的内容。然后输入内存地址和大小(以字节为单位)。每当值更改时,您的观察点就会触发。这对于找出内存损坏问题特别有用。

于 2009-02-11T07:52:49.087 回答
3

我过去也遇到过这个问题,但从未真正找到在大循环中继续使用条件断点而不影响性能的方法。我确实了解到您可以插入一些类似这样的临时代码,这些代码不会影响性能并且会导致 VS 中断(与条件断点的行为相同)。

if ( condition ) Debugger.Break();
于 2009-02-11T08:07:43.950 回答
2

想想如果您正在编写调试器,您将如何实现条件断点。调试器唯一有机会评估条件的时间是断点被命中时。因此,即使断点就您而言是有条件的,但就处理器而言,每次执行指令时都会遇到断点。调试器获得控制权并执行以下操作:

  • 确定断点是有条件的
  • 计算表达式
  • 如果表达式为假,调试器继续执行
  • 否则,调试器会将控制权交给您

因此,即使您从未看到断点命中(因为不满足条件),调试器也可能会处理断点并每秒评估条件数千次(或者可能更多次)。

于 2009-02-11T09:02:26.517 回答
0

我认为这是因为执行条件需要时间。它仍然比手动步进必要的次数要快得多。

于 2009-02-11T07:35:42.483 回答
0

编译器可以优化(至少一点)添加的临时代码。条件断点可能会跳转到一些 Visual Studio 代码,这些代码将手动检索所需信息以了解它是否真的需要暂停。

这可以以某种方式解释为什么需要更多时间。但我只是猜测。

于 2009-02-11T07:45:29.230 回答