内存记号(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() 函数向不同进程 ...
随机推荐
- QlikView报表显示连续若干个月内活跃用户的数量
之前有朋友提到了这样一个需求,要计算三年中每年都有销售记录的客户量,仅仅有近期两年有销售纪录的客户量(假如某个用户2012年和2014年都有记录,在2013年没有则不计算在内).以及近期一年的新增客户 ...
- 工作流JBPM_day01:3-使用JBPM的API添加与执行流程
工作流JBPM_day01:3-使用JBPM的API添加与执行流程 流程定义画完得到压缩文件--->部署流程定义-->启动流程实例-->查询我的个人任务列表-->办理任务--& ...
- GIS-005-Dojo & jQuery 事件处理
1.添加事件 dojo.connect(dojo.byId("SelectRect"), "onclick", function () { //todo }); ...
- python2.0_day18_django_form
Django formDjango admin 为什么要讲form,Django里的form能做什么. 前面day16节 简单学习了Django admin,我们知道当我们的models在admin. ...
- ZooKeeper(八)-- Curator实现分布式锁
1.pom.xml <dependencies> <dependency> <groupId>junit</groupId> <artifactI ...
- Java fluent风格
写个简单的例子,相信看了下面的例子,就会了解什么是fluent风格. 一.我们先写一个通常的,即不使用fluent风格 1.实体类 package com.xbq.demo.stu; /** * @C ...
- Linux nmon 命令
nmon 是一个资源监控工具,能够监控 Linux 系统资源( cpu,memory,network,disks )的使用情况,常见用法如下: [root@localhost ~]$ yum inst ...
- js遍历商品编码
function bathAuditGoods(state) { var selections = $("#deliveryGrid").datagrid('getSelectio ...
- 在Win64系统上动态加载无签名驱动:WIN64LUD
1.WIN64LUD的全称是WIN64 Load Unsigned Driver,功能如其名,在WIN64系统上加载无签名的驱动. 2.支持Windows 7/8/8.1/2008R2/2012/20 ...
- Resin任意文件读取漏洞
Resin是什么 虽然看不上但是还是原因下百度百科: Resin是CAUCHO公司的产品,是一个非常流行的支持servlets和jsp的引擎,速度非常快.Resin本身包含了一个支持HTTP/1.1的 ...