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调试笔记的更多相关文章

  1. Tomcat调试笔记

    调试笔记 在使用Tomcat过程中经常碰到问题,导致tomcat启动失败.如下↓ 由于报错太过笼统,我根本无法找出错误.后来我切换到Console视图下,看到了如下错误信息. 根据报错信息,错误原因是 ...

  2. 孙鑫VC学习笔记:多线程编程

    孙鑫VC学习笔记:多线程编程 SkySeraph Dec 11st 2010  HQU Email:zgzhaobo@gmail.com    QQ:452728574 Latest Modified ...

  3. JavaScript特效(调试笔记)

    JavaScript特效 一.在网页上显示当前的时间日期,例如:“2016年3月26日 星期六”. js源代码: function getTime() { var today = new Date() ...

  4. VC++ 学习笔记(序):神一样的语言

    总的来说,我觉得VC++是一门神一样的语言——它是公认最强大.最复杂的:它一切以效率为第一要务,却又不肯落伍,拼命兼容现在的新的语言设计特点.本来在别的语言很容与就避开的问题,在这里要用很高的技巧去设 ...

  5. USB wifi调试笔记

    本文以realtek 8192CU WiFi模块为例,介绍USB wifi在Jelly Bean 4.1的调试笔记. 1.WIFI打不开现象概述 WiFi打不开是指您在UI的settings下选中Wi ...

  6. VC++调试说明

    目录 第1章调试说明    1 1.1 调试设置    1 1.2 跟踪代码    2 1.3 断点    2 第2章模块生命周期    4 2.1 exe模块    4 2.2 dll模块    5 ...

  7. VC调试篇

    难怪很多前辈说调试是一个程序员最基本的技能,其重要性甚至超过学习一门语言.不会调试的程序员就意味着他即使会一门语言,却不能编制出任何好的软件. 我以前接触的程序大多是有比较成形的思路和方法,调试起来出 ...

  8. VC++调试基础

    一.调试基础 调试快捷键 F5:  开始调试 Shift+F5: 停止调试 F10:   调试到下一句,这里是单步跟踪 F11:   调试到下一句,跟进函数内部 Shift+F11:  从当前函数中跳 ...

  9. gdb对应vc调试命令

    gdb vc调试对照表: 实现功能                vc                   gdb 修改后编译              f7                   ma ...

随机推荐

  1. JavaScript 字符串函数 之查找字符方法(一)

    1.JavaScript查找字符方法   首先看一张 有关字符串函数的查找字符的方法图 接下里补充里面的方法说明 2.charAt()     charAt() 方法返回字符串中指定位置的字符 语法 ...

  2. 在struts2的action中操作域对象(request、session)

    在struts2的Action中,操作域对象一共有三种方式: 1.ActionContext(与servelt API无关联): //相当于request ActionContext.getConte ...

  3. 老生常谈的Javascript作用域问题

    在前端学习中,作用域这个问题一直被广泛提起,什么是作用域,什么又是作用域链?在Javascript中,怎么去理解这些概念都是学好这门语言的关键,所以在学习前端开发的过程中,我需要也很有必要去学习和总结 ...

  4. 未能加载文件或程序集“System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”

    最近用vs2012发布程序,然后将更新后的程序文件部署到服务器上,由于服务器上本来有此系统,所以只更新了修改的文件 . 进行系统登录时提示:未能加载文件或程序集“System.Web.Extensio ...

  5. document 例子

    <!DOCTYPE html> <html> <head> <title></title> <script type="te ...

  6. Android SQLite API的使用(非原创)

    1.使用SQLite的API来进行数据库的添加.删除.修改.查询 package com.example.sqlitedatabase.test; import android.content.Con ...

  7. java NumberForMate的使用

    有时候我们需要将数字转化为字符串,并且转化后的长度要一定.比如00012这种类型.这时候我们就可以使用NumberForMate这个方法: NumberFormat numberFormat = Nu ...

  8. web并发访问的问题

    一般的webapplication,可能会遇到这样的问题,你可以这样模拟:用浏览器开一个窗口,选中一条记录,编辑之,但是先不要保存,新开一个浏览器窗口,找到这条记录,删除之,然后再回到第一个窗口点击保 ...

  9. 读取Webpage表中的内容

    nutch将从网页中抓取到的信息放入hbase数据库中,默认情况下表名为$crawlId_webpage,但表中的内容以16进制进行表示,直接scan或者通过Java API进行读取均只能读取到16进 ...

  10. javaweb分页思想

    web上的分页分析   在web编写中的经常会遇到,数据需要分页的情况.当数据量不是很大的时候.   可以直接使用js来分页.可以很好的提高性能.简化代码.数据量大的时候.还是需要使用java的分页类 ...