在MSVC++调试器中,是否可以在一个函数中创建一个断点,其条件取决于来自其他堆栈帧的局部变量?我经常发现自己在一个函数中创建了一个条件断点,当该断点命中时,我启用了另一个断点(我希望在退出当前函数调用之前触发该断点)并继续。这既费时又容易出错。
我过去采取的一种方法是将这个变量写入全局,并将其作为一个条件使用。但这需要重新编译,并且不适用于多线程代码。
发布于 2014-05-13 22:12:16
是的,这在技术上是可能的。不是很大的joy,请注意,您必须告诉调试器取消引用一个指针,以获得另一个堆栈帧中局部变量的值。
一个简单的例子:
#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;
}首先需要获得要设置条件的变量的地址。在bar()中的指示行上设置一个断点。当它命中时,计算&jx并复制该值。
现在,使用该值设置条件断点。我用:
*(int*)0x0073fbc8 == 2 && ix == 3其中0x0073fbc8是我在第一个断点获得的值。或者,您可以从基本指针寄存器中使其相对。设置一个无条件的断点,并在点击时使用Debug + Windows +寄存器查看EBP值。从&jx值中减去它。我用:
*(int*)(ebp+0xd8) == 2 && ix == 3两个人都干得很好。请注意,对于Debug构建,您需要关闭ASLR,希望这些地址可以从一次运行到另一次。项目+属性,链接器,高级,随机基址=编号。
https://stackoverflow.com/questions/23530052
复制相似问题