
调试
imJaron
这个作者很懒,什么都没留下…
展开
-
调试技巧 vs2010 output
最近合作开发,代码已经完成了,但是一调试,错误一大堆,由于是合作开发,不确定是哪层的错误,得一步步得走,很是费时费力,平时调试的技巧用的不多,现在集中调试,结果有些手忙脚乱,效率也很低,所以在网上找了一些技巧,整理了一下,分享给大家。它们都很简单,却能帮我们节约大量的时间,希望对大家有帮助。 跳到当前光标处(Ctrl+F10) 我经常看到人们为了到达目标代码位置,而在程序中早早转载 2017-03-16 11:51:33 · 1237 阅读 · 0 评论 -
C# DEBUG 调试信息打印及输出详解
1.debug只在[debug模式下才执行](运行按钮后面的下拉框可选) 2.debug提供了许多调试指令,如断言 System.Diagnostics.Debug.Assert(false,"信息"); 将出现一个对话框 3.debug可以自定义监听器 (下例将信息存入磁盘文件) System.Diag转载 2017-03-16 11:56:15 · 1080 阅读 · 0 评论 -
Debug与Release版本的区别详解
Debug 和 Release 并没有本质的区别,他们只是VC预定义提供的两组编译选项的集合,编译器只是按照预定的选项行动。如果我们愿意,我们完全可以把Debug和Release的行为完全颠倒过来。当然也可以提供其他的模式,例如自己定义一组编译选项,然后命名为MY_ABC等。习惯上,我们仍然更愿意使用VC已经定义好的名称。 Debug版本包括调试信息,所以要比Release版本大很多(转载 2017-05-27 21:40:52 · 402 阅读 · 0 评论 -
安装与配置windbg的symbol(符号)
本篇是新手自己写的一点心得.建议新手看看.同时希望前辈多多指教.写这篇的动机:在网上找了一上午的windbg配置符号教程.楞是没找到详细的,都讲的太模糊而且互相抄袭.不适合新手看.终于靠自己的努力弄懂了一点,呵呵写出来新手们分享.安装与配置windbg的symbol(符号)第一步 是从 http://www.microsoft.com/ddk/debuggi转载 2017-08-23 20:54:27 · 1319 阅读 · 0 评论 -
Debug Knowledge Base
符号文件的重要性编译器将源代码编译成二进制代码,所产生的符号文件就相当于代码行和二进制的中间解释器。以下都离不开符号文件的帮助: 1. 设置断点,相当于将源代码行的行号转换成对应的机器代码的地址; 2. 相反的,查看程序堆栈,就是调试器使用映射关系将堆栈里面的地址转换成包含这个地址的函数名。 3. 对于机器来说,所有的变量都只是一个内存地址,程序在读取变量值的时候,只不过按照变转载 2017-08-23 21:03:39 · 398 阅读 · 0 评论 -
WinDbg 入门教程
介绍在我的职业生涯中,我看到我们大多数都是使用Visual Studio来进行调试,而不是用其它许多免费的调试器。你可能有许多理由来使用这样的调试器,比如,在你家里的机器上没装开发环境,但是一个程序一次次的崩溃。其实根据堆栈的dump就可以判断出IE的崩溃是否是由于一个第三方的插件。对于WinDbg,我目前为止还没有发现很好的快速入门的教程。这篇文章结合实例讨论了WinDbg的使用。我首先转载 2017-09-19 10:45:23 · 773 阅读 · 0 评论 -
WinDbg学习笔记一 - 安装,入门
这两年一直断断续续的在学些调试相关的东西,WinDbg是必备的强大工具。虽然现在还没到熟练掌握的程度,但是中间还是碰到了很多坑,在此记录下,以免忘记。同时希望能对看到的人有所帮助。安装:网上可以随便找到很多安装软件,根据自己的情况下载32位或者64位的。安装步骤非常简单,一步步按默认的装下去也可以。放一个64位的下载地址:http://download.youkuaiyun.com/dow原创 2017-10-31 14:50:21 · 686 阅读 · 0 评论 -
WinDbg学习笔记五 - 内存,寄存器
WinDbg也提供了一系列命令来访问内存跟寄存器。以之前调试的程序状态为例,来演示几个常用的命令。开始之前先介绍命令?,用来查看符号的值。比如?speed,则会显示出speed的值,即它的地址。左边是10进制的值,右边是16进制。可以看到当前的地址是0133f9b8.输入db 0133f9b8, 按字节来查看该地址的值。或者dw原创 2017-11-03 12:51:48 · 1396 阅读 · 0 评论 -
WinDbg学习笔记六 - 内核调试配置
内核调试可以分为三种情况: 本机内核调试,双机内核调试 - 真机双机内核调试,虚拟机双机内核调试。本篇将介绍本机内核调试以及虚拟机内核调试的配置。本机内核调试配置:本机内核调试功能比较单一,只能读写内存,没有基本的单步断点等功能, 可以主要用来查看系统内核信息。目前主要是通过WinDbg自带的kldbgdrv.sys驱动调用nt!KdSystemDebugControl函数来提供支原创 2017-11-07 16:12:45 · 910 阅读 · 0 评论 -
一句话总结Windbg 32位版本和64位版本的选择
用惯了Vsiual Studio的兄弟们可能会因为先入为主的原因以为所有的调试器都应该像它那样,其实不然,当你安装Debugging Tools for Windows的时候,你将发现有两个系列的工具,一系列32位的工具和一系列64位的工具。这让人觉得和费解,因为在我们安装Microsoft Visual Studio的时候你根本不需要考虑32位还是64位。如果你正使用wind转载 2017-10-31 14:58:03 · 487 阅读 · 0 评论 -
WinDbg学习笔记二 - 第一个例子,以及常用窗口
下面我们来做一个非常简单的例子,来感受一下WinDbg的使用,以及里面常用的窗口。首先,在VS里创建一个C++的命令行程序DebugSample, 代码如下,然后打开项目的属性窗口,选择Linker -> Debugging, 将Generate Map File改成Yes, 这样在Link的时候会生成map文件。Build这个项目。原创 2017-11-01 14:33:55 · 963 阅读 · 0 评论 -
WinDbg快捷键
命令窗口中:上下方向键: 查找之前的命令TAB键: 自动补齐命令ENTER键:重复上一条命令ESC:清空当前命令原创 2017-11-02 13:07:09 · 751 阅读 · 0 评论 -
WinDbg学习笔记三 - 简单调试
WinDbg提供了大量的调试操作,可以分为g开头,p开头和t开头的三大类。其中g类主要用来直接运行目标,p类和t类则是单步执行,不同的是t类会调试到call指令的内部。常用的操作跟其他IDE差不多,F5直接运行,F10,F11单步执行。WinDbg里的单步有俩种,一种跟其他IDE一样的功能,单行调试代码,另外一种则是汇编模式下的单指令执行。可以通过l-t来打开汇编模式,或者l+t来原创 2017-11-02 13:19:21 · 487 阅读 · 0 评论 -
WinDbg学习笔记四 - 断点
WinDbg提供了多种方式跟命令来设置断点,以bp及查看跟管理断点。bp, bl, bc以及通过界面操作之前都介绍过,这里将不再详述。这里将主要介绍bd, be, bu命令。bd: 禁用breakpointbd * 所有bd num1,num2 禁用1,2禁用后的效果如下,be: 启用breakpoint, 格式类似于bdbu命令表示设置未定原创 2017-11-03 09:32:35 · 711 阅读 · 0 评论 -
软件调试笔记1 - 软件调试基础: 分类,调试技术概览
分类:软件调试有多种分类方法。按调试目标的系统环境分 - Windows下调试,Linux下调试,DOS下调试等等。按目标代码执行方式分 - 脚本调试(不需要编译的语言),需要编译的又分位俩种 - 1. 先编译为中间代码,在运行时候再动态编译成目标代码的,称为托管调试,2. 直接编译和链接成目标代码的,称为本地调试。两种混合起来i一起调试的叫混合调试。按目标代码执行模式分 - 用户原创 2017-11-17 17:05:20 · 1210 阅读 · 0 评论 -
WinDbg学习笔记七 - 内核调试常用命令1 - 查看目标机
WinDbg提供了很多的命令来查看被调试对象的信息,将分别介绍以下的命令vertarget, dg, !cpuinfo, !pcr, !prcb, !idt, !running。vertarget: 查看目标机的基本信息,例如系统的版本,内核基址等等。!cpuinfo: 显示CPU信息!dg: 显示选择子的详细信息。!pcr: 显原创 2017-11-14 14:59:04 · 1393 阅读 · 0 评论 -
WinDbg学习笔记八 - 内核调试常用命令2 - 进程相关
!process: 查看进程信息,比如EPROCESS地址,进程ID,线程信息等等。!process 0 0: 用来显示进程列表以及每个进程的基本信息。也可以查看指定进程的信息,以下会显示863e6b60进程的基本信息,不加0则会显示具体的信息。!process -1 0则会显示当前进程的基本信息,也可以查找特定的进程,比如原创 2017-11-14 18:16:11 · 771 阅读 · 0 评论 -
WinDbg学习笔记九 - 内核调试常用命令3 - 线程相关
跟进程类似,WinDbg也提供了一系列查看线程,以及设置线程的命令。!thread: 显示线程信息,比如ID, 状态,堆栈,以及起始地址等等。!thread -1可以显示当前线程的信息。显示指定线程的信息,4C是一个线程ID。.thread: 设置线程上下文。不加任何参数,切换回中断时候的线程。原创 2017-11-15 15:04:14 · 1436 阅读 · 0 评论 -
WinDbg学习笔记十 - 内核调试常用命令4 - 内存
内存命令比较多,主要是对内存的查看修改。!address: 显示内存信息,比如内存的地址范围。!vm: 显示虚拟内存的信息。基本内存信息包括了物理内存大小,分页内存大小,页文件大小等等,按照页数跟KB数显示。如果驱动分配非分页内存失败,则可以通过检查非分页内存使用情况,查看当前是不是接近了最大值。在进程虚拟内存方面,按进程占用内存大小倒序排列,可原创 2017-11-15 15:57:42 · 1045 阅读 · 0 评论 -
软件调试笔记17 - 中断和异常管理
中断描述符表:当中断或者异常发生时,CPU是通过中断描述符表IDT来寻找处理函数的。是CPU与操作系统交接中断和异常的关口。操作系统在启动早期的一个重要任务就是设置IDT表,准备好处理异常和中断的函数。发生在0号CPU即BSP(bootstraap processor),BSP后面会初始化其他的AP (application processor),并复制一份IDT。异常分发机制:原创 2017-11-29 16:17:17 · 367 阅读 · 0 评论 -
软件调试笔记16 - 用户态调试过程:中断到调试器
几种典型的中断到调试器方法:1. 初始断点2. 编程时加入断点,比如用DebugBreak API等。3. 通过调试器设置断点4. 通过远程线程触发断点异常: 会在被调试进程里创建一个远程线程,这个线程一运行就会执行断点指令。5. 在线程当前执行位置设置断点:用现有的线程。 首先会将所有的线程挂起,然后取得每个线程的执行上下文,得到线程的程序指针寄存器的值,并在这个值对原创 2017-11-27 17:32:41 · 601 阅读 · 0 评论 -
软件调试笔记15 - 用户态调试过程:调试会话
调试会话有两种建立方式:从调试器启动被调试程序,附件到被调试程序。从调试器启动:就是在调用创建进程的API比如CreateProcess时指定DEBUG_PROCESS或者DEBUG_ONLY_THIS_PROCESS。前者是调试正在创建的进程以及子进程,后者不包括子进程。系统在创建进程的时候,如果发现包括这俩标志,则会把新创建的进程当作被调试程序,把调用进程当作调试器进程。并在创建过原创 2017-11-27 16:52:52 · 511 阅读 · 2 评论 -
软件调试笔记15 - 用户态调试过程: 调试器进程,被调试进程
线程模型:可以把调试器主要功能分成如下两个方面:1. 人机接口: 以某种界面的形式将调试功能呈现给用户,并监听和接收用户的输入,进行解析和执行。2. 与被调试进程交互:包括建立调试关系,然后监听和处理调试事件。一般调试器都是采用双线程模式。调试器工作流程:被调试进程:特征:DebugPort字段:调试端口是联系调试器和被调原创 2017-11-27 16:25:24 · 467 阅读 · 0 评论 -
软件调试笔记18 - 未处理异常和JIT调试
用户态转储文件:用户态转储文件User mode dump,用于保存应用程序在某一个时刻运行的二进制文件,又专门的API来创建与读取它。在很多文档中,用户态转储文件被称为MiniDump,小型的转储文件,但其实也可以包含完整内存数据的非常庞大的文件的。原创 2017-11-29 16:41:59 · 1549 阅读 · 0 评论 -
软件调试笔记19 - 硬错误
错误处理方案:硬错误提示:消息对话框是WINDOWS中最常见的即时错误提示方法。原创 2017-11-29 16:58:25 · 305 阅读 · 0 评论 -
软件调试笔记20 - 事件追踪
事件追踪的目标是把软件执行的轨迹以一种可以观察的方式输出,更关心软件的变化和运动过程,因为数据太大,所以它是以二进制格式存储的。默认情况下是关闭的。重要应用: WINDOWS系统提供了ETW (event tracing for Windows)一套完整的机制。以及一个基于这套机制的追踪内核事件的NT Kernel Logger(NT内核记录器),简称NKL。原创 2017-11-29 18:15:48 · 420 阅读 · 0 评论 -
软件调试笔记21 - WINDOWS验证机制
常见测试手段:虽然各种测试都有优势跟侧重点,但即使用了所有的手段,也不能保证会发现所有的问题,比如测试的时候运行环境和条件不足以将错误触发并暴露出来。所以WINDOWS系统提供了验证机制来满足这个需求。WINDOWS验证机制简介:从编译和构建角度,WINDOWS的系统映像文件有CHECKED和FREE版本,差别是CHECKED版本包含断言。但断言只是检查软件自身原创 2017-11-30 12:51:20 · 429 阅读 · 0 评论 -
软件调试笔记22 - WINDOWS验证机制 :使用应用程序验证器
验证项目:配置验证属性:配置验证停顿:编程调用:原创 2017-11-30 12:58:37 · 371 阅读 · 0 评论 -
软件调试笔记23 - 编译器的调试支持
编译器检查:编译过程中,检查代码的语法,以及可能存在的逻辑错误和设计欠缺,并以编译错误或警告的形式报告出来。运行期检查:在编译时产生并加入运行时检查功能,包括内存检查,栈检查等。内存分配和释放:使用内存的方法和策略关系到软件的性能,稳定性,资源占用等,因此如何降低内存使用的复杂度,减少因为内存使用导致的问题是编译器的一个重要指标。比如在编译调试版本时,编译器原创 2017-11-30 13:38:13 · 262 阅读 · 0 评论 -
软件调试笔记24 - 编译器的调试支持 :程序构建过程
一个源程序,首先会见过编译器compiler编译为等价的汇编语言模块,再经过汇编器assembler产生出与目标平台一致的机器码模块。尽快这个机器码模块包含的指令已经可以被CPU执行,但其中可能还包含没有解决的unresolved的名称和地址引用,因此需要链接器linker解决这些问题,并产生出符合目标平台要求的可执行模块。当程序执行时,操作系统的加载器loader会解读链接器记录在可执行模块的格原创 2017-11-30 14:51:36 · 310 阅读 · 0 评论 -
软件调试笔记25 - 编译器的调试支持 :编译
CL.exe:compiler driver编译推动器,当编译一个源程序时,只要执行它,就会一次调用前端后端,并在没有编译错误的情况下调用Link.exe进行链接操作。原创 2017-11-30 16:00:03 · 228 阅读 · 0 评论 -
软件调试笔记2 - CPU的调试支持概览
这里以英特尔IA结构CPU为例,其提供的调试支持有:1. IN3指令:又叫断点指令,当CPU执行到该指令时会产生断点异常,以便中断到调试器程序。它是软件断点的实现基础。2. 标志寄存器EFLAGS中的TF标志: 陷阱标志位,当为1时,CPU每执行完一条指令就产生调试异常,它是单步执行的实现基础。3. 调试寄存器DR0-DR7:用于设置硬件断点和报告调试异常的细节。4. 断点原创 2017-11-21 13:25:24 · 617 阅读 · 0 评论 -
Visual Studio 调试常用20个小技巧
技巧1: 异常中断在处理被调用之前,异常发生时可以启动调试器进行中断,可以让你在异常发生后立即调试程序。操作调用栈便于你去查找异常发生的根本原因。Vistual Studio允许你去指定想要中断的异常类型或者特殊异常。选择菜单Debug>Exceptions弹出对话框,你可以指定原生的(或者托管的)异常,除了调试器自带的一些默认异常,你还可以添加自己的自定义异常。下转载 2017-12-08 15:06:58 · 486 阅读 · 0 评论 -
如何让程序跑得更快些?——试试Visual Studio中的性能分析工具 (By Jun Guo)
咦,性能?我们又回到这个永恒的话题上了。Yep,大部分程序猿都对性能有着不懈追求。某国最喜欢“多快好省”,“多”和“省”我们是很难做到了,但让自己的程序跑得又快又好,则是我们最乐意干的活。干同样一件事情,别人的程序要跑1分钟,而自己的程序只要几秒钟,这是多爽的一件事啊(您打败了全国99%的程序猿……)! 不过,话虽然这样说,但实际操作起来,效率优化并不是件容易的事。时间复杂度是最转载 2017-12-08 15:16:34 · 1587 阅读 · 0 评论 -
性能调优攻略
关于性能优化这是一个比较大的话题,在《由12306.cn谈谈网站性能技术》中我从业务和设计上说过一些可用的技术以及那些技术的优缺点,今天,想从一些技术细节上谈谈性能优化,主要是一些代码级别的技术和方法。本文的东西是我的一些经验和知识,并不一定全对,希望大家指正和补充。在开始这篇文章之前,大家可以移步去看一下酷壳以前发表的《代码优化概要》,这篇文章基本上告诉你——要进行优化,先得找到性能瓶颈转载 2017-12-08 15:21:31 · 183 阅读 · 0 评论 -
C++程序常见的性能调优方式
冗余的变量拷贝相对C而言,写C++代码经常一不小心就会引入一些临时变量,比如函数实参、函数返回值。在临时变量之外,也会有其他一些情况会带来一些冗余的变量拷贝。之前针对冗余的变量拷贝问题写过一些帖子,详情请点击这里。 多重过滤很多服务都会过滤的部分结果的需求,比如游戏交谈中过滤需要过滤掉敏感词。假设现在有两个过滤词典,一个词典A内容较少,另一个词典B内容较多,转载 2017-12-08 15:25:54 · 221 阅读 · 0 评论 -
带你玩转Visual Studio——性能分析与优化
在商用程序的开发中,性能是一个重要的指标,程序的性能优化也是一个重要的工作。找到性能瓶颈二八法则适合很多事物:最重要的只占其中一小部分,约20%,其余80%的尽管是多数,却是次要的。在程序代码中也是一样,决定应用性能的就那20%的代码(甚至更少)。因此优化实践中,我们将精力集中优化那20%最耗时的代码上,这那20%的代码就是程序的性能瓶颈,主要针对这部分代码进行优化。常转载 2017-12-08 15:28:40 · 958 阅读 · 0 评论 -
常用性能分析工具
录top列含义vmstatprocsmemoryswapiosystemcpuuptimefreeiostatcpuDevicesarmpstatpmapnetstattcpdumpstracelsofproc文件系统转载 2017-12-08 15:29:27 · 837 阅读 · 0 评论 -
软件调试笔记26 - 编译器的调试支持 :编译错误和警告
编译过程中会产生错误或者警告,每个都会有一个唯一的标识符ID。每个标识符是以1个或者多个大写字母开头,后面跟4位数字,字母表示报告错误信息的组件,数字用来表示错误或者警告的原因。对于同一来源的错误,处于不同范围的ID对应不同的严重级别,分致命错误、错误和警告等。编译警告:原创 2017-11-30 17:17:42 · 309 阅读 · 0 评论 -
WinDbg学习笔记十一 - 内核调试常用命令5 - 对象相关
在系统中存在着各种各样的对象,所有资源都是以对象的形式存在的,比如文件对象,进程对象,线程对象。而大多数内核函数都会和对象管理器打交道。句柄是对象的上层的抽象,不同的句柄可以表示同一个对象,不同的进程可以有值相同的句柄。由句柄可以得到对象,由对象也可以生成一个句柄出来。跟对象相关的命令主要有handle, object。!handle: 主要用于显示句柄的信息,比如类型,名称等。可原创 2017-11-16 14:30:51 · 466 阅读 · 0 评论