即使你把输出导向到文件中,运转记录花费的时间所带来的冲击,仍然足够改变程序的执行结果。如果要改善这种情况,我必须回到一个我所谓的“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)[自定义的名字] --调试方法的更多相关文章

  1. heap corruption detected错误解决方法调试方法以及内存管理相关

    1.heap corruption detected http://vopit.blog.51cto.com/2400931/645980   heap corruption detected:aft ...

  2. [SPDK/NVMe存储技术分析]015 - 理解内存注册(Memory Registration)

    使用RDMA, 必然关系到内存区域(Memory Region)的注册问题.在本文中,我们将以mlx5 HCA卡为例回答如下几个问题: 为什么需要注册内存区域? 注册内存区域有嘛好处? 注册内存区域的 ...

  3. Android 内存管理 &Memory Leak & OOM 分析

    转载博客:http://blog.csdn.net/vshuang/article/details/39647167 1.Android 进程管理&内存 Android主要应用在嵌入式设备当中 ...

  4. 关于Linux的缓存内存 Cache Memory详解<转>

    转自 http://www.ha97.com/4337.html PS:前天有童鞋问我,为啥我的Linux系统没运行多少程序,显示的可用内存这么少?其实Linux与Win的内存管理不同,会尽量缓存内存 ...

  5. 内存泄露 Memory Leaks

    什么是内存泄露 内存管理一直是Java 所鼓吹的强大优点.开发者只需要简单地创建对象,而Java的垃圾收集器将会自动管理内存空间的分配和释放. 但在很多情况下,事情并不那么简单,在 Java程序中总是 ...

  6. MySQL内存表(MEMORY)说明 | 一个PHP程序员的备忘录

    MySQL内存表(MEMORY)说明 | 一个PHP程序员的备忘录 MySQL内存表(MEMORY)说明

  7. SQL Server 内存泄露(memory leak)——游标导致的内存问题

    原文:SQL Server 内存泄露(memory leak)--游标导致的内存问题 转自:http://blogs.msdn.com/b/apgcdsd/archive/2011/07/01/sql ...

  8. 内存泄漏(Memory Leak)

    什么情况下会导致内存泄露(Memory Leak)? Android 的虚拟机是基于寄存器的Dalvik,它的最大堆大小一般是16M,有的机器为24M.因此我们所能利用 的内存空间是有限的.如果我们的 ...

  9. linux内核剖析(十一)进程间通信之-共享内存Shared Memory

    共享内存 共享内存是进程间通信中最简单的方式之一. 共享内存是系统出于多个进程之间通讯的考虑,而预留的的一块内存区. 共享内存允许两个或更多进程访问同一块内存,就如同 malloc() 函数向不同进程 ...

随机推荐

  1. 工作流JBPM_day01:6-执行流程实例

    工作流JBPM_day01:6-执行流程实例 执行流程 启动流程实例 查询任务列表 办理任务 向后执行一步 先部署流程定义在启动流程实例 Jbpm4_execution表表示正在执行的流程实例的的信息 ...

  2. laravel 模版赋值

    1)一般赋值是直接用view助手函数返回的 return view('Index/index', ['key'=>'value']); 2)一般做系统时,我们都会有一个共同控制器,其他控制器继承 ...

  3. shell基础篇(四)算术运算

    ---内容来源于http://www.jb51.net/article/31232.htm shell中的赋值和操作默认都是字符串处理,1.错误方法举例 a) var=1+1 echo $var 输出 ...

  4. ZooKeeper(七)-- ZK原生API实现分布式锁

    一.使用场景 在分布式应用,往往存在多个进程提供同一服务.这些进程有可能在相同的机器上,也有可能分布在不同的机器上. 如果这些进程共享了一些资源,可能就需要分布式锁来锁定对这些资源的访问. 二.实现分 ...

  5. Unity中Oculus分屏相机和普通相机一键切换

    Unity中Oculus分屏相机和普通相机一键切换 一.OCulus 分屏相机介绍 在VR开发工程中,总会觉得OC分屏的处理太慢,严重浪费时间啊! 但是不使用有不好调试,来回切换相机就成为了一个必须. ...

  6. Spring学习笔记--Spring表达式语言SpEL

    Spring3引入了Spring表达式语言(Spring Expression Language,SpEL).SpEL是一种强大的.简洁的装配Bean的方式,它通过运行期执行的表达式将值装配到Bean ...

  7. Android英文文档翻译系列(5)——VPNService

      API14位于android.net.VpnService 类概述|Class OverviewVpnService is a base class for applications to ext ...

  8. java高级---->Thread之CompletionService的使用

    CompletionService的功能是以异步的方式一边生产新的任务,一边处理已完成任务的结果,这样可以将执行任务与处理任务分离开来进行处理.今天我们通过实例来学习一下CompletionServi ...

  9. DOM操作的性能问题

    造成DOM操作性能差的原因:1.DOM操作的实现和ECMAscript的实现是两个独立的部分,之间通过接口来完成相应的DOM操作. 2.实时查询文档得到HTML集合,重复执行查询操作.特别是lengt ...

  10. 【BZOJ2599】[IOI2011]Race 树的点分治

    [BZOJ2599][IOI2011]Race Description 给一棵树,每条边有权.求一条简单路径,权值和等于K,且边的数量最小.N <= 200000, K <= 100000 ...