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