Dump Checking

Dump Checking

Debug相关的一些小技巧
摘要: 1. 如何Debug一个进程的子进程? 答: 使用WinDBG attach到父进程, 然后输入命令".childdbg 1"(无引号). 这样子进程在刚刚被加载的时候, WinDBG就Attach上去了. 这两个进程的debug session都在一个WinDBG的窗口里, 如果想要切换当前进程, 可以使用命令"|"来查看所有的进程, 使用"|0s"来切换到ID为0的进程, 以此类推. ... 阅读全文

posted @ 2012-10-17 10:31 中道学友 阅读(147) | 评论 (0) 编辑

一些ADPlus配置文件的收集
摘要: 定断点在方法ntdll!RtlEnterCriticalSection 上, 一旦执行到这个方法, 就写log, 记录callstack, 并且打印寄存器的值. 定断点在地址77f5b380 上, 动作同前一个. <ADPlus> <!-- Configuring ADPlus for breakpoints --> <!... 阅读全文

posted @ 2012-08-31 16:22 中道学友 阅读(88) | 评论 (0) 编辑

Kernel Mode Debugging 初步 一
摘要: 什么是kernel mode debugging? Kernel debugging是使用WinDBG来检验受限制的内存, 调用栈, 内部数据结构, 内部布局, 以及运行在kernel mode的操作系统组件和驱动的系统信息的过程. 在kernel mode下, 你debug的是整个操作系统, 而不是某一个应用程序, 线程, 或者进程. 这意味着你对程序的执行拥有完全的控制权, 并且需要保证你... 阅读全文

posted @ 2012-08-31 14:44 中道学友 阅读(145) | 评论 (0) 编辑

一些debug常用的"魔法"数值
摘要: CCCCCCCC 微软C++ debugging运行时用该值标记未初始化过的栈内存 CDCDCDCD 微软C++ debugging运行时用该值标记未初始化过的堆内存 FEEEFEEE 微软的HeapFree函数用该值来标记被释放了的... 阅读全文

posted @ 2012-08-08 12:44 中道学友 阅读(122) | 评论 (0) 编辑

WinDBG中的poi是做什么用的?
摘要: Poi操作符在WinDBG中可以被用来对指针进行解引用. 类似C语言中对指针的操作符*. 比如说, 如果一个地址为0×00123456的指针, 指向地址0×00420000, 即 内存地址 地址中存放的值 0×00123456 0×00123456 0×... 阅读全文

posted @ 2012-08-04 23:32 中道学友 阅读(341) | 评论 (0) 编辑

64位的dump里如何寻找第一个到第四个参数?
摘要: 这篇文章讲解的三种方法非常详细, 还可以跟随着作者的代码一起试验. 推荐. Challenges of Debugging Optimized x64 Code http://blogs.msdn.com/b/ntdebugging/archive/2009/01/09/challenges-of-debugging-optimized-x64-code.aspx 另外两篇文章也值得一... 阅读全文

posted @ 2012-08-03 14:03 中道学友 阅读(64) | 评论 (0) 编辑

X64 Calling Convention 的一个实验
摘要: 很久没更新blog了, 最近比较忙. 这篇文章转自我的onenote, 所以中英文都有, 记给自己, 也分享给大家. 没必要纠结语言, 能看懂就行了. 呵呵.以下结论非常重要, 摘自<<Advanced Windows Debugging>> Page 606. Rcx: contains the 1st parameter passed to the function. Rdx: contains the 2nd parameter passed to the function. R8: contains the 3rd parameter passed to the 阅读全文

posted @ 2012-06-05 15:49 中道学友 阅读(213) | 评论 (0) 编辑

WinDBG脚本入门
摘要: 最近开始看一些针对非托管进程的WinDBG的使用了, Tess推荐去看Debugging Toolbox. 其第一篇就把我难住了, 脚本看不懂. 动手实践了一下, 发现下面的文章所讲的内容特别有帮助, 于是转载在这里. 原文地址 First steps with WinDBG scripting… (Memento) http://www.msuiche.net/2007/08/03... 阅读全文

posted @ 2012-03-15 11:09 中道学友 阅读(522) | 评论 (0) 编辑

