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

2020年9月9日

又是兼容性,但确不一样

摘要: 正在悠哉,突然支持的同事过来说,某个用户软件启动不了了。详细情况是:由于出现某些问题,支持同事给这个客户重装了软件,然后就启动不了了,后来把安装目录改了名字,就能运行了。虽然客户能用了,但我很不理解为什么改了个目录名就能运行呢。于是恢复现场,重现故障,不管37二十一,抓个dmp先。 用windbg打 阅读全文

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

2020年9月8日

在你试图找到解决办法之前,先了解你的问题

摘要: 到目前为止,我还没有写过一篇博客文章,给出关于做绩效工作的哲学建议。但是最近我想也许是时候写这样一个条目了,因为我见过很多人认真地看一些性能计数器(通常是不正确的)或其他数据,并问了很多问题,比如“这个分配率太高了吗?”,“在我看来它太高了。”或者“我的size太大了,对吧?",在他们没有足够的证据 阅读全文

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

2020年9月7日

!eeheap -gc 和 !address输出的关联性

摘要: !address是一个非常强大的调试器命令。它向您显示了您的虚拟地址空间的确切分布。 如果你已经从 !sos.eeheap -gc命令得到了输出,例如: 0:003> !eeheap -gc Number of GC Heaps: 1 generation 0 starts at 0x0124507 阅读全文

posted @ 2020-09-07 08:24 活着的虫子 阅读(523) 评论(0) 推荐(0) 编辑

2020年9月4日

我的应用似乎卡死了。我该怎么办?

