首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当内存位置的内容更改或被读取时自动中断

当内存位置的内容更改或被读取时自动中断
EN

Stack Overflow用户
提问于 2009-08-11 15:40:57
回答 5查看 14.4K关注 0票数 18

旧的DEC Tru64 UNIX调试器有一个特性(称为“监视变量的观察点”),它可以监视一个内存位置(或地址范围)的读或写活动,当它检测到这样的活动会中断程序时,您可以调查原因。请参阅了解详细信息:

http://h30097.www3.hp.com/docs/base_doc/DOCUMENTATION/V50_HTML/ARH9QATE/DOCU_009.HTM

有没有办法在VisualStudio调试器中做这类事情?或者有没有一个插件或其他工具可以在Windows下做到这一点?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-08-11 15:53:55

是的,你可以在visual studio中做到这一点。当你在一个正在运行的程序中断时,你可以在调试菜单下创建一个“新数据断点”。然后指定要监视的地址和字节数。

这仅适用于更改该值。我不知道如何监视读访问权限。然而,一个非常常见的问题是想知道值在哪里发生了变化。我发现我不想知道谁经常读一个值。

票数 26
EN

Stack Overflow用户

发布于 2009-08-11 17:12:53

内存位置上的Visual Studio断点长度仅为4字节(在32位allows to set版本上)。要捕获内存访问(读或写),可以使用以下类:

代码语言:javascript
复制
struct protect_mem_t {
    protect_mem_t( void* addr, size_t size ) : addr(addr), size(size), is_protected(FALSE) { 
        protect(); 
    }
    ~protect_mem_t() { release(); }
    BOOL protect() { 
        if ( !is_protected ) {
            // To catch only read access you should change PAGE_NOACCESS to PAGE_READONLY
            is_protected = VirtualProtect( addr, size, PAGE_NOACCESS, &old_protect );
        }
        return is_protected;
    }
    BOOL release() { 
        if ( is_protected ) 
            is_protected = !VirtualProtect( addr, size, old_protect, &old_protect );
        return !is_protected;
    }

protected:
    void*   addr;
    size_t  size;
    BOOL    is_protected;
    DWORD   old_protect;
};

它会更改选定内存页面上的访问模式。在32位系统上,页面大小等于4096字节。异常将在每次访问受保护的内存时抛出。这个类的使用仅限于较大的内存区域,但我希望它能有所帮助。

它可以通过以下方式使用:

代码语言:javascript
复制
// some_array should be aligned on PAGE_SIZE boundaries
protect_mem_t guard( &some_array, PAGE_SIZE );
票数 6
EN

Stack Overflow用户

发布于 2009-08-11 20:08:07

您可以使用WINDBG并在所需地址上设置ba断点

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

https://stackoverflow.com/questions/1261198

复制
相关文章

相似问题

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