首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >高堆栈帧上的条件断点

高堆栈帧上的条件断点
EN

Stack Overflow用户
提问于 2014-05-07 23:15:02
回答 1查看 355关注 0票数 6

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-13 22:12:16

是的,这在技术上是可能的。不是很大的joy,请注意,您必须告诉调试器取消引用一个指针,以获得另一个堆栈帧中局部变量的值。

一个简单的例子:

代码语言:javascript
复制
#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并复制该值。

现在,使用该值设置条件断点。我用:

代码语言:javascript
复制
  *(int*)0x0073fbc8 == 2 && ix == 3

其中0x0073fbc8是我在第一个断点获得的值。或者,您可以从基本指针寄存器中使其相对。设置一个无条件的断点,并在点击时使用Debug + Windows +寄存器查看EBP值。从&jx值中减去它。我用:

代码语言:javascript
复制
  *(int*)(ebp+0xd8) == 2 && ix == 3

两个人都干得很好。请注意,对于Debug构建,您需要关闭ASLR,希望这些地址可以从一次运行到另一次。项目+属性,链接器,高级,随机基址=编号。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23530052

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档