利用PsExec提升命令行的安全级别, 绕过组策略执行命令
摘要: 有一次, 我需要在客户的环境上抓取Time Travel Tracing, 简称TTT(dump的一种). 但是就是不能成功抓取. 报错如下: 具体错误信息如下: c:\Debuggers\ttt>tttracer -dumpfull -out e:\tttoutput -attach 3384 Microsoft (R) TTTracer 2.010.40929 (Se... 阅读全文

posted @ 2012-03-12 10:16 中道学友 阅读(488) | 评论 (0) 编辑

无法抓DUMP, 报错"Could not attach to process XXXX, NTSTATUS 0xC0000048"
摘要: Problem Description ================= We tried to use ADPlus to capture dump file. But the size of dump files are all under 20K. We tried it many times. Trouble Shoot ================= I tried ... 阅读全文

posted @ 2012-03-09 15:23 中道学友 阅读(690) | 评论 (0) 编辑

Failed to load data access DLL, 0x80004005
摘要: 新年第一篇, 首先祝大家2012身体健康, 工作顺利, 先来篇简单的. 0:031> .load psscor2 0:031> !clrstack CLRDLL: CLR DLL load disabled Failed to load data access DLL, 0x80004005 Verify that 1) you have a rece... 阅读全文

posted @ 2012-01-03 15:21 中道学友 阅读(407) | 评论 (0) 编辑

记一次纠结的排错-用WinDBG解决WinDBG Hang的问题
摘要: 今天早上, 客户传来了一个hang dump, 急着想看看, 结果WinDBG每次在菜单里点击了Open Crash Dump之后, 都会hang住. 重试, 结果一样. 重启WinDBG, 结果一样. 重启机器, 结果一样. 卸载重装WinDBG, 结果一样. 怀疑Debug Diag 1.2有问题, 卸掉, 结果一样. 修改了默认的symbol path... 阅读全文

posted @ 2011-10-17 11:27 中道学友 阅读(230) | 评论 (0) 编辑

[技巧]如何获得某个callstack所在线程的线程号?
摘要: 检查dump文件的时候, 我们经常会使用下面的命令来获得所有线程上的调用栈 ~*e !clrstack 输出结果举例如下: OS Thread Id: 0x1b30 (15) Child-SP RetAddr Call Site 0000000034a9ed00 000006424e611fc0 System.Thread... 阅读全文

posted @ 2011-09-23 10:32 中道学友 阅读(288) | 评论 (0) 编辑

记一个在live debugging一个托管进程时, BPMD无法定下断点的问题的解决方案
摘要: SharePoint 2010的某些DLL会被进行一种叫做Pre-compiling的优化, 所使用的工具叫做Ngen.exe. 优化过后, 托管的dll会被制作为native image, 之后呢Runtime每次都会使用native image, 而不是传统的托管DLL. 这种优化可以加快DLL的加载, 因为需要执行代码的很多动作都被提前做好了. 然而, 这样的优化会给在WinDBG中Liv... 阅读全文

posted @ 2011-08-04 14:03 中道学友 阅读(75) | 评论 (0) 编辑

一点小小的心得
摘要: 今天通过看dump来解决一个SharePoint的性能问题, 不小心钻了牛角尖. 盯着托管调用栈看. 其实, 换成k命令去遍历每个线程的非托管调用栈, 一下子就看到了绝大多数线程都在等SQL. 所以, 虽然w3wp.exe多数是托管线程在处理页面请求, 当发现托管调用栈信息有限的时候, 不妨换非托管调用栈检查一下. 阅读全文

posted @ 2011-06-30 17:40 中道学友 阅读(97) | 评论 (0) 编辑

在WinDBG中查看内存的命令
摘要: 当我们在调试器中分析问题时, 经常需要查看不同内存块的内容以分析产生的原因, 并且在随后验证所做出的假设是否正确. 由于各个对象的状态都是保存在内存中的, 因此内存的内容也就相当于对象的状态. d命令最常见的格式就是根据指定的类型信息来显示存储在某地址中的数据. 调试器并不会去猜测这个地址上存储的是什么数据, 因为在大多数情况下猜测都是错误的. 所以需要用户显式地制定按照何种格式来解析数据. 命令... 阅读全文

posted @ 2011-01-09 22:37 中道学友 阅读(2792) | 评论 (0) 编辑

在WinDBG中查看变量的命令
摘要: 命令 ============ dv Display Variable的缩写, 查看局部变量. dv /i 查看局部变量, 并显示符号的类型和参数类型. dv /V 查看局部变量, 并显示变量的存储位置. dv /V VariableName 指定需要查看的变量的名字 dv 02sample!gGlo* dv命令可以带有通配符, 来查看具有某命名模式的变量. 举例: dt Display Typ... 阅读全文

posted @ 2011-01-02 20:46 中道学友 阅读(2713) | 评论 (0) 编辑

