LiXiong's Debugging paper

《Windows用户态程序高效排错》

我的评论

所谓的临时解决问题,只不过是因为内存分配失败后,没有尝试再次分配而已。如果你在catch block中先调用gc.collect,然后再去重新执行导致问题的代码请求内存,就可以看到是否gc.collect有用了

当发生OOM后,正确的做法是failfast,尽快结束进程。避免由于OOM带来数据损坏等更严重的损失。使用catch去抓OOM,然后尝试恢复,是错误的做法
最好不要这样做
在server side比如IIS和ASP.NET使用Office Automation官方不支持,容易发生安全问题和死锁
......
我考,搞来搞去还是这个问题
出版社控制的进度,我也没办法。现在china-pub已经可以买了
你可以用
.reload -f -i module.dll
命令来强制加载pdb文件,哪怕mismatch
503好像是Server too busy吧。。。
慢到不是问题。跟数据库操作比,这个开销小很多数量级
最怕的是动态编译导致的内存分片,这个就很郁闷了。
CLR的CodeDom技术无法在生产环境中广泛应用的根源就在这里。这也是为何ASP.NET需要支持batchCompilation的原因
你自己可以写windbg extention来扩展windbg的命令和功能的
这个月末
原来是一个第三方的CLR优化工具。要花钱的俄。。。这个平时干活就不能用。再说手动分析也要放心点,所以我从来都不用!analyze命令,书中也没说这个命令
正文中关于/3GB的东西结构上有点变化,不过这个不是书中的重点

antsprofiler我好像也不知道是啥,找找看
@Jeffrey Zhao
就是前面发给你看那个阿。你比较下目录就知道纸书的差别
1. 大多数的.net程序是服务器端的。比如asp.net, remoting, web service。这种程序是无法拿到assembly做reflection的

2. reflection是双刃剑。好处多于坏处。简单的例子是,异常发生后可以打出callstack。这就是assembly带类型的功劳的。在提高开发效率,排错等方面带来的好处更多

3. 关键部门的代码,如果要保护,可以用C++完成,然后用pinvoke/com interop调用
非常有趣的问题
今天在公司内部讨论了一把,中间可以学到不少东西的。改天有时间整理出来
re: handle leak ts steps in chinese lixiong 2006-12-05 17:19  
@iceboundrock
天天被客户逼,没办法就摸索出来了

@Newer
我对shell开发不熟悉,但是换成我,我也会这样设断点进行跟踪的
传说中的通过异常来控制程序执行的牛人又出现了
re: 看到一个粗制滥造的程序所感 lixiong 2006-10-26 12:52  
烂代码的cost低阿
re: IE的leak lixiong 2006-10-25 15:11  
@yi
我在IE7上用你说的方法测试过,内存使用没有任何改善。

你是在什么版本上测试的呢?测试用的代码是上文中的html吗?你是如何观测内存使用的?最小化,最大化具体操作的时候需要注意什么吗?
re: IE的leak lixiong 2006-10-25 00:05  
记忆中vadump一般用来分析dump中heap/dll/virtual space等各种资源占用的内存比例,而umdh是用来检查pageheap的stack trace

两者用途不一样的

其实后面要介绍的iis diagnose工具完全可以代替命令行的vadump
re: useful log options in .Net lixiong 2006-10-24 22:59  
哦?什么问题啊,dudu没在msn上给我说啊
有啥问题能帮忙的尽管告诉我
着这个,我今天正在写如何解决memory leak的文档,提纲如下:
Guide line
Cache/leak/load/design/recycle
Memory leak

Private bytes leak

Heap leak
Heap fragmenation
Virtual allocate

Virtual space leak
Space fragmentation

Pageheap trace
IIS debugdiag


Handle leak
GDI leak

