摘要:软件 的调试 也称纠错或排错 , 它是孤立并纠正错误的一种技巧性过程 。 软件错误的外部表现形式与内部 原 因之间往往没有 明显 的联系 , 所 出现的差错并非直接就能找 出原 因 。 因此 , 调试 既要对 错误 的性 质及 程序 本身进 行系统的研 究 , 在某种程 度上也要靠直觉与经验 。 到
阅读全文
摘要:1 引 言 软件规模 日趋庞大 , 软件调试 中 , 发现 、 定位、分析错误的工作量也相应增长 。 因此 , 人们 开发 了 C o d e iV e w 等调试工具以 深 入错 误发 生时的程序执行环 境 , 使效率大增 。 不过对于 下 面的循环结构 ( 以 C 语言为例 )仍有为难之处 :
阅读全文
摘要:在看代码之前我们先连简单的看下try的处理流程吧 函数入口设置回调函数 函数的异常抛出使用了__CxxThrowException函数,此函数包含了两个参数,分别是抛出一场关键字的throw的参数的指针,另一个抛出信息类型的指针(ThrowInfo *)。 在异常回调函数中,可以得到异常对象的地址和
阅读全文
摘要:随着计算机技术的飞速 发展和普及 , 越来越多的人直接与计算机打交道 , 因而产生 了研 究计算机操作者心理状态 的一 门综合性很强的边缘交叉科学 - 一软件心 理学。 软件心 理学 把实验心 理学 的技术和 认知心理学的概念应用于 计算机和信息科学 , 它 主要研究了计算机 科学 中人机系统和软件
阅读全文
摘要:弗雷德里克·布鲁克斯( F r e d e r i c k P·B r o o ks ) 博士在他那篇著名的《没 有 银弹— 软件工程 中的根本和次要问 题》 一文 中 , 将软件项目比作可怕的人狼 (w e r e w o l v e s ) , 并大胆地预言十年内不会 找到特别有效 的银 弹 。
阅读全文
摘要:在硬 件可靠性 理 论 中 , 典 型 的失效 率 又( t ) 函 数是 一条 形 似“ 浴 盆” 的曲线 。 浴 盆 曲线 由三 段 构成 : 早 期故 障期 、 偶 然故 障期 、 耗损 故 障期 。 这种 曲线描 述 了事物 生命期 的 整个过 程 , 而 且具 有普遍 性 。 对 软件来
阅读全文
摘要:Diomidis Spinellis是《代码阅读与代码质量》一书的作者。在GOTO阿姆斯特丹2016大会上,他就如何有效地调试软件和预防错误做了演讲。InfoQ采访了Spinellis,内容涉及发现和修复软件中的错误、软件调试的原则、如何提高调试效率、如何编写出不怎么需要调试的代码以及管理人员如何为
阅读全文
摘要:静态变量可以分为全局静态变量,和局部静态变量,先来说说全局的吧。全局静态变量和全局变量的区别并不大,只是全局静态变量只能在当前文件中使用,而在反汇编中二者并无区别,只可以在当前文件中使用,不过是编译器做出的限制。局部静态变量,会有些特殊,它不会随着作用域结束而消失,在未进入作用于之前就已经存在。局部
阅读全文
摘要:转自:https://bbs.pediy.com/thread-183180.htm 如果想要制作一个CPU,首先得明白下计算机的组成结构(或者计算机的替代品,因为并不是只有计算机有CPU,现在的电子产品都很先进,很多设备例如手机、洗衣机甚至电视和你家的汽车上面都得装一个CPU),数字电路基础,还最
阅读全文
摘要:调试符号文件(pdb)是一种很复杂的文件,由于这种文件格式微软并不公开,所以至今为止,并没有一篇文章或资料敢说自己对pdb文件进行了深入剖析。更重要的原因是,我们为了研究调试技术,需要知道一些系统(操作系统,编译器,连接器,调试器等)调试支持,仅仅知道即可,没必要深究微软为了实现调试而做出的每一个细
阅读全文
摘要:这就个规则来自于书籍《调试九法:软硬件错误的排查之道》,记录下来: 规则1:理解系统 你必须掌握系统的工作原理以及它是如何设计的,在某些情况下还要知道为什么这样设计。如果你没有理解系统中的某个部分,那么这通常是出问题的地方。(这不仅仅是墨菲定律的问题,如果你不能理解你所设计的系统,你的工作可能会变得
阅读全文
摘要:转自:https://blog.csdn.net/sinat_35360663/article/details/80176269
阅读全文
摘要:调试的关键在于推断程序内部的错误位置及原因,可以采用以下方法: 1、分析和推理 设计人员和开发人员根据软件缺陷问题的信息, 分析和推理调试软件。 (1)根据软件程序架构自顶向下缩小定位范围, 确定可能发生问题的软件组件。 (2)根据软件功能,软件运行时序定位软件问题。 (3)根据算法原理,分析和确定
阅读全文
摘要:软件调试和版本管理的关系非常密切: 在软件调试过程中可能有多种算法都可达到 预期的目标,但只能选择其中一种,这时需要保留各种 有价值的算法版本;软件调试完成后,需要进行代码优 化,在代码优化的过程中需要保留各种不同的版本;软 件调试完成后,需要增加功能和提升性能,在此基础上 开展下一步调试工作,需要
阅读全文
摘要:在我们对某个问题进行调试前一定要做足准备工作,不然后面的调试工作会面临极大的困难,甚至都无法开展调试工作。 必须要做的准备工作 不管我们是在开发期调试,还是在发布后调试,都要做好如下准备工作: 充足的心里准备这个太重要了,在实际工作中,我见到太多被问题吓怕的人。在还没整清楚问题是什么时就已经打了退堂
阅读全文
摘要:在日常工作中,我们还是有些原则要坚守,也有些策略可用: 1、调试的本质:确认原则 修正充满错误的程序,就是逐个确认,你自认为正确的许多事情所对应的代码确实是正确的。当你发现其中某个假设不成立时,就表示已经找到了关于程序错误的位置的线索了,可能并不时准确的位置。 换一种表达方式来说:惊讶是好事。当你认
阅读全文
摘要:根据软件代码规模,应用软件的开发大致分为三 种模式。 程序员个人开发的小软件 用例图 这种模式和早期的软件开发模式类似。 小软件开发用例图如图所示。 软件调试的特点 发现问题(测试)、定位问题和提出解决问题方 案、修改程序代码、验证全部由程序员负责。 软件调试 可以分为静态调试与动态调试。 1、静态
阅读全文
摘要:软件调试的概念 软件调试是泛指重现软件缺陷问题,定位和 查找问题根源,最终解决问题的过程。 软件调试通常有如下两种不同的定义: 定义1:软件调试是为了发现并排除软件程序中 的错误,可以通过某种方法控制被调试程序的执行过 程,以便随时查看和修改被调试程序执行状态的方法。 在该定义中,软件测试属于软件调
阅读全文
摘要:前言 最近看完PN结和三极管的科普视频,有一件事没想通。对于NPN型三极管,工作在放大状态时,发射结正偏,集电结反偏。那么问题来了,集电结反偏时,为什么还会产生集电结->发射结的电流?为了搞清楚这个问题,在网上查了一些资料,并综合自己的理解写下了这篇博客,以备自己以后查阅,同时分享给有同样疑问的人,
阅读全文
摘要:在 WinDbg 中,源窗口显示已加载到调试器中的源文件。 如何打开源代码窗口 通过菜单File >Open Source File打开源代码文件,窗口随之打开 通过快捷键Ctrl+O 通过工具栏 设置源路径,调试器实时自动打开 使用源代码窗口 通过上面方式打开的窗口如下: 每个源窗口都显示一个源文
阅读全文
摘要:窗口切换 可以使用以下键盘快捷方式窗口之间进行切换。 项效果 CTRL+TAB 调试信息窗口之间切换。 通过重复使用此密钥,你可以扫描通过的所有窗口,而不考虑是否浮动、 停靠本身,或选项卡式停靠窗口的集合的一部分。 Alt+Tab 目前,在您的桌面上的窗口之间切换。 此外可以使用此键盘快捷方式的 W
阅读全文
摘要:命令浏览器窗口显示并存储调试器命令的文本结果。此窗口创建命令引用,使您可以查看特定命令的结果,而无需重新输入该命令。命令浏览器窗口还提供了对存储的命令的导航,因此您可以比使用调试器命令窗口更快地访问命令。 命令浏览器的打开 通过菜单Veiw >Command Browser 通过快捷键Ctrl+N
阅读全文
摘要:“便笺簿”窗口是一个剪贴板,您可以在其中键入和保存文本。 打开便笺簿 通过菜单View >Scratch Pad 通过快捷键Alt+8 通过工具栏 使用便笺簿 用上面的方式打开的窗口如下: 在草稿板窗口中,可以执行以下操作: 若要在草稿板窗口中键入,单击窗口,然后开始键入的你想要添加的文本。 此外可
阅读全文
摘要:在 WinDbg 中,可以查看和编辑内存,通过输入命令或通过使用内存窗口。 内存窗口的打开 通过菜单View-->Memory 通过快捷键Alt+5 通过工具栏 使用内存窗口 通过上面方式打开的窗口如下: 内存窗口显示多个列中的数据。 在窗口的左侧列显示每个行的开始地址。 其余列显示所需的信息,从左
阅读全文
摘要:在 WinDbg 中,进程和线程窗口中显示有关系统、 进程和线程正在调试的信息。 此窗口还可选择新的系统、 进程和线程处于活动状态。 如何打开进程和线程窗口 通过菜单View >Processes and Threads 快捷键Alt+9 通过工具栏 使用进程和线程窗口 通过上面的方式打开的窗口如下
阅读全文
摘要:寄存器是位于在 CPU 的小易失性内存单位。 许多寄存器专用于特定用途,并可用于用户模式应用程序使用的其他寄存器。 基于 x86 和基于 x64 的处理器在有可用的寄存器的不同集合。 如何打开寄存器窗口 通过菜单View >Registers 通过快捷键Alt+4 通过工具栏 寄存器窗口 通过上面方
阅读全文
摘要:在WinDbg中,可以通过输入命令、使用“局部变量”窗口或使用“监视”窗口查看局部变量。局部变量窗口显示当前作用域中的本地变量的所有信息。 如何打开Locals窗口 通过菜单View >Locals 通过快捷键Al+3 通过工具栏 局部变量窗口 通过上面的方式打开的窗口如下: 局部变量窗口可以包含四
阅读全文
摘要:在WinDbg中,可以使用“监视”窗口显示和更改全局和局部变量和寄存器信息。 您可以自定义此窗口以显示您正在跟踪的项。。“监视”窗口可以显示所需的任何变量列表。这些变量可以包括来自任何函数的全局变量和局部变量。任何时候,“监视”窗口都会显示与当前函数范围匹配的变量值。也可以通过“监视”窗口更改这些变
阅读全文
摘要:在WinDbg中,可以通过输入命令(u, ub, uu (Unassemble))或使用反汇编窗口查看程序汇编代码。 如何打开 DissAssembly Code窗口 通过菜单View-->Disassembly 快捷键Alt+7 工具栏按钮 DissAssembly窗口 通过上面的方式打开的窗口如
阅读全文
摘要:调用堆栈是指向程序计数器当前位置的函数调用链。调用堆栈的顶部函数是当前函数,下一个函数是调用当前函数的函数,依此类推。显示的调用堆栈基于当前程序计数器,除非更改寄存器上下文。 在 WinDbg 中,可以通过输入命令或通过使用Call Stack窗口中查看调用堆栈。 Call Stack窗口的打开方式
阅读全文
摘要:通过注册表设置:HKLM\SOFTWARE\Microsoft\Symbol Server Proxy\Web Directories\symbols下,设置SymbolPath,类型为REG_EXPAND_SZ。可以通过命令行直接添加: reg add "HKLM\SOFTWARE\Microso
阅读全文
摘要:来个样例 我的符号目录设置是: 用我们在windows下调试必须用到的ntdll.dll模块来讲下windbg加载符号文件的过程。windbg加载符号文件时,会首先根据配置的符号目录信息,在本地符号目录中查找对应的符号文件。一个典型的搜索过程如下:F:\Debug_Symbol\Symbols32\
阅读全文
摘要:当.NET程序有未处理的异常时,您可能会希望关闭出现的调试对话框。下面有两个选项: 1、启用JIT调试的注册表项 对于包含托管代码的应用程序,公共语言运行库将显示类似于JIT附加调试器的对话框。控制此选项的注册表项称为HKEY_LOCAL_MACHINE\Software\Microsoft\.NE
阅读全文
摘要:样例工程 在VS2013里新建一个C#控制台工程,写下如下代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; namespa
阅读全文
摘要:简介 EXCEPTION_HIJACK,值为0xe0434f4e。意思是CLR线程劫持异常。异常劫持是CLR在挂起线程进行垃圾收集的过程中抛出的。它的抛出是为了帮助停止后恢复执行。它定义在..\clr\src\inc\corexcep.h头文件里,如下: #define EXCEPTION_HIJA
阅读全文
摘要:WOW64(Windows-On-Windows 64bit)是X64 Windows操作系统的一个子系统,为32位应用程序提供运行环境。类似的还有WOW32子系统,负责在32位Windows系统上运行16位应用程序。 WoW64存在的原因还要从CPU的发展上开始说,X86指令集是一个指令集架构家族
阅读全文
摘要:因为CLR是一个托管环境,所以运行时中有几个组件需要在执行任何代码之前初始化。本文将介绍EE(执行引擎)启动程序,并详细检查初始化过程。68只是一个粗略的指南,它取决于您使用的运行时版本、启用了哪些功能以及其他一些东西。 样例代码 假设你有一个最简单的C#程序,在CLR将“Hello World”输
阅读全文
摘要:新建一个c#控制工程,就用自动生成的代码,不用补任何代码,如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 {
阅读全文
摘要:简介 CLRDBG_NOTIFICATION_EXCEPTION_CODE,值为0x0x04242420。此异常在.CLR 4.0的启动路径期间触发,是CLR4.0版本初始化调试服务时向调试器发送消息通知。个人认为这应该只在附加调试器时抛出。 详细说明 这实际上是一个未记录的异常(CLRDBG_NO
阅读全文
摘要:是否调试过应用程序并在输出窗口中看到有关“First Chance”异常的消息?有没有想过: 什么是First Chance Exception? 第一次机会异常是否意味着我的代码中存在问题? 在调试应用程序时,每当此时遇到异常,调试器就会收到通知,应用程序将挂起,调试器将决定如何处理异常。第一次通
阅读全文
摘要:什么是FormatException 参数格式无效或复合格式字符串不正确时引发的异常。 继承 Object Exception SystemException FormatException 详细说明 由于以下原因之一, 可能会引发异常:FormatException 在对将字符串转换为其他数据类型
阅读全文
摘要:什么是InvalidOperationException 操作无效异常。当方法调用对对象的当前状态无效时引发的异常。 继承 Object Exception SystemException InvalidOperationException 详细说明 如果调用方法失败是由无效参数以外的其他原因导致的
阅读全文
摘要:《根据《CLR Exception E0434352》和《CLR Exception E0434F4D》这两篇随笔,我们会发现,这两个异常太相似了,除了代码值不一样,其他几乎都一样。在windbg里调试dmp时,也会看到都叫它们CLR Exception。那他们有什么区别呢?这个问题值得研究研究。
阅读全文
摘要:我看到了一些关于Rotor(和CLR)中使用的异常处理机制的问题。下面是关于Rotor异常处理的另一个注意事项列表。目的是帮助Rotor开发人员调试和理解CLR中的异常。 异常生成和抛出 此步骤在很大程度上取决于异常的类型以及从何处引发异常: jitted代码中的软件异常 使用C#中throw ne
阅读全文
摘要:Windbg调试器的!htrace扩展对于调试泄漏处理非常方便。该过程基本上可归结为以下简单步骤: 启用跟踪 拍张快照 情景分析 显示差异 在第四步!htrace将在最后一个快照之后显示所有额外打开的句柄,以及调用堆栈(如果可用)。这大大有助于调试哪些句柄是泄漏的,以及由谁来处理。与其他任何资源泄漏
阅读全文
摘要:0×01 介绍 一些文章已经介绍过通过检测异常来对抗调试器的技术。这个思想很简单:根据设计本意,调试器会处理特定的异常。如果一个异常包裹在try块中,只有当没有附加调试器的时候,异常处理程序才会执行。因此,可以得出结论,只要异常块没有执行,那么程序就正在被一个调试器调试。 0×02 一个字节的Int
阅读全文
摘要:当我在别人的机器上调试问题时,我做的第一件事就是查看modules窗口。按版本排序并看到一个不属于的dll可以帮助立即诊断配置问题,并节省许多调试痛苦。 下面介绍下各列的意思: Name:模块名称。 Path:PE在文件系统上的位置。当您希望找到正确的PE以开始使用命令行工具进行查询时,这非常有用。
阅读全文
摘要:Visual Studio是一个很大的工具。很容易遗漏一些有用的特性。希望XSLT调试器不会错过。在下面,您可以看到调试器正在运行,因为xslt转换正在应用于某些XML。(请原谅我在示例中使用的毫无意义的XSLT。我有很长一段时间没有机会使用XSLT了。) XSLT调试对我来说很有趣,因为它大部分是
阅读全文
摘要:我想我不需要强调在调试时拥有有效的PDB文件有多重要。通常,PDB文件是由调试器静默加载的,并且您很高兴在modules窗口中看到解析的所有符号。不幸的是,您还可能遇到调试器找不到匹配符号的情况。其原因可能与断开的互联网连接或更复杂的签名不匹配一样微不足道。在本文中,我将向您展示如何在调试之前检查符
阅读全文
摘要:您是否想过Visual Studio 2008/2010在哪里存储从源服务器下载的源文件?默认情况下,它们会放在Local Settings\Applications Data\SourceServer下的主目录中。如果您使用两个不同的调试器,或者有多个用户使用您的计算机,则可能需要更改此位置。很遗
阅读全文
摘要:我最近花了一些时间分析OutputDebugString方法。在我的另一个实验中,我需要一个仅依赖于本机API的OutputDebugString版本。在实现它的过程中,我发现了一些关于OutputDebugString的有趣的事实,也许您也会感兴趣。 OutputDebugString的工作原理
阅读全文
摘要:我们都知道,UNIX只使用换行符(linefeed)来结束每一行,而DOS传统上使用CR+LF来结束每一行,Visual Studio应该完全在DOS世界中,但不管出于什么原因,当我们从代码服务器上获取代码后,我有时收到以下消息: 如果文件是从某个外部项目导入的,这是可以理解的,但是这个文件是由Vi
阅读全文
摘要:简介 DBG_PRINTEXCEPTION_C,代码0x40010006;DBG_PRINTEXCEPTION_WIDE_C,代码0x4001000A;在调试器的控制台窗口打印异常信息/调试信息。它定义在 ntstatus.h头文件里,如下: //// MessageId: DBG_PRINTEXC
阅读全文
摘要:最近在调试几个问题时,发现跟abort函数有关,以前只是简单使用,现在却发现不简单,就多留意了下。 简介 abort中止当前进程并返回错误代码。异常终止一个进程。中止当前进程,返回一个错误代码。错误代码的缺省值是3。 代码 /*** *abort.c - abort a program by rai
阅读全文
摘要:DML是一种非常简单的标记语言,它帮助基于现有命令的输出发现和执行新命令。许多WinDbg命令(以及扩展命令)都支持DML。例如,下面是lm D命令,它显示DML输出: 在上面的命令输出中,当我单击“SillyThreadPool”链接时,调试器为我执行了另一个命令lmDvmSillyThreadP
阅读全文
摘要:我知道你现在在想什么。断点?真的吗?关于断点有什么需要掌握的?你按F9然后停在代码行。如果你是这么想的,这篇文章是给你的:继续读 Visual Studio提供了一组相当丰富的断点类型和操作,可以使您的调试体验更加舒适和高效。我们将在这篇文章中讨论四种断点。 条件断点 定义断点时,可以将其与条件关联
阅读全文
摘要:真是个不可思议的巧合。仅隔几天,我就要解决两个与嵌套异常处理程序有关的问题。具体来说,导致堆栈溢出的嵌套异常的无限循环。这是一个非常致命的组合。堆栈溢出对于调试来说是一个极其严重的错误;嵌套异常意味着异常处理程序遇到了一个异常,这是不可能的;更糟糕的是,堆栈损坏也在幕后发生。请继续阅读以了解诊断嵌套
阅读全文
摘要:VMMap是一个很好的系统内部工具,它可以可视化特定进程的虚拟内存,并帮助理解内存的用途。它有线程堆栈、映像、Win32堆和GC堆的特定报告。有时,VMMap会报告不可用的虚拟内存,这与可用内存不同。下面是32位进程(总共有2GB虚拟内存)的VMMap报告示例: 这种“不可用”的内存从何而来,为什么
阅读全文
摘要:简介 STATUS_FATAL_APP_EXIT,值为0x40000015。代表的意思是"致命错误,应用退出"。它定义在 ntstatus.h头文件里,如下: //// MessageId: STATUS_FATAL_APP_EXIT//// MessageText://// {Fatal Appl
阅读全文
摘要:首先获取阻塞线程的调用栈 0:002> kbChildEBP RetAddr Args to Child 00edfdd8 7c90e9c0 7c8025db 0000026c 00000000 ntdll!KiFastSystemCallRet00edfddc 7c8025db 0000026c
阅读全文
摘要:转载https://www.anquanke.com/post/id/85493 0x00 前言 随着操作系统开发人员一直在增强漏洞利用的缓解措施,微软在Windows 10和Windows 8.1 Update 3中默认启用了一个新的机制。这个技术称作控制流保护(CFG)。 和其他利用缓解措施机制
阅读全文
摘要:为了说明这个过程,我们必须写一个示例程序,如下: #include "stdafx.h" #include <tchar.h> #include <stdio.h> #include <Windows.h> #pragma comment(lib, "user32") WNDPROC oldproc
阅读全文
摘要:简介 STATUS_FATAL_USER_CALLBACK_EXCEPTION,值为0xc000041d。代表的意思是"回调期间遇到未处理的异常"。它定义在 ntstatus.h头文件里,如下: //// MessageId: STATUS_FATAL_USER_CALLBACK_EXCEPTION
阅读全文
摘要:SOS扩展也是可以和VisualStudio进行集成的,这样真的方便了我们调试一些性能要求比较高的程序,当程序运行一段时间后我们用VS附加到进程,然后查看一些重要的对象数据,但是此时我们看不到.NET运行时的一些数据,比如:对象的代龄,托管堆的大小,线程池的任务等。通过集成SOS扩展会让我们对程序的
阅读全文
摘要:SOS.DLL、SOSEX.DLL这两个就是用来对.NET程序在Windows调试工具中起到翻译作用的调试器扩展。简单讲就是,这两个组件是.NET项目组专门开发出来用来对.NET应用程序进行方便调试用的,当然不用这两个扩展也能调试.NET程序,只不过就会很困难,会被很多细节束缚住。有了这个调试扩展之
阅读全文
摘要:简介 sx*命令控制调试器在正在调试的应用程序中发生异常或发生某些事件时采取的操作。 使用形式 sx sx{e|d|i|n} [-c "Cmd1"] [-c2 "Cmd2"] [-h] {Exception|Event|*} sx- [-c "Cmd1"] [-c2 "Cmd2"] {Excepti
阅读全文
摘要:大家都知道,在调试托管代码时,一定会加载到sos/clr/mscorwks/mscordacwks这些动态库,才能够很好的完成我们的调试工作,那么他们的版本对应关系是怎样的呢,特别是clr.dll/mscorwks.dll有什么关系呢? clr是通用语言运行时库,对应的就是clr.dll/mscor
阅读全文
摘要:简介 !runaway扩展显示有关每个线程使用的时间的信息。 使用形式 !runaway [Flags] 参数 Flags指定要显示的信息类型。 标志可以是以下位的任意组合。 默认值为 0x1。位 0 (0x1) 使调试器以显示每个线程使用的用户时间量。 位 1 (0x2) 使调试器以显示每个线程使
阅读全文
摘要:简介 !findstack扩展查找所有包含指定的符号或模块的堆栈。此命令搜索线程调用堆栈中的特定符号,并显示匹配的线程。 使用形式 !findstack Symbol[DisplayLevel] !findstack -? 参数 Symbol 指定符号或模块。 DisplayLevel 指定显示内容
阅读全文
摘要:简介 这个!uniqstack扩展扩展显示的所有线程的堆栈的所有当前进程,不包括显示为具有重复项的堆栈中。 使用形式 !uniqstack [ -b | -v | -p ] [ -n ] 参数 -b将导致显示以包括前三个参数传递给每个函数。 -v将导致显示以包括帧指针省略 (FPO) 信息。 在基于
阅读全文
摘要:下面是应用程序崩溃转储的调用堆栈。报告的崩溃是名为“HelperLibrary”的模块内的访问冲突,我们没有该模块的符号或源代码。调用堆栈看起来不太可能: 0:000> kv ChildEBP RetAddr Args to Child WARNING: Stack unwind informati
阅读全文
摘要:从前,非托管代码开发人员必须非常努力地将代码偏移量与源文件名和行号关联起来。一种方法涉及为每个模块生成.cod文件(程序集列表),然后费力地将指令偏移量与.cod文件的内容进行比较。例如,如果从具有客户机接收到错误BatteryMeter!TemperatureAndBatteryUpdaterTh
阅读全文
摘要:我们希望在WinDbg中自动显示、搜索和过滤std::map对象。std::vectors的脚本相对简单,因为vectors中数据的平面结构;map是更复杂的野兽。具体地说,Visual C++ STL中的映射是作为红黑树实现的。每个树节点都有三个重要的指针:左指针、右指针和父指针。此外,每个节点都
阅读全文
摘要:WinDbg从来都不擅长可视化。尽管Visual Studio一直都有autoexp.dat,而且最近还出现了本机调试器可视化工具,但WinDbg用户不得不满足于转储内存区域和搜索内存来识别模式。另一方面,如果希望简化调试过程,Visual Studio目前没有提供任何自动化机会。从Visual S
阅读全文
摘要:Windows错误报告是更新的Windows XP上Dr.Watson的替代品。它监视故障并收集可以发送到要分析的服务器(如果用户允许)的有用信息。这项功能帮助微软修复了很多错误——由于收到的报告,微软能够对错误进行优先排序(基于最大点击数或其他严重性度量),并解决了很多问题。真正酷的是,任何开发人
阅读全文
摘要:有时,当您调试应用程序时,会碰巧得到指向类的指针,该类只有几个成员变量,包括结构和其他类对象!如何看待内部类/结构变量成员的值??所以,这是提示。下面是用于演示命令的代码。 struct testStruct { int i; char ch; long l; char* str; }; class
阅读全文
摘要:问题是,我们要调试由其他应用程序运行的应用程序的启动代码!例如,我将打开一个控制台(cmd.exe),然后打开calc.exe,我想调试初始的calc.exe代码。。Windbg已经解决了这个问题!当您选择“打开可执行文件”时,您有一个小的复选框,上面写着“同时调试子进程”,它实际上确保所有由父EX
阅读全文
摘要:很多时候,在调试会话中,我们需要加载/重新加载特定模块的符号(在WinDbg的上下文中)。例如,我们开始调试,在调试时设置正常的符号路径并下载,发现我们需要特定模块的符号。我们修改符号文件路径。如果我们这样做了,.reload /f它从同一个位置再次加载所有符号,这可能需要时间。所以,只找到了加载一
阅读全文
摘要:如果您想查看任何windbg扩展所支持的命令,可以采用各种方法。 你可以用!<ext_name>.help命令查看该扩展支持的所有命令。用扩展模块名替换<ext_name>。(注意:只有特定扩展支持help命令时,此操作才有效。) 您可以在Dependency Walker中打开扩展DLL,它将在导
阅读全文
摘要:假设有一种情况,您从客户那里得到一个内存转储,需要模块(DLL、EXE、OCX等)来进一步调试。。(.NET模块可用于通过反向工程查看源代码。)我们可以使用windbg目录中的clr10\sos.dll保存所有模块(在获取内存转储时由目标进程加载)。有趣的是,sos.dll不仅可以提取托管模块,还可
阅读全文
摘要:刚才,我在Visual Studio 中发现了一个以更好的方式调试指针的技巧。您可以在监视窗口中选择“n”,其中“n”是要显示的元素数。我认为下图是不言而喻的。
阅读全文
摘要:我发现在代码中使用win32api时,需要多次监视最后一个win32错误!(在每次使用API后调用GetLastError()是不可行的解决方案!).. 在Visual Studio中,它们提供了一个非常好的小特性。你可以在“监视”窗口中写入@err,hr 同样,您可以使用另一个伪寄存器@eax来监
阅读全文
摘要:这是一个很常见的问题,我们几乎总是遇到。想象一下这样一种情况,我们从某个地方得到一个内存转储,想看看在那里运行的是什么操作系统,安装了什么SP。。为此,有一个非常简单的命令。 0:000> vertargetWindows 7 Version 7601 (Service Pack 1) MP (8
阅读全文
摘要:WinDbg、ntsd、cdb、kd和其他任何使用DbgEng打开转储文件的工具都有一个鲜为人知的特性。事实证明,使用DbgEng提供的任何功能,在任何可以打开转储文件(用户转储、内核转储等)的地方,都可以打开PE映像(.exe/.dll/.sys/etc),并让调试器将其视为只包含所选PE映像内容
阅读全文
摘要:当你调试一个程序时,你最不想处理的是调试器不能正常工作。当你试图集中精力跟踪一个bug时,总是会因为次要的问题而被忽略,尤其是当调试器的问题导致你失去一个重新编程或者浪费了大量的时间等待调试器完成它,而调试器知道这需要永远做些什么的时候。这是我时常会遇到的大量问题,所以我整理了一些常见问题的简短列表
阅读全文
摘要:如果您调试了一段时间的崩溃转储,那么您可能遇到了这样的情况:调试器提供的初始转储上下文对应于在处理初始异常时发生的第二个异常,该异常可能更接近您正在调查的问题中的原始基础问题。这可能很烦人,因为“.ecxr”命令将指向次要故障异常的位置,而不是原始异常上下文本身。然而,在大多数情况下,原始的、主要的
阅读全文
摘要:今天,当我们继续学习.NET异常处理系列时,我们将查看System.BadImageFormatException。System.BadImageFormatException与GIF或JPG无关,而是在.NET应用程序尝试加载与当前公共语言运行库(CLR)所需的正确格式不匹配的动态链接库(.dll
阅读全文
摘要:简介 此表旨在帮助将Windows运行时应用程序错误代码交叉引用到Microsoft.NET标准异常,这些异常可以作为应用程序异常处理技术的一部分。 对照表 .NET Exception (Namespace)HRESULT(s) - symbolicHRESULT(s) - rawAccessVi
阅读全文
摘要:简介 不久前,我必须建立一个符号服务器,带有源索引,那时,关于这个主题的信息不多,所以我很难让所有的东西按照我们想要的方式工作。不幸的是,仍然只有这些相同的信息,但是自从微软将源代码发布到.NET框架并自动将其符号服务器添加到Visual Studio 2010以来,似乎有更多的人意识到了这一点。大
阅读全文
摘要:这篇文章解释了如何使用驱动程序验证工具来分析崩溃转储文件。 使用Microsoft驱动程序验证工具 如果您曾经使用Windows的调试工具来分析崩溃转储,那么毫无疑问,您已经使用WinDbg打开了一个崩溃转储文件。WinDbg将对崩溃文件执行内部分析,并建议您从!analyze命令开始。该命令输出堆
阅读全文
摘要:简介 开发人员面临的最大问题之一是生产问题何时发生。开发人员必须快速找到问题的根本原因,或者在开发环境中复制相同的问题来解决问题。由于时间是至关重要的,在这方面,迟迟得不到根本原因可能导致客户的金钱损失或导致公司的声誉损失。有效地解决生产问题和缩短周转时间的方法很少。 调试问题的方法 检查调用堆栈的
阅读全文
摘要:什么是System.TypeInitializationException 作为类初始值设定项引发的异常的包装器而引发的异常。 继承 Object Exception SystemException TypeInitializationException 详细说明 当类初始值设定项初始化类型失败时,
阅读全文
摘要:简介 编写整洁的应用程序是一回事。但是当用户告诉你你的软件已经崩溃时,你知道在添加其他功能之前最好先解决这个问题。如果你够幸运的话,用户会有一个崩溃地址。这将大大有助于解决这个问题。但是你怎么能用这个崩溃地址来判断出了什么问题呢? 创建Map文件 首先,你需要一个Map文件。如果没有,使用崩溃地址几
阅读全文
摘要:本文讨论如何使用Windows事件查看器获取实际崩溃的模块以及代码中崩溃的位置。示例代码是用C++编写的,以生成不同类型的崩溃,例如访问冲突和堆栈溢出。 简介 我经常听同事和QA那里听说,一个特定的崩溃很容易在客户机上重现,而不是在他们的机器上重现。这是一个棘手的问题,因为开发人员无法在客户机上调试
阅读全文
摘要:简介 让我们从我写这篇文章的原因开始。一天,一个同事让我帮他调试他遇到的问题。所以我看着他在输入代码,这时我注意到下面一行: int test = GetLastError(); 他这样做是因为他想知道错误代码,如果之前的函数失败了。他每次想知道错误代码就加上这一行。我建议他删除所有这些行并在他的监
阅读全文
摘要:如何在调试会话中找到调试对象中使用的.NET运行时版本?以自动/脚本方式,不使用调试器扩展或符号? 答案: !for_each_module .if ( ($sicmp( "@#ModuleName" , "mscorwks") = 0) | ($sicmp( "@#ModuleName" , "m
阅读全文
摘要:有许多选项可用于控制符号的加载和使用方式。这些选项可以通过多种方式设置。 下表列出了这些符号选项: FlagOption NameDefault in debuggerDefault in DBH 0x1 SYMOPT_CASE_INSENSITIVE On On 0x2 SYMOPT_UNDNAM
阅读全文
摘要:问题的引出 我在调试某个崩溃问题时,要跟踪clr的栈,于是,我先执行了指令.loadby sos clrjit,没有报错,然后我又执行!clrstack,结果却有如下输出:0:000:x86> !clrstackCLRDLL: Consider using ".cordll -lp <path>"
阅读全文
摘要:找到个好东西 为什么要归档 此存档提供帮助,并可能提供对以下问题的答案 是否可以使WinDBG在符号存储中找到mscordacwks.dll?, Windbg需要不同版本的mscordacwks.dll,如何下载mscordacwks和mscorwks的正确版本?, WinDbg要求mscordac
阅读全文
摘要:.cordll (控制CLR调试) 简介 .cordell命令控制托管代码调试和Microsoft.NET公共语言运行库(CLR)。 使用形式 .cordll [Options] 参数 Options使用以下一个或多个以下选项:-l (小写的 L) 加载 CLR 调试模块。 -IModule (大写
阅读全文
摘要:概要 本文分步介绍了如何使用 WinDbg 调试程序 (windbg.exe) 调试 Windows 服务。 要调试 Windows 服务,可以在服务启动后将 WinDbg 调试程序附加到托管该服务的进程,或者可以配置服务以在启动时附加 WinDbg 调试程序,以便解决与服务启动相关的问题。 本文将
阅读全文
摘要:粗略察看一 下.pdb 文件,会发现在其起始位置存放的是这样一个字符串“Microsoft C/C++ program database 2.00”。可以看出 PDB 是 Program Database 的首字母缩写。在 MSDN 中或 Internet 上搜索一下有关 PDB 内部结构的信息,你
阅读全文
摘要:虽然我希望.NET PDB文件与本地PDB文件处理方式相同,但我们在这件事上没有任何选择,因为事情就是这样。我相信微软的调试器团队多年来听到过很多类似帕特里克的评论。也许我们会在未来的Visual Studio版本中看到所有问题都得到解决。帕特里克非常幸运能够通过VPN远程调试到客户机器中。我相信你
阅读全文
摘要:什么是ArgumentNullException 当将 null 引用(Visual Basic 中为 Nothing)传递到不接受其作为有效参数的方法时引发的异常。 继承 Object Exception SystemException ArgumentException ArgumentNull
阅读全文
摘要:什么是AccessViolationException 试图读写受保护内存时引发的异常。 继承 Object Exception SystemException AccessViolationException 说明 当非托管代码或不安全代码尝试对尚未分配的或不具有访问权限的内存进行读写操作时, 会
阅读全文
摘要:什么是TargetInvocationException 由通过反射调用的方法引发的异常。 继承 Object Exception ApplicationException TargetInvocationException 这是一个包装异常简单地告诉你,一反射 .Invoke()(或类似)失败。要
阅读全文