在WinDBG中设置断点的命令
摘要: 命令==========~0 bp 02sample!KBTest::Fibonacci_stdcall "r esp"在零号线程上的KBTest类的Fibonacci_stdcall函数上设置断点, 并且在触发断点时执行"r esp"命令.bl列出所有已经设置了的断点bc *清除所有断点bp 02sample!KBTest::Fibonacci_stdcall “r esp;g”在所有线程上设置断点, 并且在触发断点时执行"resp;g"两条命令.bm 02sample!*kbtest*命令bm可以在参数中指定一个符号模式, 这样在所有与这个符号匹配的地址上都将设置一个断点. 上面的命令使用 阅读全文

posted @ 2011-01-02 14:28 中道学友 阅读(986) | 评论 (0) 编辑

在WinDBG中查看调用栈的命令
摘要: 命令 ========== k k命令显示的是一定数量的栈帧, 其中帧的数量是由.kframes命令来控制的, 默认值是256。 kp 5 显示调用栈中前5个函数以及他们的参数. kb 5 显示调用栈中前五个函数以及他们的前三个参数. kf 5 显示在调用栈中五个函数所使用的栈的大小. 每个栈帧所占的空间使用量的计算方法是: 将当前函数的栈基指针与在函数中调用的任何一个函数栈基指针相减. 举例: 手动构造栈的实践- 如何手工构造调用栈 ============ 首先用几幅图说明一下栈的特点, 帮助大家理解. 1. 栈向低地址增长. 2. 向栈中压入数据, 栈中的情况如图. 3. 阅读全文

posted @ 2011-01-01 22:26 中道学友 阅读(2117) | 评论 (1) 编辑

在WinDBG中查看函数的反汇编代码的命令
摘要: 命令 ========== u . u $ip 上面的两个命令是效果是一样的, 反汇编当前$ip地址上的8条命令. uf . uf $ip 上面两个命令的效果是一样的, 反汇编当前$ip地址上的整个函数. ub . ub $ip 反汇编$ip之前的8条指令. ub $ip L2a 反汇编$ip地址之前的42条指令. u $ip $ip+a 反汇编地址$ip到地址$ip+10之间的指令. 注意, 这里包括$ip, 不包括$ip+10。 举例: 阅读全文

posted @ 2011-01-01 21:30 中道学友 阅读(1502) | 评论 (0) 编辑

Move EDI, EDI的作用
摘要: 玩WinDBG的时候, 发现函数的反汇编代码的最开始部分总是包含一条move edi, edi的指令. 比如下面的代码生成汇编代码的开头部分如下:Push EBP和Mov EBP, ESP两条指令是标准的栈框架建立的指令, 但是Mov EDI, EDI是做什么的呢? 看起来它就是两个字节的NOP指令.正解:mov edi, edi的确是个双字节的no-op指令, 它存在的目的是使得hot-patc... 阅读全文

posted @ 2011-01-01 18:10 中道学友 阅读(741) | 评论 (0) 编辑

在WinDBG中进行进制转换和简单的计算
摘要: 在WinDBG中可以进行一些简单的计算工作, 比如16进制与10进制之间的相互转换, 加减乘除等. 举例1, 进制转换: 注意, 上面的例子中的第二个命令告诉我们, 十进制的数字在windbg中进行表示的时候前面要加上前缀"0n", 而十六进制则可不必带上前缀"0x". 举例2, 除法计算: Debugging Tips: Use windbg as a calculator, a chat... 阅读全文

posted @ 2011-01-01 13:58 中道学友 阅读(271) | 评论 (0) 编辑

伪寄存器
摘要: 许多寄存器的名字取决于处理器的架构, 因此对于那些偶尔使用调试器的用户来说很难记住所有平台上的寄存器名字. 为了克服这个问题, 调试器的开发团队引入了各种伪寄存器(Pseudo-Register), 由调试器将这些伪寄存器对应到不同的硬件架构上. 所有的伪寄存器都由一个美元符号($)开始. 如果你使用MASM语法, 你可以在$符号之前添加一个@符号, 这个@字符会告诉debugger接下来的tok... 阅读全文

posted @ 2011-01-01 13:44 中道学友 阅读(155) | 评论 (0) 编辑

如何使用符号文件?
摘要: 几乎每个命令都会直接或者间接地使用符号信息. 进行符号检查的命令却不多. 查看符号的命令是x, 这个字符表示"查看符号". 语法如下所示: 0.00>x [options] module!symbols module和symbols都可以包含通配符. 在调试陌生代码时, 通配符是一种功能强大的工具, 因为它使我们在阅读代码之前能够猜测函数的名字或者全局变量. 其中, 带有_imp前缀的函数... 阅读全文

posted @ 2010-12-27 16:30 中道学友 阅读(306) | 评论 (0) 编辑

