windbg

使用WinDbg调试程序

。_饼干妹妹 提交于 2019-11-28 18:31:57
使用WinDbg调试程序 WinDbg是微软发布的一款相当优秀的源码级(source-level)调试工具,可以用于Kernel模式调试和用户模式调试,还可以调试Dump文件。 WinDbg是微软很重要的诊断调试工具: 可以查看源代码、设置断点、查看变量, 查看调用堆栈及内存情况。  调试应用程序(用户模式 user mode)  调试操作系统及驱劢程序(内核模式 kernel mode)  调试非托管程序(native program)  调试托管程序(managed program)  实时调试 (JIT: Just in time)  事后调试 (postmortem debugging) 使用WinDbg可以解决线上.NET应用程序的如下问题: ◆ 内存高 ◆ CPU高 ◆ 程序异常 ◆ 程序Hang死 在生产环境下进行故障诊断时,为了不终止正在运行的服务或应用程序,有两种方式可以对正在运行的服务或应用程序的进程进行分析和调试。 一、用WinDbg等调试器直接attach到需要调试的进程,调试完毕之后再detach即可。但是这种方式有个缺点就是执行debugger命令时必须先break这个进程,执行完debug命令之后又得赶紧F5让他继续运 行,因为被你break住的时候意味着整个进程也已经被你挂起。另外也经常会由于First Chance

WinDbg命令窗口的使用

核能气质少年 提交于 2019-11-28 18:24:25
Windbg的命令窗口是我们进行调试时,主要打交道的窗口。界面如下 对于windbg,“调试器命令窗口”是指标题栏中标记为“命令”的窗口。此窗口包含两个窗格: 在底部的小窗格中,输入命令。 在上面的大窗格中,可以查看命令输出。 打开命令窗口 通常我们通过打开exe程序、附加到进程或打开dmp文件进行调试时,会自动打开此窗口,但很有可能我们关闭掉了这个窗口,有如下重新打开方式: 点击工具栏按钮 快捷键 ALT+1 通过上面的方式,我们可以随意关闭打开此窗口。 调试器命令窗口提示 在执行用户模式调试时,“调试器命令”窗口中的提示类似于以下示例。 2:005> 在此示例中,2是当前进程号,005是当前线程号。 如果将调试器附加到多台计算机,则系统号将包括在进程和线程号之前,如下面的示例所示。 3:2:005> 在本例中,3是当前系统号,2是当前进程号,005是当前线程号。 在只有一个处理器的目标计算机上执行内核模式调试时,提示如下所示。 kd> 但是,如果目标计算机有多个处理器,则当前处理器的编号将显示在提示之前,如下例所示。 0: kd> 如果调试器正忙于处理以前发出的命令,则新命令将暂时不被处理,尽管可以添加到命令缓冲区。 此外,还可以在windbg中使用菜单命令和快捷键。 当windbg处于忙碌状态时,以下指示器将代替提示出现: *BUSY* 可以使用.pcmd(set

WinDbg扩展

生来就可爱ヽ(ⅴ<●) 提交于 2019-11-28 18:16:06
WinDbg的扩展,也可以叫插件。它用于实现针对特定调试目标的调试功能,用于扩展某一方面的调试功能。扩展的实现是通过扩展模块(DLL)实现的。Windbg本身已经包含了很多扩展命令,这些扩展为这Windbg调试器提供了强大的功能和灵活性。调试器扩展命令的使用与标准调试器命令非常相似。但是,虽然内置调试程序命令本身是调试程序二进制文件的一部分,但调试程序扩展命令是由与调试程序不同的DLL公开的。windbg可以添加扩展功能,用户可以自己实现一组功能并添加到windbg中,把包含扩展功能的dll文件放到windbg目录下的winext子目录 ,windbg就会自动加载扩展模块。这允许您编写新的调试器命令,这些命令是根据您的特定需求定制的。 加载调试器扩展DLL 有几种方法可以加载调试器扩展DLL,以及控制默认调试器扩展DLL和默认调试器扩展路径: 在启动调试程序之前,使用\u nt \u debugger \u extension \u path环境变量设置扩展DLL的默认路径。这可以是多个目录路径,用分号分隔。 使用.load(加载扩展dll)命令加载新的dll。 使用.unload(卸载扩展dll)命令卸载dll。 使用.unload all(卸载所有扩展DLL)命令卸载所有调试器扩展。 启动调试器之前,使用-a命令行选项设置默认扩展dll。 使用.extpath(设置扩展路径

Windbg命令脚本流程控制语句详解

自古美人都是妖i 提交于 2019-11-28 17:43:57
在 Windbg命令脚本 一文里,我们介绍了命令脚本语言的的组成要素,在本文里将对语句进行展开的讲解。这些语句主要是流程控制的语句,比如我们常见的条件分子和循环语句等。 ; (命令分隔符) 分号(;)字符用于在一行中分隔多个命令。 Command1 ; Command2 [; Command3 ...] 参数 命令1,命令2,… 要执行的命令。 命令从左到右依次执行。除非另有规定,否则单行上的所有命令都引用当前线程。如果命令导致线程执行,则该行上的其余命令将被延迟,直到该线程在调试事件上停止。 少数命令后面不能跟分号,因为它们会自动将行的整个剩余部分作为参数。 其中包括as(set alias)、$<(run script file)、$><(run script file)和以*(comment line specifier)标记开头的任何命令。 下面是一个例子。 这将执行当前程序到源代码行123,打印计数器的值,然后继续执行: 0:000> g `:123`; ? poi(counter); g { } (块分割符) 一对大括号({})用于包围调试器命令程序中的语句块 Statements { Statements } Statements 输入每个块后,将计算块中的所有别名。 如果在命令块中的某个点更改别名的值,则该点后面的命令将不会使用新的别名值,除非它们位于从属块中

WinDbg x64: Cannot debug a crash dump - failed to load data access DLL

十年热恋 提交于 2019-11-28 17:33:46
问题 I attached WinDbg to a running process and had the process crashed (I have a separate question re. that case). Once the program crashed, WinDbg stopped and allowed me to debug the program. I took a crash dump for further investigation with a command ".dump /ma". The program was compiled as "Any CPU" and I used WinDbg x64 to take the dump. Now I open WinDbg x64 on the same computer again and open the crash dump. Here is what it says: Loading Dump File [C:\crashdump.dmp] User Mini Dump File

WinDBG 添加双机调试

孤街浪徒 提交于 2019-11-28 17:18:38
WinDbg 是微软旗下的一款免费的源码级调试工具,WinDbg通常可用于调试用户态和内核态,还可以调试Dump文件,尤其是在调试内核问题时,目前也只有WinDbg能够做到调试内核进程,而且,双机调试可以调试到系统启动阶段和之后任意时刻的问题,这是其他调试器都做不到的。 来源: https://www.cnblogs.com/LyShark/p/11416016.html

How to write a sample code that will crash and produce dump file?

眉间皱痕 提交于 2019-11-28 16:45:13
I started learned windbg and I found this good post How to use WinDbg to analyze the crash dump for VC++ application? Now I want to follow the instructions and do it step by step. Here is the problem: I need to write some sample code that can immediately crash, and create some dump files that can be used by windbg. How to write such code? void Example4() { int* i = NULL; *i = 80; } The above code will crash immediately; however, I don't know where to find the dump file? Thank you #include <Windows.h> #include <Dbghelp.h> void make_minidump(EXCEPTION_POINTERS* e) { auto hDbgHelp = LoadLibraryA(

Windbg程序调试系列-索引篇

安稳与你 提交于 2019-11-28 16:28:46
生产环境(基于docker)故障排除? 有感于博客园三番五次翻车 https://www.cnblogs.com/JulianHuang/archive/2019/08/19/11365593.html   如题,有感于博客园最近多次翻车,感觉像胡子眉毛一把抓, 定位不了生产环境的问题。 抛开流程问题,思考在生产环境中如何做故障排除, 发现博客园里面这方面的文章比较少。 . Net 本身是提供了相关工具帮助我们在生产中故障排除: https://docs.microsoft.com/en-us/dotnet/framework/tools/sos-dll-sos-debugging-extension 工具的思路是在生产环境中dump出进程快照文件,通过分析快照堆栈、线程信息、异常信息判断运行状态。 这个工具依赖的文件很多很杂,国外大牛已经针对 .NetCore 制作了 工具镜像 How to Use # docker run --rm -it -v /stripe/upload/coredump:/tmp/coredump 6opuc/lldb-netcore /stripe/upload/coredump - docker宿主机上崩溃进程的coredump文件路径 Usecases # Analyze running container #   1.找到需要分析的容器id

Windbg命令的语法规则系列(二)

半城伤御伤魂 提交于 2019-11-28 15:06:10
二、字符串通配符语法 一些调试器命令具有接受各种通配符的字符串参数。这些类型的参数支持以下语法功能: 星号(*)表示零个或多个字符。 问号(?) 表示任何单个字符。 包含字符列表的括号([])表示列表中的任何单个字符。列表中只有一个字符匹配。 在这些括号中,可以使用连字符(-)指定范围。 例如,prog[er-t7]am匹配“progeam”、“program”、“progsam”、“progtam”和“prog7am”。 数字符号(#)表示前面零个或多个字符。例如,lo#p与“lp”、“lop”、“loop”、“loop”等匹配。您还可以将数字符号与括号组合,因此m[ia]#n与“mn”、“min”、“man”、“maan”、“main”、“mian”、“miin”、“miain”等匹配。 加号(+)表示前面的一个或多个字符。例如,lo+p与lo p相同,只是lo+p与“lp”不匹配。同样,m[ia]+n与m[ia]n相同,只是m[ia]+n与“mn”不匹配。A?+B和A*B一样,除了A?+B与“AB”不匹配。 如果必须指定文字数字符号(#),问号(?),左括号([),右括号(]),星号(*)或加号(+)字符,必须在字符前面添加反斜杠(\)。如果不将连字符括在括号中,则连字符始终是文字。但不能在带括号的列表中指定文字连字符。 指定符号的参数还支持一些附加功能。

.loadby not work, but .load works well

馋奶兔 提交于 2019-11-28 14:46:42
When I try to use windbg, .load C:\Windows\Microsoft.NET\Framework64\v4.0.30319\SOS.dll works perfectly to load SOS extension. But when I tried to used the suggested pattern .loadby SOS OR .loadby sos.dll I could only got a error message saying "Syntax error in extension string". I tried to googled this error message, but nothing useful found. Any suggestions ? .loadby needs another argument to define where by is. From WinDbg help: .loadby DLLName ModuleName DLLName Specifies the debugger extension DLL to load. If you use the .load command, DLLName should include the full path. If you use the