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. 【python爬虫】动态html

    一.反爬策略 1.请求头 ——user-agent ——referer ——cookie 2.访问频率限制 ——代理池 ——再用户访问高峰期进行爬取,冲散日志.12-13 7-10 ——设置等待时长. ...

  2. ora-00054资源正忙,但指定以nowait方式

    select l.session_id,o.owner,o.object_name from v$locked_object l,dba_objects o where l.object_id=o.o ...

  3. Git学习笔记--实践(三)

    文中红色的文字(标为:## 插曲)是在Git学习/实践过程中,我个人遇到的一些问题,每个“## 插曲”之后,都有相应的解决方案. 一.创建版本库 版本库又名仓库,英文名repository,可简单的理 ...

  4. LeetCode 826. Most Profit Assigning Work

    原题链接在这里:https://leetcode.com/problems/most-profit-assigning-work/ 题目: We have jobs: difficulty[i] is ...

  5. 个人Vim配置(即vim目录下vimrc_)

    因为是C++选手所以大部分带有Dev遗留的...格式 colorscheme molokai"配色方案,注意molokai不是自带而是自己调配的,SublimeText3标准配色,想要的点这 ...

  6. com.netflix.client.ClientException: Load balancer does not have available server for client:xxx

    重启一个web模块,刷新页面报错, 负载均衡器没有可用的服务器给客户端:在网关添加. ribbon: eureka: enabled: true

  7. vue+element 表格导出Excel文件

    https://www.cnblogs.com/bobodeboke/p/8867481.html  非常感谢 这个大佬 才让我搞到了Blob.js 和 Export2Excel.js 如果最后运行时 ...

  8. HAProxy+Keepalived高可用负载均衡

    一 基础准备 1.1 部署环境及说明 系统OS:CentOS 6.8 64位 HAProxy软件:HA-Proxy version 1.5.18 Keepalived软件:keepalived-1.3 ...

  9. 前端VScode推荐插件

    Auto Close Tag 自动添加HTML / XML关闭标签 Auto Rename Tag 自动重命名配对的HTML / XML标签 Beautify 格式化代码 [必须]Bracket Pa ...

  10. OpenFOAM——具有压差且平行平板间具有相对运动流动

    本算例翻译整理自:http://the-foam-house5.webnode.es/products/chapter-1-plane-parallel-plates-case/ 这个算例中两平板间具 ...