如何验证已经加载的symbol file与module是否匹配?
摘要: 可以使用!chksym命令. 该命令接受一个内存地址作为参数, 只要这个内存地址属于某个module的范围之内, 那么该命令就会检查这个module的symbol和module是否匹配. !chksym 01000005 举例如下: 阅读全文

posted @ 2010-12-27 12:53 中道学友 阅读(92) | 评论 (0) 编辑

成功运行过的WinDBG Commands–12-26-2010
摘要: lm v m 02samp* 列出module的信息, v代表verbose, 即详细, m代表可以使用通配符, 02samp*意图是匹配用02samp开头的所有module !lmi 02sample 显示模块的header中的信息. !lmi接受模块名或者模块地址作为参数 !sym noisy !sym quiet 符号加载过程的详细输出和非详细输出. 用于帮助你检查符号加载过程中可能出现的问... 阅读全文

posted @ 2010-12-26 22:26 中道学友 阅读(68) | 评论 (0) 编辑

.reload 命令的一些常用形式
摘要: .reload /f 命令会强制debugger立即解析所有module相关联的符号文件. 于是我就想, 有没有什么命令可以立即去掉所有module相关联的符号文件呢? 找了半天也没找到, 最后发现.reload /f的反命令就是.reload 其他形式 ========== .reload <module> 抛弃模块<module>的符号信息. 任何解析符号的动作都将从硬盘上重新加载符号文... 阅读全文

posted @ 2010-12-26 22:24 中道学友 阅读(235) | 评论 (0) 编辑

为<<Advanced Windows Debugging>>配置符号路径
摘要: 纸上得来终觉浅, 绝知此事要躬行. 笔者开始动手运行AWD一书中的例子了. 在这里下载源文件, 可执行文件以及符号文件. 一开始设置符号路径的时候就遇到了困难, 这里记录下解决问题的过程. 先把最终可以正常工作的命令写在这里: .sympath srv*c:\symstore.pri*http://msdl.microsoft.com/download/symbols 1. 在http:... 阅读全文

posted @ 2010-12-24 22:59 中道学友 阅读(107) | 评论 (0) 编辑

什么是符号文件?
摘要: 在构建应用程序, 库, 驱动程序或者操作系统是, 编译器和链接器会在创建.exe, .dll, .sys以及其他可执行文件(也被称为二进制文件或者映像)的同时, 还会创建一定数量的附加文件, 这些文件也被称为符号文件(Symbol File). 从Windows Xp和Windows Server 2003开始, 符号文件只使用PDB格式. 符号文件通常包含以下内容: 全局变量的名字和地址 函... 阅读全文

posted @ 2010-12-24 21:28 中道学友 阅读(127) | 评论 (0) 编辑

介绍一个好用的抓取dump的工具-ProcDump
摘要: Procdump是一个轻量级的Sysinternal团队开发的命令行工具, 它的主要目的是监控应用程序的CPU异常动向, 并在此异常时生成crash dump文件, 供研发人员和管理员确定问题发生的原因. 你还可以把它作为生成dump的工具使用在其他的脚本中. 有了它, 就完全不需要在同一台服务器上使用诸如32位系统上的Debug Diag 1.1或是64位系统上的ADPlus了. 问题描述 ... 阅读全文

posted @ 2010-12-20 10:43 中道学友 阅读(968) | 评论 (0) 编辑

记一个托管的dump无法查看托管调用栈的问题
摘要: 朋友让我帮忙看一个dump, 我打开看了看, 发现一个怪异的问题. 用命令"~*e!clrstack"查看所有线程的托管调用栈, 居然说所有的线程都不是托管线程. 0:045> ~*e!clrstackOS Thread Id: 0x16d4 (0)Unable to walk the managed stack. The current thread is likely not a manage... 阅读全文

posted @ 2010-12-16 16:51 中道学友 阅读(189) | 评论 (0) 编辑

使用WinDBG排查应用程序加载时崩溃的问题
摘要: 假设有个应用程序, 一启动就崩溃, 根本就来不及让你用Visual Studio来Attach, 并且该应用程序在使用Visual Studio直接lunch的情况下又不会出现这样的问题, 该怎么办呢? 除了使用<<在进程崩溃的时候自动抓取一个DUMP文件>>中的方法, 还可以使用WinDBG直接加载应用程序的可执行文件, 然后在应用程序退出的系统函数上下断点, 从而得到... 阅读全文

posted @ 2010-12-02 13:37 中道学友 阅读(283) | 评论 (0) 编辑

