上一页 1 2 3 4 5 6 ··· 19 下一页

2021年7月22日

windbg如何让.cmdtree自动执行?

摘要: .cmdtree命令(WinDbg常用命令系列 .cmdtree)的功能给我们带来了方便,但在使用中,你会发现每当退出调试后,在启动调试,还得必须执行一次.cmdtree命令。这其实也有点繁琐。 这个问题其实很好解决,通过设置windbg快捷方式属性即可: 阅读全文

posted @ 2021-07-22 15:39 活着的虫子 阅读(118) 评论(0) 推荐(0) 编辑

2021年5月24日

缩减Windbg的子窗口

摘要: Windbg偶尔会自动缩减新开的窗口,这有时会让我们烦恼。如果你想回到默认窗口布局,可以通过如下操作: 菜单File\Delete Workspace删除被调试进程所保持的工作区 如果你不满意所有会话窗口布局,但又不无法直接关闭程序,可以手动删除如下注册表项后重启Windbg: USER\Softw 阅读全文

posted @ 2021-05-24 19:33 活着的虫子 阅读(137) 评论(0) 推荐(0) 编辑

2020年12月30日

从失败终止到崩溃

摘要: 一个失败的终止 撞车事故时有发生。任何比“Hello world”更复杂的程序都可能有一些bug。专业软件开发的一个衡量标准是如何处理这些崩溃。程序应该保存一个崩溃转储,然后自杀(TerminateProcess()或_exit(),而不是ExitProcess()或exit())。 你不想让这个注 阅读全文

posted @ 2020-12-30 08:01 活着的虫子 阅读(400) 评论(0) 推荐(0) 编辑

2020年12月29日

DumpConfigurator Utility工具

摘要: 今天我将讨论一个简单但功能强大的GUI工具,用于本地或远程配置Windows系统进行内存转储。工具的名称是DumpConfigurator它可以从CodePlex访问。 该工具可用于当前支持的所有Windows操作系统版本。下载后,请使用管理员权限启动它以获得以下UI: GUI是不言而喻的,所有设置 阅读全文

posted @ 2020-12-29 08:08 活着的虫子 阅读(292) 评论(0) 推荐(0) 编辑

2020年12月28日

使例外成为例外(而不是异常)

摘要: 在帮助客户调试问题的过程中,有些事情会反复出现,从而产生“痛点”。想到的主要问题是:线程、锁、内存、异常和性能。至少这些似乎是我参与的主要问题。除了例外,人们常常惊讶地发现,他们的应用程序中发生了多少他们不知道的异常。然而,对于微软的异常处理指南来说,一个很好的“切入点”是处理和聚焦异常。重要的是不 阅读全文

posted @ 2020-12-28 08:21 活着的虫子 阅读(139) 评论(0) 推荐(0) 编辑

2020年12月25日

用于可视化虚拟内存使用情况和GC堆使用情况的工具。

