当内存位置的内容发生变化或被读取时自动中断

时间:2009-08-11 15:40:57

标签: c++ visual-studio debugging

旧的DEC Tru64 UNIX调试器有一个功能(称为“监视变量的观察点”),它可以监视读取或写入活动的内存位置(或地址范围),当它检测到此类活动时会破坏程序,因此您可以调查原因。详见:

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

有没有办法在VisualStudio调试器中执行此类操作?或者是否有一个附件或其他工具可以在Windows下执行此操作?

5 个答案:

答案 0 :(得分:22)

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

这仅适用于更改值。我不知道如何监视读取权限。然而,想知道价值变化的地方是一个非常普遍的问题。我发现我不想知道谁经常读取值。

答案 1 :(得分:6)

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

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字节。每次访问受保护的内存时都会抛出异常。这个类仅限于大内存区域使用,但我希望它可以提供帮助。

可以通过以下方式使用:

// some_array should be aligned on PAGE_SIZE boundaries
protect_mem_t guard( &some_array, PAGE_SIZE );

答案 2 :(得分:1)

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

答案 3 :(得分:0)

是的,数据断点可以检测写入。但是,不知道是否可以检查读数。我不相信x86本身就支持它。

答案 4 :(得分:0)

我建议the hwbreak project。它甚至允许在读取位置时设置数据断点。

我将其修改为仅创建一个线程,并将该线程重用于所有数据断点,但这只是为了提高效率。