vs中调试程序

查看变量在内存中的内容的方法

https://blog.csdn.net/guojg1988/article/details/42922149

原文链接:http://www.sowsoy.com/topics-516.html点击打开链接

在vs中调试程序的,有时候需要设置断点看某个变量的内容,如果变量是一个指针、数组或结构体,则可以通过查看该变量所指向的内存来看变量的内容。

1、在vs2008中打开内存窗口

在vs2008调试界面中,点击菜单【调试】->【窗口】->【内存】->【内存1】/【内存2】/【内存3】/【内存4】即可打开内存窗口。

2、找到要查看的变量的内存地址

在VS调试界面中,右键点击要查看内存的变量,在弹出菜单中点击【添加监视】,该变量将被添加到监视窗口中,在监视窗口中该变量对应的【值】列就是该变量对应的内存的地址。

3、将变量地址输入到内存窗口中

在内存窗口中,输入要监视的变量的地址(如0x001926E6),回车即可看到该内存块的内容了。

也可以尝试输入&+变量名。

4、设置内存存储的内容的显示方式

在内存界面中,默认显示的是16进制的单字节整数,可以通过在显示区点击右键,在弹出菜单中选择内存内容的显示方式。如作为双字节整数显示、4字节整数显示、是否显示符号位等。

今天讲一下如何从VS2010中查看内存和寄存器状态,一般来讲,只要从事C/C++编程的人,基本上对于这篇文章完全可以略过了,但写这篇文章的初衷在于,自己也是从这一步中过来的,记得当年自己其实也不知道如何快速使用VS中各种工具,导致花了很多时间在查找资料上面。所以,本文基本上可以说是面向菜鸟级选手了。废话不多说,直接上菜。。。

一、查看寄存器

通常来说,在进行C或C++编程的时候,对于寄存器的查看还是不常用。但如果你在进行汇编代码编程,那么学会查看相关寄存器便显得非常重要,你可以从相关寄存器的值来确定各参数值是否有误,从而帮你快速检查代码。

如何查看寄存器?本文采用一个非常简单的程序进行演示,如下图1所示

图1

按下F5,全速运行到第12行处,此行代码显示的是调用一个进行简单加法的运算。

这里需要提及的是C/C++的函数调用约定,这是一个非常重要的概念,不懂的人一定要上网查看下win32下函数调用约定是什么意思,C/C++默认的调用约定是__cdecl,这种调用约定的其中一条是关于函数如何传参以及堆栈如何处理的问题,回到我们的例程,我们按下ALT+8进入反汇编,如下图2所示

图2

从上图我们可以看到,进入汇编代码后,我们按下ALT+5(也可到调试->窗口中看到),就可以看到寄存器窗口了,单步调试我们可以看到,程序首先将b送到寄存器EAX中,因此我们看到EAX的值变为2,然后把eax即b值压入堆栈中,同理,再把b送到ECX并压入堆栈(__cdecl调用约定规定传参从右至左依次压入堆栈),最后调用add函数,至于如何进入add调用下次再讲。这里我们就学会了查看寄存器了,至于其他寄存器变量分别代表什么意思,希望读者自己查阅相关资料,此处略去。

二、查看内存

查看内存是使用VS2010进行编码的一个非常基本的技能了,快速而准确地查看内存,可以帮助你准确分析代码中各变量的取值,以及存储状态,帮助你发现程序中的BUG,改进代码的健壮性。

如何查看内存?继续采用以上的例程进行说明,将程序F5到第13行,再单步到下一句

图3

按下ALT+6,此时我们可以看到内存1的窗口,我们从自动窗口中先找到指针p的地址,然后将地址复制到内存地址栏中,回车,即可看到此时地址中的值。内存窗口中左边的灰色值代表地址,右边则表示地址中存储的值。我们可以看到p地址对应的值为03,但后面还有000000跟着,其实因为我们存储的是一个整数值,需要4个字节存储,因此就算P中结果是3,也同样占用了4个字节。

这里还需要注意的一个概念是,大端法存储和小端法存储的概念。回到上面图中我们可以看出,内存地址从左至右,从上至下是依次增大的。我们这个值3其实正确的读法应该是从右至左读取的,即0x00000003,03是在最低位,而03也是存储在内存地址中的低地址中的,因此这是小端法存储,大端法则刚好相反。需要了解这方面更多信息的人,一定要上网查找更多资料多学习,本文就不再详述。
————————————————