摘要: 我发现一个很棒的工具,可以很好地显示进程中的内存使用情况。这个示例工具将为您提供虚拟内存空间的直观概述(从内存转储),显示您的分配存在于何处以及您拥有的分配类型。例如,在下面的屏幕截图中,您可以看到在内存空间的开始,我们有大量的虚拟分配(深绿色-已提交,浅绿色-保留),然后我们有大量的可用空间(白色 阅读全文

posted @ 2020-12-25 10:18 活着的虫子 阅读(350) 评论(0) 推荐(0) 编辑

2020年12月24日

关于EEMessageException异常

摘要: 您看到的是一个非托管异常,它在CLR中引发。它是非常通用的,用于在深入本机代码时发出错误条件的信号。名称的“消息”部分是为Microsoft测试人员设计的。只需等待这个异常变成一个托管异常。如果是良性的话就被吞下去。或者取消选中Project+Properties,Debugging,Enable 阅读全文

posted @ 2020-12-24 07:57 活着的虫子 阅读(467) 评论(0) 推荐(0) 编辑

2020年12月23日

c#/C++混合编程的一个问题

摘要: 有一天,我在调试一个问题,在一个进程上弹出一个Waston对话框。让我吃惊的是,在Waston触发的堆栈上,有一个带有Testcatch(…)块的非托管C++函数。据我理解,此块应该捕获Windows中抛出的任何用户模式异常,包括来自RaiseExceptionr调用(例如,C++异常)、AV、堆栈 阅读全文

posted @ 2020-12-23 08:11 活着的虫子 阅读(172) 评论(0) 推荐(0) 编辑

2020年12月22日

关于std::__non_rtti_object异常

摘要: 什么是std::__non_rtti_object异常? 不是一个RTTI对象异常 继承关系: __non_rtti_object : public bad_typeid 备注 当指针指向的是一个无效的对象,引发此异常。例如,它是一个错误的指针,或者代码不是用/GR编译的 阅读全文

posted @ 2020-12-22 09:41 活着的虫子 阅读(615) 评论(0) 推荐(0) 编辑

2020年12月21日

仅通过转储来排除内存泄漏

摘要: 有时我们会遇到这样一个场景:一个进程正在使用大量内存,而此时我们能够获得的唯一数据就是用户转储。通常,来自umdh或xperf等工具的数据会更好,因为它们提供一段时间内的内存使用数据,并且可以包括调用堆栈信息。但是,umdh需要重新启动进程(这会丢失高内存使用率的状态),xperf需要安装Windo 阅读全文

posted @ 2020-12-21 08:05 活着的虫子 阅读(324) 评论(0) 推荐(0) 编辑

2020年12月18日

调试器不应该改变行为

摘要: 理想情况下,无论是否附加了调试器,应用程序都会执行相同的操作。这源于非常实际的动机: bug通常首先出现在调试器之外(一些测试失败),然后您只想在调试器下重新运行测试来重新生成问题。如果调试器更改了行为,这将妨碍您重新编程的能力。 另一方面,开发人员可以在IDE下开发代码,并通过在调试器下检查代码来 阅读全文

posted @ 2020-12-18 08:04 活着的虫子 阅读(133) 评论(0) 推荐(0) 编辑

2020年12月17日

关于调试内存泄漏的范例

摘要: 在本机代码中,内存由调用Malloc()/Free()的程序(或类似的api)显式管理。在托管代码中,有一个垃圾收集器(GC)。GC并不意味着您不再有内存泄漏。它只意味着运行时在运行时检测到对象不再可访问后的某个任意点为您调用Free()。这有效地在安全方面出错(不能释放对象),以避免悬空指针问题, 阅读全文

posted @ 2020-12-17 08:01 活着的虫子 阅读(170) 评论(0) 推荐(0) 编辑

2020年12月16日

捕获ADPlus CLR崩溃

摘要: 我想讨论一个我们都非常熟悉的场景。在过去的一年里你一直在拼命工作,在过去的几个月里,你甚至在晚上和周末工作。管理层对你的团队给予两周的休息,以感谢你的努力。但是现在你回到了办公室,你听到了来自你的技术支持部门的流言,说有些情况下你的应用程序因为神秘的原因在现场崩溃。你是做什么的?应用程序恰好是用通过 阅读全文

posted @ 2020-12-16 08:07 活着的虫子 阅读(195) 评论(0) 推荐(0) 编辑

2020年12月15日

关于异常System.OutOfMemoryException

摘要: 什么是System.OutOfMemoryException 没有足够的内存继续执行程序时引发的异常。 继承关系 Object Exception SystemException OutOfMemoryException 说明 OutOfMemoryException异常有两个主要原因: 您正试图将 阅读全文

posted @ 2020-12-15 08:30 活着的虫子 阅读(2801) 评论(0) 推荐(0) 编辑

2020年12月14日

记一次类型转换引发的崩溃

该文被密码保护。 阅读全文

posted @ 2020-12-14 07:56 活着的虫子 阅读(0) 评论(0) 推荐(0) 编辑

2020年12月11日

从托管调试器的角度看模块与程序集

摘要: 虽然从加载程序和部署的角度来看,托管程序集可能非常有趣,但对于调试器来说,它们并没有什么真正的意义。调试器更关心模块: -关键是调试功能与模块关联。从调试器的角度来看,程序集的行为类似于模块的属性,而不是模块的容器。 -模块与Key file是1:1,如.exe和.dll文件 -模块与pdb是1:1 阅读全文

posted @ 2020-12-11 07:52 活着的虫子 阅读(91) 评论(0) 推荐(0) 编辑

2020年12月10日

为什么托管调试API不公开终结器线程?

摘要: 这是个公平的问题。部分原因是我们不相信人们能正确地使用它。我们发现人们问的主要原因是:1) 用户好奇心:用户只想在调试时知道这些琐事。当调试你认为是单线程应用程序时,你会在VSThreads窗口中看到6个线程,你想知道原因。请参阅Steve关于为调试器命名线程的帖子。不幸的是,CLR没有命名终结器线 阅读全文