摘要: 定义“卡死”是一个很好的起点。有时又叫"挂起",英文叫"hang"。当人们说“卡死”时,他们可能意味着各种各样的事情。当我说“卡死”时,我的意思是进程没有进展——进程中的线程要么被阻塞(例如死锁,要么因为来自其他进程的线程而没有被调度),要么正在执行代码(疯狂地)但没有做有用的工作(例如无限循环,或 阅读全文

posted @ 2020-09-04 07:57 活着的虫子 阅读(591) 评论(0) 推荐(0) 编辑

2020年9月3日

使用正确的工具进行调试

摘要: 当你需要调试/调查问题时,我想指出的一个非常强大的工具是你的调试器(如果你的调试器也是windbg/cdb,那就是对了,因为这就是我要用的,这也是我在本文中将要讨论的)。对于那些对研究内存相关问题感兴趣的人来说,无论是因为你不喜欢当前应用程序的内存使用情况,还是只是想提高,学习使用调试器都是非常宝贵 阅读全文

posted @ 2020-09-03 07:53 活着的虫子 阅读(296) 评论(0) 推荐(0) 编辑

2020年9月2日

平衡GC线程上的工作

摘要: 在server gc中,每个GC线程都将并行地在其堆上工作(这是一个简单化的视图,不一定对所有阶段都适用,但在较高的层次上,这正是并行GC的概念)。因此,仅此一项就意味着工作已经在GC线程之间被分割了。但是,由于某些阶段的GC工作只能在所有线程完成其最后一个阶段之后才能继续(例如,在所有GC线程都完 阅读全文

posted @ 2020-09-02 08:03 活着的虫子 阅读(228) 评论(0) 推荐(0) 编辑

2020年9月1日

使用WinDbg调查.NET异常(编译和加载异常)

摘要: 所有.NET异常都源于System.Exception以及以下成员变量。 Data HelpLink InnerException Message Source StackTrace TargetSite 除了这些基本信息之外,System.Exception通常会添加一些成员变量,它们在其中存储特 阅读全文

posted @ 2020-09-01 07:45 活着的虫子 阅读(752) 评论(0) 推荐(1) 编辑

2020年8月31日

.NET内存使用-一个餐厅类比

摘要: 类比第1部分-一般内存使用 32位系统上的进程通常可以寻址2GB的虚拟地址空间。这是你必须使用的内存,与你有多少内存无关。更多的RAM有助于提高性能,因为使用更多RAM可以减少页面数量,但对于扩展2GB地址空间没有任何作用。想象一下这个2GB地址空间是一家餐厅的占地面积。当你分配一个对象(无论它是. 阅读全文

posted @ 2020-08-31 07:55 活着的虫子 阅读(263) 评论(0) 推荐(0) 编辑

2020年8月28日

.Net异常-跟踪异常在代码中发生的位置

摘要: 大多数情况下,方法都很短,只需知道你在哪个函数中出现了异常,就足以让你找出原因,但我们都知道,我们并不是生活在这样一个完美的世界里:我们编写的是完全模块化的应用程序,所有的东西都排列得很整齐:)假设你在堆上发现了这个异常。。。 0:025> !dumpobj 02b7191c Name: Syste 阅读全文

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

2020年8月27日

到底是什么原因导致我的进程崩溃?

摘要: 当你你有1000个w3wp.exe文件在eventviewer中意外停止,或者您的进程以某种奇怪的未定义方式退出,您不知道原因。当一个进程崩溃或退出时,将触发一个称为EPR(Exit process)的特殊事件,因此使用类似于windbg.exe文件我们可以附加到进程中,等待epr被抛出,然后进行内 阅读全文

posted @ 2020-08-27 13:58 活着的虫子 阅读(1613) 评论(0) 推荐(0) 编辑

2020年8月26日

!dumpheap –stat的解释(debugging .net leaks)

摘要: 到目前为止,!dumpheap 是调试托管内存泄漏时最强大的命令。它将向您显示托管堆上的所有对象,并使用的不同开关你可以用你想要的任何方式显示输出。!dumpheap是sos.dll框架安装附带的扩展(在framework目录中),如果安装了SDK,则可以在C:\Program files\ Mic 阅读全文

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

2020年8月25日

内存泄漏了!!!我该怎么办

摘要: 这并不是说它很重要,而是因为它是我的一个大麻烦,我想区分真正的内存泄漏和高内存使用率。内存泄漏是指您使用了一些内存并且丢失了指向分配的指针,因此您无法再取消分配该内存。如果你仍然有一个指向它的指针,你的内存使用率很高,这可能与进程发生的情况一样糟糕,但仍然不同。为了简单起见,我将从现在开始对这两个问 阅读全文

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

2020年8月24日

SOS扩展系列---利用SOS计算变量生存期

摘要: 下面这个程序有一个bug,试试看你能不能抓住它。 Test.cs (编译成 DelegateExample.exe): using System; using System.Threading; using System.Runtime.InteropServices; class Test { d 阅读全文

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

2020年8月21日

遍历GC堆

摘要: 了解对象在gc堆中的布局是很有用的。在垃圾收集期间,有效的对象是通过递归访问对象来标记的,这些对象从堆栈的根和句柄开始。但是,从每个堆段的开始到结束,对象的位置以一种有组织的方式排列也很重要。!DumpHeap命令依赖于这个逻辑组织来正确地遍历堆,如果它报告了一个错误,可以打赌您的堆出了问题。 下面 阅读全文

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

2020年8月20日

OutOfMemoryException和对象锁定

摘要: 众所周知,在CLR中,内存管理是由垃圾收集器(GC)完成的。当GC在新对象的预分配内存块(GC堆)中找不到内存,并且无法从操作系统预订足够的内存来扩展GC堆时,它抛出OutOfMemoryException(OOM)。 问题 我不时听到关于OOM的抱怨——人们分析代码并监控内存使用情况,发现有时当有 阅读全文

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

2020年8月19日

这个内存不足的家伙是谁?当我有足够的内存,为什么他让我的进程崩溃?

摘要: 为了回答这个问题,我们需要讨论几个概念。在32位系统上工作时,可以寻址4GB内存,其中2GB通常保留给操作系统,每个用户模式进程(如w3)允许有2GB内存wp.exe文件(asp.net)例如。这个内存称为虚拟内存,2GB是2GB,与系统中添加的RAM数量无关。RAM的数量只是决定了你需要做多少分页 阅读全文

posted @ 2020-08-19 08:14 活着的虫子 阅读(210) 评论(0) 推荐(0) 编辑

2020年8月18日

Windbg Script---跟踪MessageBox调用

摘要: 在过去,我研究了一个支持案例,我需要找出C++应用程序中的一些消息框是否被显示,如果是肯定的,消息是什么。每次我问用户时得到的回答都不一致,所以我不知道是否出现了MessageBox或消息是什么。这听起来像是另一个完美的场景,脚本可能会有所帮助!事实上,这对我帮助很大,我希望对你也有帮助。这个脚本映 阅读全文

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

2020年8月17日

Windbg Script---从.NET应用程序检索查询/存储过程

摘要: 好的,假如正在调试一个.NET应用程序。您需要找出从访问数据库的线程执行的查询和存储过程,但是您不知道如何。好消息!这已经不是问题了!此脚本显示与SQLCommand或OracleCommand对象关联的所有查询或存储过程。此外,您可以单击它以获取更多详细信息和使用它的线程。。以下是截图: Sour 阅读全文

posted @ 2020-08-17 07:58 活着的虫子 阅读(156) 评论(0) 推荐(0) 编辑

2020年8月14日

Windbg Script---挖掘调用堆栈

摘要: Windbg有很多命令和命令变体,因此有时您可能会忘记其中的一些命令,比如当您需要挖掘调用堆栈以提取更多信息时。或者您可能记得获取调用堆栈详细信息的命令,但您需要确保获得整个堆栈。或者,您可能需要一种快速挖掘堆栈的方法,首先从帧中获取信息,然后从局部变量获取信息,而无需花费太多时间键入命令或使用箭头 阅读全文

posted @ 2020-08-14 08:32 活着的虫子 阅读(326) 评论(0) 推荐(0) 编辑

2020年8月13日

Windbg Script---一个从连接池里查找信息的脚本

摘要: 如果您像我一样,您可能会忘记需要查找某些特定信息的类和名称空间。或者你忘了要查找的字段名。例如当我需要从System.Data.SqlClient命名空间查找信息。此脚本从连接检索特定信息。扩展它也很容易,因此可以使用相同的方法从其他名称空间和字段中提取信息。就个人而言,我更喜欢基于DML(调试标记 阅读全文

posted @ 2020-08-13 07:49 活着的虫子 阅读(237) 评论(0) 推荐(0) 编辑

2020年8月12日

VS里调试排除干扰(启用所有异常进行调试)

摘要: 使用Microsoft Visual Studio 进行调试时,在打开托管调试的情况下从.NET项目进行调试时,您可能会受到各种不真正关心的异常的困扰。以下是如何设置你的环境来忽略那些愚蠢的东西,并保留好的东西。 具体内容: 勾选(在方框中打勾)两列中的所有类别。 选中然后取消选中托管调试助手以强制 阅读全文

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

2020年8月11日

请停止使用strncpy

摘要: 我不断遇到使用strcpy、sprintf、strncpy、_snprintf(仅限Microsoft)、wcsncpy、swprintf和等效的函数的代码。请停下来。还有一些更安全的选择,而且它们实际上需要更少的输入。这篇文章的重点是固定大小的字符串缓冲区,但是这种技术适用于任何类型的固定长度缓冲 阅读全文

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

2020年8月10日

WER设置

摘要: Windows错误报告(WER)提供了许多设置来自定义问题报告体验。所有这些设置都可以使用组策略进行设置。有些还可以在Windows 7、Windows 8的操作中心或Windows Vista的问题报告和解决方案中进行更改。WER设置位于以下注册表子项之一: HKEY_CURRENT_USER\S 阅读全文

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

2020年8月7日

如何在dump文件里找到真正的类this指针

摘要: 我们都知道,C++的类成员函数调用离不this指针,this指针其实是作为隐形参数传递到成员函数的,VC++编译器是借助ecx寄存器来传递的。也正式这一点,很多调试器借助它来获取this指针。 在我们正向单步调试时,Windbg可以正确获取到this指针 0:000> dx Debugger.Ses 阅读全文

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

2020年8月6日

Visual Studio /analyze不好之处---漏报(四)

摘要: 分析是一种强大的VisualC++特性,可以帮助发现bug。然而,它有时忽略了关键问题。在这篇简短的文章中,我描述了一个有趣的危险模式,它无法识别,并解释了一个真正的解决方法。 这些测试都是用Visual Studio 2010 SP1,C/C++优化编译器版本16.00 .40219.01为80× 阅读全文

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

2020年8月5日

Visual Studio /analyze不好之处---漏报(三)

摘要: 分析是一种强大的VisualC++特性,可以帮助发现bug。然而,它有时会在不存在问题的情况下发现问题。不幸的是,这些误报,就像这里报道的那样,使/分析变得不那么有用,因为严重的错误最终会被“狼”的叫声淹没。在这篇文章中,我描述了另一个令人沮丧的误报,它展示了一个编译器完全无法理解别名的例子。 Vi 阅读全文

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

2020年8月4日

Visual Studio /analyze不好之处---漏报(二)

摘要: 像/analyze这样的静态分析工具必须在报告警告时过于激进(导致过多的误报)和过于胆小(导致过多的误报)之间保持微妙的平衡。我不能分析这些错误,因为我不能分析这些错误。这两个警告在使用gcc生成时都会显示,但在使用visualstudio的/analyze时则不会显示。 返回局部变量地址 第一个很 阅读全文

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

2020年8月3日

Visual Studio /analyze不好之处(一)

摘要: 分析是一种强大的VisualC++特性,可以帮助发现bug。然而,它使用了一些相当奇特的启发式方法,这使得很难决定如何认真对待它的警告。今天我们将讨论其中一种特殊的启发式方法,并展示一个案例,其中/analyze是完全错误的。这些特殊的警告大多在VS2012中修复。在我与微软分享的repro项目中, 阅读全文

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

2020年7月31日

Visual Studio /analyze的好处

摘要: Visual C++编译器的分析功能是提高代码质量的一个好方法。它基本上是一个21世纪的“lint”来识别许多编码错误。许多错误对于程序员来说是很难看到的,但是,通过对代码进行适当的注释,/analyze的不屈不挠的眼睛将可靠地找到它们。我最近在一个大型代码库上使用/analyze,发现了大约500 阅读全文

posted @ 2020-07-31 10:27 活着的虫子 阅读(734) 评论(0) 推荐(0) 编辑

2020年7月30日

符号杂谈

摘要: 符号服务器允许Windows上的开发人员工具自动查找符号。他们做得很好,以至于大多数开发人员都不必担心内部机制。然而,当事情出了问题时,了解它们是如何工作的是有帮助的,事实证明,这一切都非常简单。 我对Windows符号服务器的讨论利用了我笔记本电脑上的符号服务器,用于我自己的个人项目。每当我发布一 阅读全文

posted @ 2020-07-30 08:25 活着的虫子 阅读(418) 评论(0) 推荐(0) 编辑

2020年7月29日

当程序崩溃发生后,我做了如下工作

摘要: 这是一个相当简单的错误。使用字节计数而不是字符计数调用了宽字符串函数,从而导致缓冲区溢出。找到问题后,修复方法很简单,只需将sizeof更改为_countof,很容易的。但像这样的BUG浪费时间。由于崩溃,playtest被取消了,而且由于缓冲区溢出破坏了堆栈,因此找到错误代码并非易事。我知道这种类 阅读全文

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

2020年7月28日

Windows中的线程命名杂谈

摘要: Windows允许您为进程中的线程指定名称,然后调试器可以显示这些名称。这是一个很好的解决方案,但这是一个很好的解决方案。Windows 10 Creators更新(SetThreadDescription)中添加了一个新的线程命名API。Chrome现在使用SetThreadDescription 阅读全文

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

2020年7月27日

编写脚本增强windbg堆栈、内存窗口

摘要: 因为要频繁地使用windbg分析堆栈、参数、以及内存状态,但是windbg的界面跟OD、IDA差距是很大的, 对于漏洞分析或者其它用途来说,用它来分析堆栈、内存是很不方便的,需要多次手工输入命令。 为了简化分析工作,自己闲着蛋疼的时候写了两个脚本来增强windbg的这些功能。 准备:下载以下脚本kr 阅读全文

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

2020年7月24日

记一次托管内存耗尽而引起的空引用崩溃

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

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

2020年7月23日

VC++2013类内存布局变化,造成空间浪费

摘要: VC++编译器通常在编译器版本之间保持高度的二进制兼容性,允许对象在使用不同编译器版本的DLL之间传递。但是VS2013对64位版本中某些类的布局进行了更改。幸运的是,这只影响到一小部分类,如果你真的遇到了这个问题,有一个简单的解决方案。这个简单的解决方案还可以用于减少32位和64位构建中的类的大小 阅读全文

posted @ 2020-07-23 08:30 活着的虫子 阅读(219) 评论(0) 推荐(0) 编辑

2020年7月22日

如何调试---写给一0基础的同学

摘要: 了解如何调试是每个应用程序开发生命周期的一个关键方面。通过调试,开发人员不仅可以识别出发生了异常,还可以系统地遍历应用程序的执行,直到找到并修复罪魁祸首代码。无论解决方案是否需要修复一个小的错误,甚至需要重写系统中的大量组件,只要有足够的时间和人力,简单的调试操作就可以(最终)解决几乎所有问题。然而 阅读全文

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

2020年7月21日

关于STATUS_PRIVILEGED_INSTRUCTION(0xC0000096)异常

摘要: 简介 STATUS_PRIVILEGED_INSTRUCTION 应用程序执行了特权指令,值为0xC0000096。其定义如下: //// MessageId: STATUS_PRIVILEGED_INSTRUCTION//// MessageText://// {EXCEPTION}// Priv 阅读全文

posted @ 2020-07-21 08:30 活着的虫子 阅读(3851) 评论(0) 推荐(0) 编辑

2020年7月17日

关于异常RPC_NT_INVALID_STRING_BINDING(0xC0020001)

摘要: 简介 RPC_NT_INVALID_STRING_BINDING即无效的字符串绑定,值为0xC0020001。其定义如下: /// MessageId: RPC_NT_INVALID_STRING_BINDING//// MessageText://// The string binding is 阅读全文

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

2020年7月16日

可能引发System.OutOfMemoryException的情况和我们能采取的措施

摘要: 当调用 StringBuilder.Insert 方法 尝试增加 StringBuilder 对象的长度超出其 StringBuilder.MaxCapacity 属性指定的大小。 下面的示例演示了在示例尝试插入将导致对象的 Length 属性超过其最大容量的字符串时,调用 StringBuilde 阅读全文

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

2020年7月15日

处理一个COMException异常需要注意的地方

摘要: 尽管可以使用COMException类向非托管客户端返回特定的HRESULT,但引发特定的.NET Framework异常比使用泛型异常要好。考虑到托管客户端和非托管客户端都可以使用.NET Framework对象,向托管调用方抛出HRESULT比引发异常更难理解。 以下是对COMException 阅读全文

posted @ 2020-07-15 08:19 活着的虫子 阅读(2440) 评论(0) 推荐(0) 编辑

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

导航