Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Debugging 较高堆栈帧上的条件断点_Debugging_Visual C++_Conditional Breakpoint - Fatal编程技术网

Debugging 较高堆栈帧上的条件断点

Debugging 较高堆栈帧上的条件断点,debugging,visual-c++,conditional-breakpoint,Debugging,Visual C++,Conditional Breakpoint,在MSVC++调试器中,是否可以在一个函数中创建断点,其条件取决于其他堆栈帧中的局部变量?我经常发现自己在一个函数中创建了一个条件断点,当该断点命中时,我会启用另一个断点(我希望在退出当前函数调用之前触发该断点)并继续。这既耗时又容易出错 我过去采用的一种方法是将相关变量写入全局变量,并将该全局变量用作条件。但是,这需要重新编译,并且不适用于多线程代码。是的,这在技术上是可能的。请注意,没有什么好高兴的,您必须告诉调试器取消对指针的引用,以获取另一个堆栈帧中局部变量的值 一个简单的例子: #in

在MSVC++调试器中,是否可以在一个函数中创建断点,其条件取决于其他堆栈帧中的局部变量?我经常发现自己在一个函数中创建了一个条件断点,当该断点命中时,我会启用另一个断点(我希望在退出当前函数调用之前触发该断点)并继续。这既耗时又容易出错


我过去采用的一种方法是将相关变量写入全局变量,并将该全局变量用作条件。但是,这需要重新编译,并且不适用于多线程代码。

是的,这在技术上是可能的。请注意,没有什么好高兴的,您必须告诉调试器取消对指针的引用,以获取另一个堆栈帧中局部变量的值

一个简单的例子:

#include "stdafx.h"
#include <iostream>

void foo() {
    for (int ix = 0; ix < 5; ++ix) {
        std::cout << ix << " ";                 // <=== Conditional breakpoint here
    }
}

void bar() {
    for (int jx = 0; jx < 5; ++jx) {
        std::cout << jx << ": ";                // <=== Start with a breakpoint here
        foo();
        std::cout << std::endl;
    }
}

int _tmain(int argc, _TCHAR* argv[])
{
    bar();
    return 0;
}
其中0x0073fbc8是我在第一个断点处获得的值。或者,可以从基指针寄存器将其设置为相对。设置一个无条件断点,当它点击时,使用Debug+Windows+寄存器查看EBP值。从&jx值中减去它。我用过:

  *(int*)0x0073fbc8 == 2 && ix == 3
  *(int*)(ebp+0xd8) == 2 && ix == 3

两者都很好。请注意,您需要关闭ASLR,以便调试构建能够希望这些地址可以从一次运行重复到另一次运行。Project+属性、链接器、高级、随机基地址=否。

可以让断点在命中时运行宏(在“断点”窗口中右键单击它,选择命中时)。不过我自己从来没有试过。看看您是否可以从这个VS2012删除的宏支持中获得一些好处。另外,VS2010中的宏支持基本上是一个组合框;每次都需要自定义宏。嗯。你知道,我突然想到帧指针寄存器是可用的。我想知道我是否可以用它使这种方法与基址无关。是的,但是从EBP(或者更可能是ESP)到更高帧变量的偏移量与基址无关。也就是说,条件可能类似于
*(int*)(ESP+28)==2
。好的,我将把它包含在答案中。