如何明确指定命令所在的debugger extension?
摘要: 问题的场景是这样的, 你在看dump文件, 运行了一个命令, 可是你觉得这个命令跟平常你看到的该命令的输出有点不大一样. 你感觉很困惑, 怀疑是不是这个命令不属于你希望的那个debugger extension. 怎么办? 比方说, psscor2.dll 和 sos.dll 都包含有一些命令, 你的debugger 又同时加载了两个debugger, 你运行了一个!threads, 却不清楚这... 阅读全文

posted @ 2010-10-12 14:25 中道学友 阅读(111) | 评论 (0) 编辑

!aspxpages(即!dumphttpcontext)命令输出的解释
摘要: 在排查ASP.NET网站High CPU问题时, 经常使用hang dump来确定常规手段难以发现的原因. 经常会使用!aspxpages命令来查看当前进程中都有那些资源正被请求, 被请求的资源都运行了多久. 这个命令的输出样本如下. 0:000> !aspxpagesGoing to dump the HttpContexts found in the heap.Loading the ... 阅读全文

posted @ 2010-10-11 15:29 中道学友 阅读(70) | 评论 (0) 编辑

无法查看.NET Framework 1.1的dump文件?
摘要: 经常看的dump都至少是.net framework 2的dump文件, 冷不丁开一个.net 1.1的dump, 发现问题还挺多. 经过一番摸索, 最后还是成功地查看了这个dump. 解决方案如下: 1. 在debugger所在的机器上安装.net framework 1.1. 2. 在debugger所在的机器上安装.net fraemwork 1.1 SP1 3. 使用.loadby so... 阅读全文

posted @ 2010-10-05 22:21 中道学友 阅读(240) | 评论 (0) 编辑

WinDBG抓Full Memory Dump的命令
摘要: .dump /u /ma c:\temp\notepad.dmp 另附ADPlus命令例子 ADPlus -hang -p 1896 –o c:\temp ADPlus -hang -pn myapp.exe 阅读全文

posted @ 2010-09-24 10:31 中道学友 阅读(238) | 评论 (0) 编辑

介绍SOS中的SaveModule命令
摘要: 这个命令允许你把一个已经加载到内存中的一个镜像(DLL, EXE)写回到一个文件中. 这非常有用, 尤其是你在debugging一个full memory dump, 并且没有原始的exe或dll的时候. 这个命令通常用来保存一个托管二进制信息到一个文件中, 稍后你就可以使用Reflector来反汇编里面的代码了. 首先, 使用lm命令来获得image的base address. 0:000&g... 阅读全文

posted @ 2010-08-13 14:54 中道学友 阅读(86) | 评论 (0) 编辑

如何在WinDBG里获得关于命令的帮助?
摘要: 标准命令帮助 ============ ? ? /D 元命令帮助 ============ .help .help /D .help /D a* 扩展命令帮助 ============= !help !help savemodule 在命令行中开启WinDBG的chm帮助 ============= .hh .hh lm 参考资料: Windows Debuggers: Part 1: A... 阅读全文

posted @ 2010-08-11 12:01 中道学友 阅读(122) | 评论 (1) 编辑

如何从WinDBG命令行得知当前抓取的dump属于什么进程?
摘要: 可以使用命令"|", 这个command的英文名叫做vertical bar. 举例: 0:018> |. 0 id: 598 examine name: C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\BIN\OWSTIMER.EXE 参考资料: WinDBG帮助 阅读全文

posted @ 2010-08-11 11:23 中道学友 阅读(173) | 评论 (0) 编辑

如何在WinDBG里保存运行过的命令的历史记录?
摘要: 比方说你抓了个full dump, 在debug一个很复杂的问题, 可能你已经有了结果, 或者还在研究当中, 这时你被别的事情打搅了, 回家了, 第二天来重开dump文件, 不记得昨天做到哪里了. 在或者说, 你的同事很牛, 他分析了dump文件并得出了结论. 你想学一下他的思路. 在这两种情况下, 让windbg把曾经输入过的命令按顺序写到文件里的功能就相当有帮助了. 命令举例如下: .writ... 阅读全文

posted @ 2010-08-11 11:07 中道学友 阅读(236) | 评论 (0) 编辑

如何在WinDBG中切换当前的线程?
摘要: 命令很简单: ~0s 切换到0号线程 ~3s 切换到3号线程 一些其他命令: ~*e !clrstack 遍历每个线程, 依次输出它们的托管调用栈. !threads 查看所有的托管线程 阅读全文

posted @ 2010-07-19 23:26 中道学友 阅读(1268) | 评论 (0) 编辑

一些关于帮助初学者分析dump的链接
摘要: Common WinDbg Commands (Thematically Grouped) http://windbg.info/doc/1-common-cmds.html Getting started with WinDbg and Sos.dll http://rynsim.spaces.live.com/blog/cns!1DA5A63F849536B6!671.entry 阅读全文

