摘要:类比第1部分-一般内存使用 32位系统上的进程通常可以寻址2GB的虚拟地址空间。这是你必须使用的内存,与你有多少内存无关。更多的RAM有助于提高性能,因为使用更多RAM可以减少页面数量,但对于扩展2GB地址空间没有任何作用。想象一下这个2GB地址空间是一家餐厅的占地面积。当你分配一个对象(无论它是.
阅读全文
摘要:大多数情况下,方法都很短,只需知道你在哪个函数中出现了异常,就足以让你找出原因,但我们都知道,我们并不是生活在这样一个完美的世界里:我们编写的是完全模块化的应用程序,所有的东西都排列得很整齐:)假设你在堆上发现了这个异常。。。 0:025> !dumpobj 02b7191c Name: Syste
阅读全文
摘要:当你你有1000个w3wp.exe文件在eventviewer中意外停止,或者您的进程以某种奇怪的未定义方式退出,您不知道原因。当一个进程崩溃或退出时,将触发一个称为EPR(Exit process)的特殊事件,因此使用类似于windbg.exe文件我们可以附加到进程中,等待epr被抛出,然后进行内
阅读全文
摘要:到目前为止,!dumpheap 是调试托管内存泄漏时最强大的命令。它将向您显示托管堆上的所有对象,并使用的不同开关你可以用你想要的任何方式显示输出。!dumpheap是sos.dll框架安装附带的扩展(在framework目录中),如果安装了SDK,则可以在C:\Program files\ Mic
阅读全文
摘要:这并不是说它很重要,而是因为它是我的一个大麻烦,我想区分真正的内存泄漏和高内存使用率。内存泄漏是指您使用了一些内存并且丢失了指向分配的指针,因此您无法再取消分配该内存。如果你仍然有一个指向它的指针,你的内存使用率很高,这可能与进程发生的情况一样糟糕,但仍然不同。为了简单起见,我将从现在开始对这两个问
阅读全文
摘要:下面这个程序有一个bug,试试看你能不能抓住它。 Test.cs (编译成 DelegateExample.exe): using System; using System.Threading; using System.Runtime.InteropServices; class Test { d
阅读全文
摘要:了解对象在gc堆中的布局是很有用的。在垃圾收集期间,有效的对象是通过递归访问对象来标记的,这些对象从堆栈的根和句柄开始。但是,从每个堆段的开始到结束,对象的位置以一种有组织的方式排列也很重要。!DumpHeap命令依赖于这个逻辑组织来正确地遍历堆,如果它报告了一个错误,可以打赌您的堆出了问题。 下面
阅读全文
摘要:众所周知,在CLR中,内存管理是由垃圾收集器(GC)完成的。当GC在新对象的预分配内存块(GC堆)中找不到内存,并且无法从操作系统预订足够的内存来扩展GC堆时,它抛出OutOfMemoryException(OOM)。 问题 我不时听到关于OOM的抱怨——人们分析代码并监控内存使用情况,发现有时当有
阅读全文
摘要:为了回答这个问题,我们需要讨论几个概念。在32位系统上工作时,可以寻址4GB内存,其中2GB通常保留给操作系统,每个用户模式进程(如w3)允许有2GB内存wp.exe文件(asp.net)例如。这个内存称为虚拟内存,2GB是2GB,与系统中添加的RAM数量无关。RAM的数量只是决定了你需要做多少分页
阅读全文
摘要:在过去,我研究了一个支持案例,我需要找出C++应用程序中的一些消息框是否被显示,如果是肯定的,消息是什么。每次我问用户时得到的回答都不一致,所以我不知道是否出现了MessageBox或消息是什么。这听起来像是另一个完美的场景,脚本可能会有所帮助!事实上,这对我帮助很大,我希望对你也有帮助。这个脚本映
阅读全文
摘要:好的,假如正在调试一个.NET应用程序。您需要找出从访问数据库的线程执行的查询和存储过程,但是您不知道如何。好消息!这已经不是问题了!此脚本显示与SQLCommand或OracleCommand对象关联的所有查询或存储过程。此外,您可以单击它以获取更多详细信息和使用它的线程。。以下是截图: Sour
阅读全文
摘要:Windbg有很多命令和命令变体,因此有时您可能会忘记其中的一些命令,比如当您需要挖掘调用堆栈以提取更多信息时。或者您可能记得获取调用堆栈详细信息的命令,但您需要确保获得整个堆栈。或者,您可能需要一种快速挖掘堆栈的方法,首先从帧中获取信息,然后从局部变量获取信息,而无需花费太多时间键入命令或使用箭头
阅读全文
摘要:如果您像我一样,您可能会忘记需要查找某些特定信息的类和名称空间。或者你忘了要查找的字段名。例如当我需要从System.Data.SqlClient命名空间查找信息。此脚本从连接检索特定信息。扩展它也很容易,因此可以使用相同的方法从其他名称空间和字段中提取信息。就个人而言,我更喜欢基于DML(调试标记
阅读全文
摘要:使用Microsoft Visual Studio 进行调试时,在打开托管调试的情况下从.NET项目进行调试时,您可能会受到各种不真正关心的异常的困扰。以下是如何设置你的环境来忽略那些愚蠢的东西,并保留好的东西。 具体内容: 勾选(在方框中打勾)两列中的所有类别。 选中然后取消选中托管调试助手以强制
阅读全文
摘要:我不断遇到使用strcpy、sprintf、strncpy、_snprintf(仅限Microsoft)、wcsncpy、swprintf和等效的函数的代码。请停下来。还有一些更安全的选择,而且它们实际上需要更少的输入。这篇文章的重点是固定大小的字符串缓冲区,但是这种技术适用于任何类型的固定长度缓冲
阅读全文
摘要:Windows错误报告(WER)提供了许多设置来自定义问题报告体验。所有这些设置都可以使用组策略进行设置。有些还可以在Windows 7、Windows 8的操作中心或Windows Vista的问题报告和解决方案中进行更改。WER设置位于以下注册表子项之一: HKEY_CURRENT_USER\S
阅读全文
摘要:我们都知道,C++的类成员函数调用离不this指针,this指针其实是作为隐形参数传递到成员函数的,VC++编译器是借助ecx寄存器来传递的。也正式这一点,很多调试器借助它来获取this指针。 在我们正向单步调试时,Windbg可以正确获取到this指针 0:000> dx Debugger.Ses
阅读全文
摘要:分析是一种强大的VisualC++特性,可以帮助发现bug。然而,它有时忽略了关键问题。在这篇简短的文章中,我描述了一个有趣的危险模式,它无法识别,并解释了一个真正的解决方法。 这些测试都是用Visual Studio 2010 SP1,C/C++优化编译器版本16.00 .40219.01为80×
阅读全文
摘要:分析是一种强大的VisualC++特性,可以帮助发现bug。然而,它有时会在不存在问题的情况下发现问题。不幸的是,这些误报,就像这里报道的那样,使/分析变得不那么有用,因为严重的错误最终会被“狼”的叫声淹没。在这篇文章中,我描述了另一个令人沮丧的误报,它展示了一个编译器完全无法理解别名的例子。 Vi
阅读全文
摘要:像/analyze这样的静态分析工具必须在报告警告时过于激进(导致过多的误报)和过于胆小(导致过多的误报)之间保持微妙的平衡。我不能分析这些错误,因为我不能分析这些错误。这两个警告在使用gcc生成时都会显示,但在使用visualstudio的/analyze时则不会显示。 返回局部变量地址 第一个很
阅读全文
摘要:分析是一种强大的VisualC++特性,可以帮助发现bug。然而,它使用了一些相当奇特的启发式方法,这使得很难决定如何认真对待它的警告。今天我们将讨论其中一种特殊的启发式方法,并展示一个案例,其中/analyze是完全错误的。这些特殊的警告大多在VS2012中修复。在我与微软分享的repro项目中,
阅读全文