Writing Self-Clean Code (0x01) - Process

September 18, 2011 | Category:编程杂谈 | Psot By matrix | 5 Comments

进程通常比较容易理解,通常学习C语言入门的时候,写Hello World就要写main 函数了。 

进程的清理 
按说进程退出时,通常是没有什么好清理的。因为现代操作系统随着进程的退出,大部分的资源都已经清理干净了。但是也不排除一些特殊的应用方式需要在进程结束的时候做一些清理工作,比如:


  •  以Linux系统而言,多线程的应用在主线程退出的时候,会去清理全局变量。而此时如果其他线程还在访问这些全局变量的话,就可能出现内存访问错误,直接后果可能就是得到一个很不优雅的退出。
  • 进程退出时希望做一些业务上的事情:记录日志、向Socket发送一些数据。但是可能main  函数的代码控制权并不在你的手里。这种情况在大型的软件开发中、司空见惯;当然你可能说这种类型的项目,通常架构上都会在设计的时候去考虑这些东西吧。但是事实上很多时候这些规模的项目往往可能由大量的软件新手来完成;亦往往负责架构设计的人对业务很熟悉,但是对编程、设计往往火候不是那么够(这个有点扯远了……)
  • 应对一些异常的退出情况

总的来说,进程的清理本来应该不是个问题,原本都应该在 main 函数退出前,把所有改做的事情都做了,但是客观或真主管的原因要求我们去面对一些进程退出的问题。

Read More »

Writing Self-Clean Code (0x00) - Preface

September 1, 2011 | Category:编程杂谈 | Psot By matrix | No Comments

最近一段时间的工作内容差不多都是在定位产品的ActiveX 控件的崩溃问题。其实现在觉得要写一个稳定的ActiveX真的不是那么容易,至少比写一个稳定的应用程序要关注更多的东西。其实单看Adobe 的 Flash 控件隔三岔五的就爆出一些漏洞,就知道了。

其实个人觉得MSDN 上的文章: Writing Stable Browser Extensions 基本上对于开发ActiveX 或是 BHO 都是很有参考价值的。

就问题论问题,我们的ActiveX 崩溃起初发生在关闭 IE 的时候。原因比较简单:OCX控件在运行是会创建线程,线程回去去访问OCX的全局变量,但是当OCX卸载的时候,没有去把线程停止掉。于是内存访问非法。究其设计缘由:没有考虑业务的清理工作。还有一个类似的错误是OCX的代码里面有动态LoadLibrary加载了Dll,但是最后OCX卸载的时候,也没有FreeLibrary,于是再次加载OCX运行的时候依赖的Dll 已经被加载了,部分变量状态不正确。

上面的原因差不多就是我要写这个系列文章的初衷。平时设计、编码的时候大多把注意力聚焦在业务上了,往往忽略一些基础的东西,比如:代码的运行环境。

  1. Pages: