摘要:我最近花了一些时间分析OutputDebugString方法。在我的另一个实验中,我需要一个仅依赖于本机API的OutputDebugString版本。在实现它的过程中,我发现了一些关于OutputDebugString的有趣的事实,也许您也会感兴趣。 OutputDebugString的工作原理
阅读全文
摘要:简介 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
阅读全文