posted @ 2020-12-10 08:35 活着的虫子 阅读(82) 评论(0) 推荐(0) 编辑

2020年12月9日

调试器和版本控制

摘要: “托管调试器(如Visual Studio)的哪些版本可以调试哪些版本的CLR?怎么办?”这是调试器版本控制的基本问题。以下是从版本控制的角度来看的“调试堆栈”,包括每个层之间的协议和进程边界: 用户源代码协议:由编译器处理的源语言。 编译器/调试对象进程边界 正在调试的用户应用程序。协议:IL操作 阅读全文

posted @ 2020-12-09 07:49 活着的虫子 阅读(93) 评论(0) 推荐(0) 编辑

2020年12月8日

使用WinDBG和PowerShell自动分析大量的小型转储文件

摘要: 当调试代码中的一个讨厌的问题时,你能得到的最有用的东西之一就是一个小型转储。当你的应用程序在崩溃、挂起或内存开始激增时,你得到了一个很大的提示,可以开始你的探索。虽然有很多工具,比如奇妙的prodump,以及调试器自己来创建小转储,但真正的关键时刻是您必须查看这些小型转储。一个或两个很容易做到,但是 阅读全文

posted @ 2020-12-08 07:51 活着的虫子 阅读(315) 评论(0) 推荐(1) 编辑

2020年12月7日

查找非托管异常的来源

摘要: 有时,您会查看异常抛出后处理程序中的调用堆栈。如果附加到弹出watson对话框的未处理异常,这是非常常见的。它可能看起来像: kernel32!WaitForSingleObject+0xf devenv!DwCreateProcess+0xbb devenv!fExceptionHandling+ 阅读全文

posted @ 2020-12-07 08:22 活着的虫子 阅读(168) 评论(0) 推荐(0) 编辑

2020年12月4日

如何判断函数是否是托管代码?

摘要: 对于纯C#应用来说,这是一个没有实际意义的问题,但是如果你用MC++(或其他一些“混合”语言)编写,并且你想知道一个函数是被编译成托管代码还是本机代码呢?您可以尝试检查源代码并根据语言规则进行推断。例如,在MC++中,查找#pragma managed/#pragma unmanaged。然而,这是 阅读全文

posted @ 2020-12-04 08:04 活着的虫子 阅读(175) 评论(0) 推荐(0) 编辑

2020年12月3日

关于std::length_error异常

