15 c++ debugging visual-studio
旧的DEC Tru64 UNIX调试器有一个功能(称为"监视变量的观察点"),它可以监视读取或写入活动的内存位置(或地址范围),当它检测到此类活动时会破坏程序,因此您可以调查原因.详情请见:
http://h30097.www3.hp.com/docs/base_doc/DOCUMENTATION/V50_HTML/ARH9QATE/DOCU_009.HTM
有没有办法在VisualStudio调试器中执行此类操作?或者是否有一个附加组件或其他工具可以在Windows下执行此操作?
Mat*_*ice 23
是的,你可以在visual studio中做到这一点.当您在正在运行的程序中断时,可以在调试菜单下创建"新数据断点".然后指定要监视的地址和字节数.
这仅适用于更改值.我不知道如何监视读取权限.然而,想要知道价值变化的位置是一个非常普遍的问题.我发现我不想知道谁经常读取值.
Visual Studio 允许在内存位置设置仅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;
};
Run Code Online (Sandbox Code Playgroud)
它会更改所选内存页面上的访问模式.在32位系统上,页面大小等于4096字节.每次访问受保护的内存时都会抛出异常.这个类仅限于大内存区域使用,但我希望它可以提供帮助.
它可以通过以下方式使用:
// some_array should be aligned on PAGE_SIZE boundaries
protect_mem_t guard( &some_array, PAGE_SIZE );
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11496 次 |
| 最近记录: |