VC调试笔记
1、windows-32调试:
①使用map文件根据崩溃地址寻找对应的源代码文件和行号
勾选project->settings->link->General mapfile,对应的Project Options中添加:/MAPINFO:LINES /MAPINFO:EXPORTS 。 在不使用优化且没有多dll引用导致的重定向时,崩溃地址寻找对应的代码行的方法:崩溃地址=装载机地址(0x10000000)+PE头文件大小(0x00001000)+RVA值,这个RVA值在生成的map文件中形如“
Line numbers for .\Debug\KillerDLL.obj(C:\Users\Administrator\Desktop\WindowDebug2\KillerDLL\KillerDLL.cpp) segment .text
13 0001:00000030 14 0001:00000048 15 0001:0000004d 19 0001:00000060
21 0001:00000082 24 0001:000000a0 25 0001:000000b8 27 0001:000000c6
29 0001:000000e4 30 0001:000000ec 33 0001:000000ee 34 0001:00000103
37 0001:00000105 38 0001:0000010c 39 0001:00000116 43 0001:00000118
44 0001:00000128 45 0001:0000012f 48 0001:00000138
”
内冒号右边的值时,对应最左边的即为对应行号
②使用PDB文件找对应的源代码文件和行号
打开反汇编窗口,Edit->goto->address即可找到对应的汇编代码,右键,goto source即可找到源文件和行号
③使用Dr.Watson调试:C:\Windows\System32\DRWATSON.EXE (未完)
双击会在Windows目录生成drwatson.log文件,监控可能报错的程序
2、使用VC的编辑继续调试
1)调试版本->C/C++->General->Debug info里选择Program Database for Edit and Continue,同上,要保证所有的优化关掉
2)link->Customize选择Link incrementally
3)Debug->Debug commands invodke Edit and Continue
配合使用set next statement功能:该命令通过修改指令指针寄存器(EIP)的值设置下一条将被执行的指令。它不修改堆栈,不执行任何代码、不创建或释放任何变量。
使用限制:以下修改是调试期间不支持的:
对资源文件的修改
对只读文件里代码的修改
对优化代码的修改
对处理异常代码的修改
对数据类型的修改,包括类、结构、联合以及枚举
增加新的数据类型
对函数原型的修改,包括函数名、参数、调用协议以及返回值
函数的删除
对全局或者静态代码的修改
对不是局部编连的可执行文件的修改
在活跃(active)函数里增加新的变量时,还有个总的变量长度不超过64字节的限制
3、发布版本中包含调试代码,但是不希望影响程序的性能:
if(IsDebuggerPresent())//如果调试器正在执行
PerformTimeConsumingDebugCheck();//这函数的具体意思?
4、使用键盘动态激活调试代码
#ifdef _DEBUG
//filter data only when the contorl key is pressed
if(GetAsynKeyState(VK_CONTROL) < 0 && data[i].x != 42)
continue;
#endif
VC调试笔记的更多相关文章
- Tomcat调试笔记
调试笔记 在使用Tomcat过程中经常碰到问题,导致tomcat启动失败.如下↓ 由于报错太过笼统,我根本无法找出错误.后来我切换到Console视图下,看到了如下错误信息. 根据报错信息,错误原因是 ...
- 孙鑫VC学习笔记:多线程编程
孙鑫VC学习笔记:多线程编程 SkySeraph Dec 11st 2010 HQU Email:zgzhaobo@gmail.com QQ:452728574 Latest Modified ...
- JavaScript特效(调试笔记)
JavaScript特效 一.在网页上显示当前的时间日期,例如:“2016年3月26日 星期六”. js源代码: function getTime() { var today = new Date() ...
- VC++ 学习笔记(序):神一样的语言
总的来说,我觉得VC++是一门神一样的语言——它是公认最强大.最复杂的:它一切以效率为第一要务,却又不肯落伍,拼命兼容现在的新的语言设计特点.本来在别的语言很容与就避开的问题,在这里要用很高的技巧去设 ...
- USB wifi调试笔记
本文以realtek 8192CU WiFi模块为例,介绍USB wifi在Jelly Bean 4.1的调试笔记. 1.WIFI打不开现象概述 WiFi打不开是指您在UI的settings下选中Wi ...
- VC++调试说明
目录 第1章调试说明 1 1.1 调试设置 1 1.2 跟踪代码 2 1.3 断点 2 第2章模块生命周期 4 2.1 exe模块 4 2.2 dll模块 5 ...
- VC调试篇
难怪很多前辈说调试是一个程序员最基本的技能,其重要性甚至超过学习一门语言.不会调试的程序员就意味着他即使会一门语言,却不能编制出任何好的软件. 我以前接触的程序大多是有比较成形的思路和方法,调试起来出 ...
- VC++调试基础
一.调试基础 调试快捷键 F5: 开始调试 Shift+F5: 停止调试 F10: 调试到下一句,这里是单步跟踪 F11: 调试到下一句,跟进函数内部 Shift+F11: 从当前函数中跳 ...
- gdb对应vc调试命令
gdb vc调试对照表: 实现功能 vc gdb 修改后编译 f7 ma ...
随机推荐
- LoadRunner监控windows资源报错Monitor name :Windows Resources. Cannot connect to machine
目标机:被监控的机器,windows server 2008 R2. 测试机:执行control的机器,windows7 操作:在测试机上执行Control,添加windows的监控 问题现象:Mon ...
- android码农神器 偷懒工具 android懒人框架 LoonAndroid 3 讲解
LoonAndroid 3.0 Loonandroid是一个注解框架,不涉及任何UI效果,目的是一个功能一个方法,以方法为最小颗粒度对功能进行拆解.把功能傻瓜化,简单化,去掉重复性的代码,隐藏复杂的实 ...
- 从字节理解Unicode(UTF8/UTF16)
如果你不知道或者不了解什么是Unicode/UTF8/UTF16,请详细阅读这篇文章(这也是这篇博文的先决条件): 学点编码知识又不会死:Unicode的流言终结者和编码大揭秘 但是如果你看完以上文章 ...
- Lucene文件扩展名
名称 文件后缀 描述 段文件(Segments File) segments.gen segments_N 存储提交点信息 锁文件(Lock File) write.lock 用来阻止多个indexW ...
- poj3659树状DP
Cell Phone Network Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6273 Accepted: 225 ...
- 【7】用Laravel5.1开发一个简单的博客系统
声明: 本教程参考Jeffrey way 在laracasts.com上的视频教程,感谢Jeffrey way为大家带来的精彩教程,本教程如有侵权,请及时告知,联系邮箱wanglv93@gmail.c ...
- 512M内存机器如何用好Mysql
购买阿里云512M内存ECS后,mysql有时候会自动关闭,停止运行 解决办法: a,优化mysql配置,因为自己安装的是mysql 5.6,而从5.6开始,mysql安装包中不再包含my-small ...
- [Mugeda HTML5技术教程之17] 理解Mugeda访问统计结果
1. 功能简介 Mugeda提供动画统计功能,使得动画制作者可以直观的了解动画的浏览情况,包括浏览量,参与度,以及观看者的分布情况. 目前统计功能主要展示动画内容和广告工程的统计数据.在动画被发布或导 ...
- 怎么在网页中加入ICO图标
1.首先制作一个16x16的icon图标,命名为cssbbs.ico(这里的名字可以随便改!),放在根目录下.2.然后将下面的代码嵌入head区:<link rel="icon&quo ...
- js各种进制数之间的转换
计算机中常用的进制数有二进制.八进制.十进制.十六进制 一.十进制 to 其他 var x = 10; // 或定义其他值均可 x.toString(n); // n 代表要转换到的进制,比如n可以为 ...