vs中调试程序查看变量在内存中的内容的方法的更多相关文章

  1. Python如何查看变量在内存中的地址

    在python中可以用id()函数获取对象的内存地址. 用法: object = 1 + 2 object -- 对象

  2. Java变量在内存中的存储

    目录 Java变量在内存中的存储 成员变量 局部变量 总结 Java变量在内存中的存储 以下探究成员变量和局部变量在内存中的存储情况. package com.my.pac04; /** * @aut ...

  3. java中的各种数据类型在内存中存储的方式

    原文地址:http://blog.csdn.net/aaa1117a8w5s6d/article/details/8251456 1.Java是如何管理内存的 java的内存管理就是对象的分配和释放问 ...

  4. @清晰掉 C++ 中的 enum 结构在内存中是怎么存储的?

     C++ 中的 enum 结构在内存中是怎么存储的? C++ C++ 中的 enum 结构在内存中是怎么存储的?里面存储的是常量值吗?   关于占用内存的大小,enum类型本身是不占内存的,编译器直接 ...

  5. Tomcat启动时加载数据到缓存---web.xml中listener加载顺序(例如顺序:1、初始化spring容器,2、初始化线程池,3、加载业务代码,将数据库中数据加载到内存中)

    最近公司要做功能迁移,原来的后台使用的Netty,现在要迁移到在uap上,也就是说所有后台的代码不能通过netty写的加载顺序加载了. 问题就来了,怎样让迁移到tomcat的代码按照原来的加载顺序进行 ...

  6. 详解Python变量在内存中的存储

    这篇文章主要是对python中的数据进行认识,对于很多初学者来讲,其实数据的认识是最重要的,也是最容易出错的.本文结合数据与内存形态讲解python中的数据,内容包括: 引用与对象 可变数据类型与不可 ...

  7. python中变量在内存中的存储与地址关系解析、浅度/深度copy、值传递、引用传递

    ---恢复内容开始--- 1.变量.地址 变量的实现方式有:引用语义.值语义 python语言中变量的实现方式就是引用语义,在变量里面保存的是值(对象)的引用(值所在处内存空间的地址).采用这种方式, ...

  8. PHP变量在内存中的存储方式

    原文:http://www.phppan.com/tag/refcount/ 每门计算机语言都需要一些容器来保存变量数据.在一些语言当中,变量都有特定的类型,如字符串,数组,对象等等.比如C和Pasc ...

  9. JavaScript中的变量在内存中的具体存储形式

    栈内存和堆内存 JavaScript中的变量分为基本类型和引用类型 基本类型是保存在栈内存中的简单数据段,它们的值都有固定的大小,保存在栈空间,通过按值访问 引用类型是保存在堆内存中的对象,值大小不固 ...

随机推荐

  1. hak的使用

    autohotkey简称ahk 它是一款轻量级的脚本语言文件,它可以干任何事情,如做dnf的连发脚本,类似按键精灵的自动化点击,按键自动打开文件一系列事情,文件需要按照ahk自己的语言,实现自定义的脚 ...

  2. python写入excel(方式1)

    import xlsxwriter li=["张三","李四","王五","周六","王琪",&qu ...

  3. 36氪新风向 | 三个月估值普涨三倍,你未来的RPA机器人同事正在路上

    http://www.sohu.com/a/320208242_114778 2019 年 4 月,关注 RPA 赛道的投资人 Kevin(化名)就发现,仅仅过了一个春节,自己所在的早期基金已经投不起 ...

  4. 全球百大最有前景AI公司出炉,中国成独角兽最强诞生地

    https://new.qq.com/omn/20190210/20190210B0BVK2.html 硅谷最强智库之一的 CB Insights 日前发布 AI 100 2019 报告,在这 100 ...

  5. Chirp信号及其生成

    Chirp信号是一个典型的非平稳信号,在通信.声纳.雷达等领域具有广泛的应用. 简介 Chirp译名:啁啾(读音:“周纠”),是通信技术有关编码脉冲技术中的一种术语,是指对脉冲进行编码时,其载频在脉冲 ...

  6. java代码操作Redis

    1.导入需要的pom依赖 <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEn ...

  7. 开源项目 06 NPOI

    using NPOI.HSSF.UserModel; using NPOI.SS.UserModel; using NPOI.XSSF.UserModel; using System; using S ...

  8. 2-STM32+W5500+GPRS(2G)基础篇-(W5500-学习说明)

    https://www.cnblogs.com/yangfengwu/p/11220042.html 定版: 这一节先直接说明怎么把官方的源码应用在我做的这块开发板上 https://www.w550 ...

  9. 71: libreoj #10151 区间dp

    $des$ https://loj.ac/problem/10151 $sol$ 区间dp $f_{i, j}$ 表示区间 $[l, r]$ 合并的最大值 枚举中间点 $k$ $f_{i, j} =m ...

  10. Linux 磁盘的分区

    如果我们想在系统中新增一块硬盘,需要做什么呢? 1. 对磁盘进行分区,新建可用分区 2. 对该分区进行格式化,以创建系统可用的文件系统 3. 若想要仔细一点,可以对刚才新建好的文件系统进行检验 4. ...