Other:
Power of IIS Debugdiag
BSTR cache
有什么不好看么?我觉得挺好的,早就应该这样了
我最怕ie出模态窗口
re: 最近确实因dotnet给郁闷了一下 lixiong 2006-09-28 14:26  
明明知道环境因素如此,为何还要用.net 2.0呢?用asp不久什么都搞定了
re: 为什么java+winform就那么慢呢 lixiong 2006-09-19 15:53  
reflector 就是典型的winform

还有现在流行的rss reader,好多都是.net winform
re: Case study, about cnblogs lixiong 2006-09-18 21:01  
抓dump的步骤在debug paper里面有的
用adplus:

adplus -hang -iis -quiet -q -o c:\dumps

search keywords: adplus hang kb
re: .net 通用计算库 lixiong 2006-09-18 19:45  
搂主强的
我来测试一下
"你说说printf是怎么实现的,这人就没方向了,其实就是一个很简单的BIOS INT"

No. it's not a simple BIOS INT in Win32. In fact, it's a call to WriteFile API to standard device output :)
let me have a try:

Thread和Process之间有什么区别?.NET新引入了Application Domain的概念,这样他们三个之间有什么区别?引入了Application Domain会带来一些潜在的问题么?

Process is OS resource boundary. Thread is execution identity. AppDomain the logic resource boundary for CLR code and resource. Potential issue may occur when there is confliction with CLR boundary and OS resource boundary, such like assembly unloading.


Windows Service与普通的EXE在执行过程中有什么区别?

Service starts before user login, and has its own desktop/session


一个进程可以访问的Windows地址空间有多大?等于系统的虚拟内存大小么?这两方面将对系统的设计产生什么样的影响?

2GB user mode, 2GB kernel mode. You may apply /3gb option


EXE和DLL之间的区别是什么?在系统设计中应该如何选择使用它们?

In fact, there is no difference

普通的EXE与.NET EXE的执行过程有什么不同?

CLR binary needs be jitted before execution, and maintained bu CLR. While EXE contains binary code and executes directly.


什么是弱类型,什么是强类型?在系统设计中应该首先考虑使用哪种类型?

Strong type

PDB文件是作什么用的?里面包含了什么信息?

Debug symbol

Cyclomatic Complexity是什么?为什么它很重要?

sorry I do not know

为创建一个critical section以访问某个变量书写一个标准的lock() 并加上double check。


what's double check? You just need to create criticalsection, enter and leave.

为某个对象实现标准的Dispose模式。

is it necessary?

什么是FullTrust? 存在于GAC中的 assembly 拥有FullTrust么?

FullTrust means any permission request will be met for the callee. I do not think strongnamed assembly in GAC has FullTrust. You can adjust it.


下面这个命令是做什么的?gacutil /l | find /i “system”

Not sure. Find assemblies in GAC with system keyword?


下面这个命令是作什么的? sn -t something.dll

Display strong signed signature?


跨防火墙的 DCOM必须打开哪个端口?端口135是用来做什么的?

RPC endpoint mapper


有什么办法可以与现有unmanaged code集成?在集成的时候应该考虑什么问题?

COM Interop/PInvoke. Mashral

简要解释一下OOP与SOA都是用来作什么的?

oh, a long stroy

XmlSerializer是如何工作的?进程运行XmlSerializer时候需要什么样的ACL权限?

which level?


在系统设计时,何时应该使用try catch?何时需要避免使用?

the callee may throw exception, you need to put it in try/catch block.

Debug.Write()和Trace.Write()之间有什么区别?二者分别应该用于何处?

er.. not sure

Debug Build和Release Build有什么区别?在执行效率上有什么明显的区别么?

native build or CLR build? For clr build, there is no explict difference, except ASP.NET :)

JIT是针对Assembly还是Method发生的?解释一下为什么.NET的设计者要这样做?

Method. For performance

简要描述一下GC的执行过程。

mark phrase, collect phrase, compact and move phrase, finalize phrase

应该如何选择使用abstract class还是interface?

do not ask me design info

在设计一个自定义类型时应如何选择使用Value Type还是Reference Type?