posted @ 2010-07-07 23:54 中道学友 阅读(129) | 评论 (0) 编辑

在WinDBG中高亮你输入的命令, 从而和命令的结果输出区分开来
摘要: 在WinDBG的Command窗口中, 默认情况下, 你输入的命令很容易和该命令以及附近命令的输出混杂在一起. 在寻找之前命令的结果的时候, 眼睛看起来会很累. WinDBG提供了一个选项, 通过这个选项, 你可以把命令输入与输出的颜色进行设置. 选项名: Prompt level command window text Prompt level command windows text ba... 阅读全文

posted @ 2010-07-06 11:31 中道学友 阅读(273) | 评论 (0) 编辑

如何将WinDBG中命令的输出保存到文本文件中?
摘要: 从本质上说, 这个功能是WinDBG的日志功能的一个应用而已. WinDBG的log功能可以记录你在WinDBG中使用的每一个命令以及其对应的输出. 那么如何开启WinDBG的日志功能呢? 首先, 可以选择从命令行中启动WinDBG. 举例, 使用下面的带有-logo参数的命令: 其次, 如果你已经在一个debug session里了, 你可以使用.logopen命令来开始记录.回答本文标题中... 阅读全文

posted @ 2010-07-06 00:25 中道学友 阅读(538) | 评论 (0) 编辑

The call to LoadLibrary(YourExtensionName) failed, Win32 error 0n14001, “This application has failed to start because the application configuration is incorrect. Reinstalling the application may fix this problem.”
摘要: 使用WinDBG, 有时需要加载一些第三方的debugger extension. 这些extension会提供一些功能, 比如说dump特定类型信息等, 帮助你完成debugging的任务. 在加载第三方debugging extension的时候, 如果你遇到了类似标题中的错误, 该怎么办呢? 原因 ========= 这个第三方的extension的开发平台在出现问题的机器上不存在. ... 阅读全文

posted @ 2010-07-03 11:28 中道学友 阅读(711) | 评论 (0) 编辑