摘要: 什么是std::length_error异常 长度错误。它报告由于试图超出某些对象的实现定义的长度限制而导致的错误。一般由std::basic_string和std::vector::reserve等成员函数抛出。 继承关系 异常结构填充 ExceptionAddress: 747cc5af (KE 阅读全文

posted @ 2020-12-03 08:13 活着的虫子 阅读(7078) 评论(0) 推荐(0) 编辑

2020年12月2日

如何调试仅我代码?

摘要: 有时开发人员只想调试他们编写的代码,而不想调试应用程序中的第三方代码(如框架和库)。当用户和非用户代码在彼此之间来回调用时,这一点尤其有用。clr调试服务有许多新特性来支持这一点,我们称之为“Just My Code”(JMC)调试。 允许调试器将每个函数标记为用户代码或非用户代码。由调试器决定哪些 阅读全文

posted @ 2020-12-02 07:41 活着的虫子 阅读(527) 评论(0) 推荐(0) 编辑

2020年12月1日

托管调试中的对象标识

摘要: 问题是:也许您在调试时浏览了全局、局部或参数,然后通过一些丑陋的对象引用(如哈希表)来查找对象引用。你希望能在那个物体上获得一些身份,这样你就可以很容易地再次找到它。以后重新查找它可能不实际,特别是如果程序状态自上次以来已更改,以致原始步骤不再生成相同的对象。如果一个数据结构被更改,一个变量被重新分 阅读全文

posted @ 2020-12-01 10:27 活着的虫子 阅读(77) 评论(0) 推荐(0) 编辑

2020年11月30日

Image Header vs. File Timestamps.

摘要: 人们可以使用术语“模块时间戳”来表示文件时间戳和Image头时间戳。虽然他们通常非常接近,但他们是不同的,不会是相同的。下面是一个比较/对比: File timestamp Image header timestamp What is it? This is tracked by the file 阅读全文

posted @ 2020-11-30 08:12 活着的虫子 阅读(164) 评论(0) 推荐(0) 编辑

2020年11月27日

无法在互操作调试上进行编辑并继续进

摘要: 有人在论坛上问过关于在混合模式下编辑并继续(EnC)的问题。不能在启用混合模式(interop)调试的情况下使用托管EnC。这是CLR调试服务的一个限制。互操作调试和EnC都是复杂的特性;将它们结合起来将是一个巨大的测试矩阵,而且成本非常高。因此,如果你有C和本地C++解决方案,你的选择是: 如果只 阅读全文

posted @ 2020-11-27 07:58 活着的虫子 阅读(120) 评论(0) 推荐(0) 编辑

2020年11月26日

!clrstack未显示任何方法名

摘要: !clrstack输出,如下所示: 0:019> !clrstack OS Thread Id: 0x5d0 (19) ESP EIP 0f31f340 7c80bef7 [HelperMethodFrame_1OBJ: 0f31f340] 0f31f398 1449167a 0f31f3c4 14 阅读全文

posted @ 2020-11-26 08:58 活着的虫子 阅读(334) 评论(0) 推荐(0) 编辑

2020年11月25日

!dumpheap参数和SOS帮助系统的一些一般信息

摘要: 什么是 !dumpheap? !dumpheap是来自SOS扩展的命令,用于转储托管堆的内容。您可以获得堆上当前活动的所有托管对象的所有地址和一些附加信息。在WinDbg的最后两个版本中,SOS实际上被PSSCOR取代,它有一个很好的帮助系统。对于大多数命令,您只需键入“!help commandN 阅读全文

posted @ 2020-11-25 07:53 活着的虫子 阅读(1149) 评论(0) 推荐(0) 编辑

2020年11月24日

WinDbg Script---显示RCW对象引用的COM对象

摘要: 在调试.NET应用程序中的转储文件时,有时我们可能会遇到这样的情况:我们希望得到引用RCW对象的System.__ComObject包装器引用的COM对象。你可能会认为抛弃这个系统。也许你能给出答案,但事实并非如此。 如下例子 Name: System.__ComObject MethodTable 阅读全文

posted @ 2020-11-24 08:05 活着的虫子 阅读(282) 评论(0) 推荐(0) 编辑

2020年11月23日

为什么不能将2个调试器附加到1个进程

摘要: 对于纯托管和纯本机调试,只能将1个调试器附加到进程。为什么?本机调试器从托管调试器下面窃取调试事件。这会混淆托管调试器并导致其崩溃。本机调试器无法与托管调试器协调。 执行此操作时遇到的问题:在windows中,操作系统强制一次只能将一个本机调试器附加到调试对象(已调试进程的DebugActivePr 阅读全文

posted @ 2020-11-23 08:51 活着的虫子 阅读(360) 评论(0) 推荐(0) 编辑

2020年11月20日

什么是互操作调试(Interop-Debugging)?

摘要: Interop-Debugging,互操作调试,又称混合调试。 一般调试背景当调试进程时,它会生成调试事件,调试器可以监听和响应这些事件。这些事件包括CreateProcess、LoadModule、异常、ExitThread、断点等。调度调试事件时,调试对象将停止,直到调试器继续调试事件为止。当调 阅读全文

posted @ 2020-11-20 08:11 活着的虫子 阅读(262) 评论(0) 推荐(0) 编辑

2020年11月19日

为什么托管调试与本机调试不同?

摘要: 人们会问“为什么本机调试器不能调试托管代码?”.原因是CLR提供了许多在典型的本地C++应用程序中所获得的酷服务,例如:运行在虚拟机/JITEN、动态类布局、类型系统、垃圾收集、反射等等。每一个都对调试器提出了特殊的挑战。换句话说,一个完成了所有这些功能的本地应用程序根本无法与传统的本地调试器进行调 阅读全文

posted @ 2020-11-19 16:30 活着的虫子 阅读(246) 评论(0) 推荐(0) 编辑

2020年11月18日

在WinDBG中管理源代码窗口

摘要: 如果您使用了WinDBG源代码调试功能,您可能会发现,每当您在调试中遇到一个与尚未打开的WinDBG文件中的源代码相关的点时,都会打开另一个源代码窗口,这很烦人。这导致了大量的源窗口和一组不断重新排列的窗口。 如果您进入View->Options,并将“打开此多个后重用”选项设置为1,而不是默认值( 阅读全文

posted @ 2020-11-18 08:36 活着的虫子 阅读(382) 评论(0) 推荐(0) 编辑

2020年11月17日

如何从转储文件确定 /LARGEADDRESSAWARE

摘要: 有时在调试时,您希望知道某个特定进程是否使用 /LARGEADDRESSAWARE标志链接,从而能够使用高于2Gb边界的用户模式地址。我的解决方案是:!address -summary将显示进程的有效用户模式地址空间:0:022> !address –summary.. Tot: 7fff0000 阅读全文

posted @ 2020-11-17 08:28 活着的虫子 阅读(485) 评论(0) 推荐(0) 编辑

2020年11月16日

Dump文件数据存储格式(九)

摘要: 十一、系统内存信息流(SystemMemoryInfoStream) SystemMemoryInfoStream包含系统内存管理的一些信息,它紧随在UnloadedModuleListStream流的后面。UnloadedModuleListStream的信息如下: 0x91f8+0n324=0x 阅读全文

posted @ 2020-11-16 08:37 活着的虫子 阅读(376) 评论(0) 推荐(1) 编辑

2020年11月13日

Windbg命令系列---!cpuid(CPU信息)

摘要: !cpuid扩展命令显示有关系统上处理器的信息。 语法 !cpuid [Processor] 参数 Processor 指定将显示其信息的处理器。如果忽略此参数,则显示所有处理器。 DLL Windows 2000 Ext.dll Windows XP and later Ext.dll 备注 !c 阅读全文

posted @ 2020-11-13 10:18 活着的虫子 阅读(795) 评论(0) 推荐(0) 编辑

2020年11月12日

Windbg命令系列---!chkimg

摘要: !chkimg扩展命令通过将可执行文件的映像与符号存储库或其他文件存储库上的副本进行比较来检测可执行文件映像中的损坏。 语法 !chkimg [Options][-mmw LogFile LogOptions] [Module] 参数 Options 以下选项的任意组合: -pSearchPath 阅读全文

posted @ 2020-11-12 08:34 活着的虫子 阅读(770) 评论(0) 推荐(0) 编辑

2020年11月11日

Windbg命令系列---!dh(显示PE头信息)

摘要: !dh扩展指令显示指定模块Image的头信息。相当于一个弱化的dumpbin工具。 语法 !dh [Options]Address !dh -h 参数 Options 以下任一选项: -f 显示文件头。 -s 显示节头。 -a 显示所有头信息. Address 指定Image的十六进制地址。 -h 阅读全文

posted @ 2020-11-11 08:33 活着的虫子 阅读(1103) 评论(0) 推荐(0) 编辑

2020年11月10日

Windbg命令系列---.exptr(显示异常指针)

摘要: exptr命令显示EXCEPTION_POINTERS结构。 语法 .exptr Address 参数 Address 指定EXCEPTION_POINTERS结构的地址。 环境 Modes User mode, kernel mode Targets Live, crash dump Platfo 阅读全文

posted @ 2020-11-10 07:58 活着的虫子 阅读(589) 评论(0) 推荐(0) 编辑

2020年11月9日

Dump文件数据存储格式(八)

摘要: 十、已卸载模块列表流(UnloadedModuleListStream) UnloadedModuleListStream流包含卸载模块的模块信息。跟随在ModuleListStream的后面。ModuleListStream相关信息如下: 0x29c0+0n26680=0x91f8 而Unload 阅读全文

posted @ 2020-11-09 08:36 活着的虫子 阅读(437) 评论(1) 推荐(0) 编辑

上一页 1 2 3 4 5 6 ··· 19 下一页

导航