oh, depends on your...

对于Value Type和Reference Type,a.Equals(b)的默认实现方式有什么不同?

default implementation?


.NET中为什么不提供默认的deep copy?如果需要,要如何实现deep copy?


Clone?

相对于.NET 1.1,.NET2.0为了避免过度的boxing/unboxing造成的系统开销提供了哪些支持?


in fact, I never see any perfomrance issue caused by boxing. I do not think the improvment is great.

String是Value Type还是Reference Type?为什么.NET中的String对象被设置成immutable?

i do not know. But the behaviro likes value type, but defined as ref type? because string is common basic type like int, char...
从两边的评论就可以看明白高下。你没有必要在某些无聊评论身上浪费时间。

其实本来是两个人的事情,虽然不尊重知识产权,但是双方好歹都尊重技术,大家都奉献过。只是有些无聊的人,从来不曾为社区贡献过什么,只知道煽风点火,辱骂诽谤。

你应该收苏的钱,而且要给他收据,同时要保存他的书面道歉。这样1表示接受了道歉,2来以后如果需要回头看这个事情,你也有证据。这是对双方,也是对大家的交待。只有这样整个事情才算解决。

如果你还是有点不甘心,我支持你删除整个blog

让大家看到,伤害创造者的结果,就是扼杀分享技术的热情。损害了所有人的利益。以后大家都别玩了,想抄都没有了,自个去编吧

大家以后要写什么东西,要么就写点自己才看得懂的,不枉费自己研究一场。如果要想share点什么东西,要学会保护自己。

名利是不是没有的,但是取之有道,用之有道
re: ASP.NET 2.0 X64的奇怪问题 lixiong 2006-08-22 23:39  
首先,是否能确认high cpu是由于app recycle导致的。

我的建议是:

1. 在high CPU的时候,用x64的windbg抓几个dump

2. 观察内存使用。当内存比较高,比如超过800MB的时候,抓一个dump

3. 使用performance monitor监视cpu和其他使用情况。

dudu有兴趣的话msn上说
"


2.内存移动

如果在CLR中需要传递一块托管的buffer到非托管API,以便非托管API可以异步地向这个buffer填充数据。但是开发人员忘记用C#中的fixed关键字和或者MC++中的__pin关键字pin住这个object,那么GC发生的时候buffer就可能被GC移动导致地址发生改变。当非托管API试图写入旧地址的时候,好的情况就是发生crash,坏的情况就是不知道损坏了一块什么样的数据,最后崩溃到CLR的某个内部函数上,或者产生一个ExecutionEngineException。这种问题虽然是开发人员的错,但是调试起来非常头疼。因为问题不会立刻暴露出来,从callstack上也看不出任何线索,问题还不容易重现,每次出错的地方还不一样。这是由于CLR增加OS上的另一层内存管理机制,本意是减少开发人员的开销,但结果却使得开发人员要考虑更多的因素。同样类型的问题还会出现在COM object的使用上。如果COM指针在托管代码和非托管代码之间传递多次,由于某个非托管代码的错误,导致引用计数被多减了一次,使得指针在CLR不知情的情况下提前释放。最后CLR操作COM的时候CLR可能就会崩溃。解决这类问题单通过检查dump很难找出根源,一定要有一个重现环境,配合CLR的stresslog来调试。


"
re: 关于线程池的文章 lixiong 2006-08-22 00:16  
The official doc about the correct setting and explanation about clr threadpool:

Contention, poor performance, and deadlocks when you make Web service requests from ASP.NET applications
http://support.microsoft.com/?id=821268
gb2312字符集包括繁文

我想是的 :)
zip里面带一个zip?
我这里不能重现问题
我换一个下载地址吧:

http://www.heijoy.com/debugdoc/UsermodeTsPaper.pdf
不会吧,明明就是zip,打开解压不就可以了
谢谢你的反馈
我会找时间仔细检查