在WinDBG中使用foreach
摘要: 我们可以使用.foreach命令来加工一个或多个debugger命令的输出结果, 可以把结果集中的每一条结果作为参数传递给一个或多个其他的命令. 语法: .foreach [Options] ( Variable { InCommands } ) { OutCommands }.foreach [Options] /s ( Variable "InString" ) { OutCommands ... 阅读全文

posted @ 2010-06-16 10:58 中道学友 阅读(205) | 评论 (0) 编辑

研究托管内存问题时涉及到的工具, 计数器, 和WinDBG命令
摘要: Window 任务管理器 ============== Mem Usage 表示的是进程工作集(就像进程\工作集性能计数器)。它并不表示所使用的字节数(committed bytes)。 VM Size 反映的是供进程使用的字节数(就像进程\专用字节数性能计数器)。VM Size 可提供关于您是否面临内存泄漏问题的第一线索(如果您的应用程序存在泄漏,则 VM Size 会随时间增加). GC 性... 阅读全文

posted @ 2010-06-06 15:19 中道学友 阅读(276) | 评论 (0) 编辑

如何在进程创建的过程中Attach上WinDBG
摘要: 在排查服务启动时错误的时候, debugger会运行在后台, 我们无法与之交互. 因为服务是运行在一个不同的winstation里的, 这意味着我们不能通过desktop与它们交互. 这也意味着, 已经加载了的debugger即使在运行, 也是运行在后台, 我们无法与它交互. 解决方案是进入services.msc, 找到这个服务的属性, 让它使用local system账号运行, 然后勾选选项... 阅读全文

posted @ 2010-06-04 00:11 中道学友 阅读(493) | 评论 (0) 编辑

WinDBG 常用命令表
摘要: 启动, 附加进程, 执行和退出(Starting, Attaching, Executing and Exiting) ======================= Start -> All Programs -> Debugging Tools for Windows -> WinDBG 启动 F6 attach to process 附加到进程 Ctrl-Break ... 阅读全文

posted @ 2010-05-30 23:19 中道学友 阅读(863) | 评论 (0) 编辑

在WinDBG中, 使用.shell命令来搜索字符串
摘要: 对于我来说, 使用WinDGB时最有用的命令之一就是.shell命令了. Debugging Tools For Windows帮助文件说: .shell命令能加载一个shell进程, 并重定向它的输出到debugger中, 或者重定向到一个指定的文件里. 那么为什么我觉得加载一个shell进程会对日常工作有帮助呢? 加载shell进程最简单最常用的功能就是搜索字符串. 你也许会想, 为什么不在... 阅读全文

posted @ 2010-05-30 22:23 中道学友 阅读(762) | 评论 (0) 编辑

SOS 的帮助输出
摘要: SOS是一个debuger的扩展DLL, 它的设计目标就是帮助我们debug托管程序. 下面的命令是按照类别排列的, 然后大致上是按照重要性进行的排序. 摘自 Windbg的帮助输出 !help 阅读全文

posted @ 2010-03-30 10:53 中道学友 阅读(70) | 评论 (0) 编辑

WinDbg.exe中使用的SOS.dll的命令列表
摘要: SOS Debugging Extension (SOS.dll) 可以在WinDgb.exe和Visual Studio中通过提供CLR内部环境信息的方式, 帮助你debug托管程序. 这里的命令列表在WinDbg的帮助中是找不到的. 列在下面, 备查. Command Description BPMD [<module name> <method name>] [-m... 阅读全文

posted @ 2010-03-29 12:47 中道学友 阅读(1048) | 评论 (0) 编辑

记一次看DUMP的实战
摘要: 命令: .sympath srv*d:\symcache*\\symbols\symbols 解释: The .sympath command changes the default path of the host debugger for symbol search. 命令: .reload /f ntdll.dll 解释: The .reload command deletes all s... 阅读全文

posted @ 2010-03-15 17:49 中道学友 阅读(118) | 评论 (0) 编辑

如何在x64的机器上使用WinDBG来debug一个32bit的.NET应用程序
摘要: 遇到一个错误: The call to LoadLibrary(C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\sos) failed, Win32 error 0n193 搜索发现下面的文章, 要点陈列如下. 未完... 原文地址: How to use Windbg to debug a dump of a 32bit .NET app run... 阅读全文

posted @ 2010-03-15 14:21 中道学友 阅读(384) | 评论 (0) 编辑

Deferred Symbol Loading
摘要: 默认情况下, symbol信息实际上并不是在target module加载的时候被加载的. 取而代之的是, symbol是在debugger需要的时候再加载的. 这叫做deferred symbol loading 或 lazy symbol loading. 当这个选项开启的时候, debugger会在任何它遇到一个不认识的symbol的时候加载symbols. 摘自: Debugging ... 阅读全文

posted @ 2010-03-15 13:57 中道学友 阅读(41) | 评论 (0) 编辑

在进程崩溃的时候自动抓取一个DUMP文件
摘要: 在如下的情况下需要使用这样的技巧: 1. 生产环境上出问题, 我们需要抓取dump文件, 在线下去debug. 2. 正在运行一大堆测试, 当其中一个崩溃的时候, 不希望在运行时干扰整个测试动作, 仅需要收集一些测试信息. 3. 问题在连接到debugger后无法重现. 简单来说, 就是你希望在对环境影响最小的前提下, 抓取尽可能多的信息. 为了满足这种需求, 最好的方式是配置 just-in-... 阅读全文

posted @ 2010-03-08 22:10 中道学友 阅读(2979) | 评论 (0) 编辑

关于DUMP的基础知识
摘要: 什么是内存转储文件, 即dump? ====================== 内存转储文件时一个进程或系统在某一给定的时间的快照. dump文件的种类有很多, 不同种类的dump文件包含不成程度的数据. 用户态内存转储文件 VS 内核态内存转储文件 ====================== 如果你抓一个进程的dump文件, 那么你抓取的是用户态的dump文件. 如果你抓取整个系统的内存d... 阅读全文

posted @ 2010-03-07 15:03 中道学友 阅读(498) | 评论 (0) 编辑

Symbol
摘要: Symbol能够包含以下的一些信息: 全局变量 局部变量 函数名称, 参数 结构体 源代码行号 有三种类型的Symbol export symbols是dll本身的一部分. 比如ntdll.dll和kernel32.dll暴露出很大一部分他们的函数, 以便于他们能够像API一样地调用, 但是大多数的dll会有很少的exported symbols. 大致上, export symbol... 阅读全文

posted @ 2010-03-07 14:11 中道学友 阅读(96) | 评论 (0) 编辑

ADPlus
摘要: 什么是ADPlus? =============== ADPlus是一个Microsoft Product Support Services (PSS) 的工具, 可以用来排查任何进程或者应用程序的停止响应(hang), 或者崩溃(crash)的错误. 经常地, 你可以使用ADPlus(ADPlus.vbs)作为Microsoft Internet Information Server (IIS)... 阅读全文

posted @ 2010-03-07 13:29 中道学友 阅读(1437) | 评论 (0) 编辑

First chance exceptions 和 Second chance exceptions
摘要: 每种类型的异常(如访问冲突或堆栈溢出)都可以作为First chance exceptions(第一次偶然发生的异常) 或 Second chance exceptions(第二次偶然发生的异常)对调试程序引发。 根据定义,除非未被错误处理程序正确地处理, 否则First chance exceptions是非致命的异常。如果的确未被错误处理程序正确地处理,那么它将作为Second chance... 阅读全文

posted @ 2010-03-07 12:57 中道学友 阅读(192) | 评论 (0) 编辑

关于抓DUMP的一些链接
摘要: Debug Diagnostic Tool 和 WinDBG 的比较 这篇文章中, 比较了二者的区别, 介绍了一些简单的用法, 比如分别如何抓hung dump, crash dump. http://blogs.msdn.com/tess/archive/2008/05/21/debugdiag-1-1-or-windbg-which-one-should-i-use-and-how-do-i-... 阅读全文

posted @ 2010-03-05 15:05 中道学友 阅读(178) | 评论 (0) 编辑

WinDBG命令概览(下) - 扩展命令
摘要: 扩展命令(Extension Command)用于实现针对特定调试目标的调试功能. 与标准命令和元命令是内建在WinDBG程序文件中不同, 扩展命令式实现在动态加载的扩展模块(DLL)中的. 利用WinDBG的SDK, 用户可以自己编写扩展模块和扩展命令. WinDBG程序包中包含了常用的扩展命令模块. 存放在以下几个子目录中. NT4CHK: 调试目标为Windows NT 4.0 chec... 阅读全文

posted @ 2010-01-31 15:54 中道学友 阅读(749) | 评论 (0) 编辑

WinDBG命令概览(中) - 元命令
摘要: 元命令(Meta-Command)用来提供标准命令没有提供的常用调试功能, 与标准命令一样, 元命令也是内建在调试器引擎或者WinDBG程序文件中的. 所有元命令都已一个点(.)开始, 所以元命令也被称为点命令(Dot Command). 按照功能, 可以把元命令分成如下几类. 显示和设置调试会话和调试器选项. 用于符号选项的.symopt- Set Symbol Options 用于符号路... 阅读全文

posted @ 2010-01-31 15:21 中道学友 阅读(749) | 评论 (0) 编辑

WinDBG命令概览(上) - 标准命令
摘要: WinDBG的大多数功能是以命令方式工作的, 本系列将介绍WinDBG的三类命令, 标准命令, 元命令和扩展命令. 标准命令 =============== 标准命令用来提供适用于所有调试目标的基本调试功能. 所有基本命令都是实现在WinDBG内部的, 执行这些命令时不需要加载任何扩展模块. 大多数标准命令是一两个字符或者符号, 只有version等少数命令除外. 标准命令的第一个字符是不分大小... 阅读全文

posted @ 2010-01-31 14:40 中道学友 阅读(3069) | 评论 (1) 编辑

经典线程死锁
摘要: 代码例子如下:public class TestDeadLock implements Runnable{ public int flag = 1; static Object S1 = new Object(), S2=new Object(); public void run() { System.out.println("flag="+flag); if(flag==1) { synchro... 阅读全文

posted @ 2010-01-28 16:47 中道学友 阅读(113) | 评论 (0) 编辑

Crash dump中需要重点关注的信息
摘要: Crash都是发生在某一函数中, 而95%的crash都是由下面两种情况中的一种导致的: 发生crash的函数获得了错误的参数. 发生crash的函数使用了损坏了的内部数据. 代码的执行过程是对数据进行变化的过程. 对同一段代码, 在相同环境下, 如果使用的数据都相同, 那么执行的结果肯定是唯一的. 如果函数发生崩溃, 那么肯定是使用到的数据跟理想情况有差别. 函数使用的数据来源: 一是函数传入的... 阅读全文

posted @ 2009-12-06 20:57 中道学友 阅读(425) | 评论 (0) 编辑

通过简单Dump能获得的基本信息
摘要: 如果有出错程序的dump, 哪怕dump不是在合适的时机获取的, 也可以分析出有用的信息. 通过vertarget查看系统版本和系统运行了多长时间. 通过!peb查看环境变量的情况. 由于很多第三方软件都习惯把自身路径添加到环境变量中, 所以这里很多时候可以看出一些已经安装的软件. 同时还能看到当前进程所加载的DLL和对应路径. 检查DLL和对应路径时, 可以重点检查如下的一些项目: 有没有防毒程... 阅读全文

posted @ 2009-12-06 20:34 中道学友 阅读(217) | 评论 (0) 编辑

你可能感兴趣的:(check)