内存记号(Memory Trail)[自定义的名字] --调试方法
即使你把输出导向到文件中,运转记录花费的时间所带来的冲击,仍然足够改变程序的执行结果。如果要改善这种情况,我必须回到一个我所谓的“Memory Trails”(内存记号)的低阶技术中。
为了使用 memory trail,你必须产生一个全局缓冲区,以及一个指向该缓冲区的全局指针。例如:
char gMemTrail[16384];
char *pMemTrail = gMemTrail;
每当想印出某些东西到屏幕上或文件中,你就写一个记号到 memory trail中。例如:
*pMemTrail++ = 'D';
你的程序中的每一个追踪点都应该写出一个不同的记号。不论什么时候你想要,或是在程序当掉之后,你可以利用调试器看看 memory trail 的内容,分析其间到底发生了什么事。它当然不像文字那么容易阅读,但总比乱猜的好。
有一个鲜为人知的调试器特性,可以帮助你观看这个缓冲区内容。当程序停在断点上时,选择 Visual C++ 的【View/Memory】,打开“内存窗口”。一旦窗口开启,双击程序中的全局变量,使它成为高亮度,然后把它拖拉到“内存窗口”中,于是你就会看到数据以字节形式表现出来。如果要切换为文字形式,请选按【Tools/Options】菜单项,并选择其中的【Debug】附页,然后在“内存窗口”中把【Format】设定为 ASCII。[这个非常的好,非常的有用]
现在每当你的程序在调试器中停下来,“内存窗口”就会把有变化的数据高亮度起来。这样就可以很方便地观察 memory trail 中哪些数据被加了进来。如果你需要储存更多信息,你可以使用一个 DWORDs 数组,放置整个观察集合。例如:
*pBuf++ = (5 << 16 | some_useful_value);
这可以把 5 存放到较高字,把另一个数值存放在较低字。“内存窗口”可以被设定为 Long Hex 模式,于是数据可以比较容易被解读。
Memory trails 可以大量降低彼此干扰的可能性,因为它既没有用到系统函数,也没有用到同步机制。然而也由于它不是同步操作,当两个线程同时写入一笔数据,memory trails 还是有可能遗失数据。如果你有许多线程,而其中有许多断点,这可能会造成严重的问题。
【查看--调试窗口--memory】

【工具---选项---调试---内存器窗口】

【结束语】:欢迎网友们推荐更多的,更好的调试方法
内存记号(Memory Trail)[自定义的名字] --调试方法的更多相关文章
- heap corruption detected错误解决方法调试方法以及内存管理相关
1.heap corruption detected http://vopit.blog.51cto.com/2400931/645980 heap corruption detected:aft ...
- [SPDK/NVMe存储技术分析]015 - 理解内存注册(Memory Registration)
使用RDMA, 必然关系到内存区域(Memory Region)的注册问题.在本文中,我们将以mlx5 HCA卡为例回答如下几个问题: 为什么需要注册内存区域? 注册内存区域有嘛好处? 注册内存区域的 ...
- Android 内存管理 &Memory Leak & OOM 分析
转载博客:http://blog.csdn.net/vshuang/article/details/39647167 1.Android 进程管理&内存 Android主要应用在嵌入式设备当中 ...
- 关于Linux的缓存内存 Cache Memory详解<转>
转自 http://www.ha97.com/4337.html PS:前天有童鞋问我,为啥我的Linux系统没运行多少程序,显示的可用内存这么少?其实Linux与Win的内存管理不同,会尽量缓存内存 ...
- 内存泄露 Memory Leaks
什么是内存泄露 内存管理一直是Java 所鼓吹的强大优点.开发者只需要简单地创建对象,而Java的垃圾收集器将会自动管理内存空间的分配和释放. 但在很多情况下,事情并不那么简单,在 Java程序中总是 ...
- MySQL内存表(MEMORY)说明 | 一个PHP程序员的备忘录
MySQL内存表(MEMORY)说明 | 一个PHP程序员的备忘录 MySQL内存表(MEMORY)说明
- SQL Server 内存泄露(memory leak)——游标导致的内存问题
原文:SQL Server 内存泄露(memory leak)--游标导致的内存问题 转自:http://blogs.msdn.com/b/apgcdsd/archive/2011/07/01/sql ...
- 内存泄漏(Memory Leak)
什么情况下会导致内存泄露(Memory Leak)? Android 的虚拟机是基于寄存器的Dalvik,它的最大堆大小一般是16M,有的机器为24M.因此我们所能利用 的内存空间是有限的.如果我们的 ...
- linux内核剖析(十一)进程间通信之-共享内存Shared Memory
共享内存 共享内存是进程间通信中最简单的方式之一. 共享内存是系统出于多个进程之间通讯的考虑,而预留的的一块内存区. 共享内存允许两个或更多进程访问同一块内存,就如同 malloc() 函数向不同进程 ...
随机推荐
- Zookeeper异常org.apache.zookeeper.KeeperException$ConnectionLossException
在虚拟机上安装了CenOS Linux系统,然后配置好了 zookeeper的集群环境,在本地写了一个Zookeeper测试程序,如下: package com.xbq.zookeeper; impo ...
- docker nginx mysql
docker run -p 9000:9000 --name myphp -v /docker/www/:/var/www/html/ -v /docker/php/php.ini:/usr/loca ...
- js里面进行位运算时候的注意事项
&(按位与):两个操作数都是1就是1 任何数与1按位与的出来的都是其二进制最后一位:任何数与0按位与都是0|(按位或):两个操作数一个是1就是1 任何数与0按位或都是其本身^(按位异或):两个 ...
- iOS-利用插件实时刷新模拟器(提高效率)
解决办法: 1.需要给Xcode安装一个Alcatraz插件 安装完成后:点击window 下面的 package manager 安装我们今天的主角 2. ‘Injection Plugin for ...
- PHP之变量范围
前面的话 变量范围即它定义的上下文背景(也就是它的生效范围).在javascript中,并没有变量范围这一概念,相似的可能是作用域.但是,由于javscript使用的是词法作用域,指变量声明时的位置: ...
- JavaScript—文字自动变化为自定义颜色
效果: JS代码: var ColorTimer; var Colorforn = 0; //颜色代码 var ColorArray = new Array("#00CCCC", ...
- 封装自己的getClassName函数
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 170504、MongoDB和MySQL对比(译)
一.概要 几十年来,关系型数据库已经成为企业应用程序的基础,自从MySQL在1995年发布以来,它已经成为一种受欢迎并且廉价的选择.然而随着近年来数据量和数据的不断激增,非关系数据库技术如MongoD ...
- C#读取xml文件指定节点下的值
#region 读取xml文件指定节点下的值 XmlDocument xmlDoc = new XmlDocument(); xmlDoc.LoadXml(result); XmlNode root ...
- 【转】B2C电子商务系统设计精选
B2C电子商务系统研发——促销引擎设计(一)(Promotion Engine) B2C电子商务系统研发——商品SKU分析和设计(一) B2C电子商务系统研发——商品SKU分析和设计(二) 电商后台系 ...