前几日,调试一BUG,过程先不说,最后调试到MM,即Debug dcu,然后进入到GetMem.inc中的Get/FreeMem函数处后,出现AV。

然后一通找。。。郁闷了N天,后来发现将MM切换到QMM后,一切正常,然后再切回原MM,BUG出现。。。

按经验,此类问题一般由于线程未有锁保护引起,但就是没找到原因所在。

好吧,也不怎么滴,突然想起IsMultiThread变量,想起MM的Get/Free/Realloc都需要这个玩意进行保护,而VCL中,只有一个地方对这变量进行操作: Classes.TThread.Create->System.BeginThread

然后才想起自己未使用TThread,使用API.CreateThread进行创建线程,而它未对IsMultiThread进行置true操作,问题找到,BUG解除。

遂,本文记录此问题。

BUG形成:

1:程序从未使用TThread或BeginThread进行创建线程,这样,它就不会对IsMultiThread进行操作。

  注意:TThread和BeginThread对IsMultiThread置True后,没有其它VCL代码进行置false操作(不建议自己置false)

2:自行使用API.Windows.CreateThread创建线程,且未对IsMultiThread置true

3:在创建的线程中,进行Get/Free/ReallocMem,并与其它线程(如主线程)进行交互该内存块

BUG展现:

1:该BUG将会引起MM数据结构错误,问题就大了去。

出现AV时,watch查看的数据是错误的,且随机的给你不一样的数据

call stack也傻了,定位到无边际的代码。。。

总之,一切都傻掉了,不可信了。

BUG避免:

1:慎用API.Windows.CreateThread,如果要对它操作,请记得IsMultiThread := True;

如果不记得,请参照代码: System.BeginThread

或者直接使用System.BeginThread进行创建线程。

2:使用QMM,QMM是自动维护IsMultiThread,有线程数N(N>1)时, IsMultiThread=true, N=1时, IsMultiThread = false;

这点,其它MM,俺所查看的,都未做处理。(偶在打广告哩)

个人建议是:开发环境必备两套以上MM,以作备用,遇到一些莫名问题,切换一下,用以确认是否MM问题引起。

注:

  MM=Memory Manager, D2005版本开始集成FastMM。

  不过,从D7(D5没注意看,应该也是)的GetMem.Inc,一直到FastMM4.991都依赖于IsMultiThread标志进行线程保护,未进行自维护该标志。

所以,当出现此BUG条件形成时,就会出现:我知道因为多线程未保护引起数据错乱而引起的BUG,但就是找不着在哪里触发的,怎么去解决。这才是最坑爹的。 :)

完。

2014.10.15 by qsl

Delphi系统变量:IsMultiThread对MM的影响的更多相关文章

  1. 系统变量file.encoding对Java的运行影响有多大?(转)good

    这个话题来自: Nutz的issue 361 在考虑这个issue时, 我一直倾向于使用系统变量file.encoding来改变JVM的默认编码. 今天,我想到, 这个系统变量,对JVM的影响到底有多 ...

  2. Sql server函数的学习1(系统变量、错误函数、转换函数)

    一.系统变量的介绍和使用 1.@@ERROR 变量 2.@@SERVICENAME 变量 3.@@TOTAL_ERRORS 变量 4.@@TOTAL_READ 变量 5.@@VERSION 变量 二. ...

  3. AutoCAD系统变量一览表

    p.MsoNormal,li.MsoNormal,div.MsoNormal { margin: 0cm; margin-bottom: .0001pt; text-align: justify; t ...

  4. CAD系统变量(参数)大全

    所谓系统变量就是一些参数,这些参数有些是可以在“选项”或其他对话框中进行设置的,有些这必须通过在命令行输入变量名进行设置,当然对于高手来说,还可以通过二次开发程序来进行控制. CAD有很多的变量,例如 ...

  5. mysql show variables系统变量详解

    mysql系统变量详解 mysqld服务器维护两种变量.全局变量影响服务器的全局操作.会话变量影响具体客户端连接相关操作. 服务器启动时,将所有全局变量初始化为默认值.可以在选项文件或命令行中指定的选 ...

  6. [Form Builder]Oracle Form系统变量中文版总结大全

    转:http://yedward.net/?id=57 Form中的系统变量,它存在于一个Form的整个运行时期的会话之中,变量包含了有关Form相关属性的字节信息.有些变量标明了当前状态,还有些变量 ...

  7. Thinkphp入门 四 —布局、缓存、系统变量 (48)

    原文:Thinkphp入门 四 -布局.缓存.系统变量 (48) [控制器操作方法参数设置] http://网址/index.php/控制器/操作方法 [页面跳转] [变量调节器] Smarty变量调 ...

  8. MySQL用户和系统变量

    --MySQL用户和系统变量 -----------------------------2014/05/19 用户变量 可以先在用户变量中保存值然后在以后引用它:这样可以将值从一个语句传递到另一个语句 ...

  9. SQL Server -- 回忆笔记(五):T-SQL编程,系统变量,事务,游标,触发器

    SQL Server -- 回忆笔记(五):T-SQL编程,系统变量,事务,游标,触发器 1. T-SQL编程 (1)声明变量 declare @age int (2)为变量赋值 (3)while循环 ...

随机推荐

  1. fail to create java virtual machine..

    今天打开zend stdio 的时候 出现的错误  fail to create java virtual machine... 然后找度娘了,,都说改xxxxx, 我打开360  ,把内存清理了一遍 ...

  2. c语言数据结构之 堆排序

    算法:先生成随机数,赋值到数组,将数组第一个元素a[0]设置为哨兵,函数调用数组和随机数个数n,再设定n/2的根结点与孩子结点进行比较操作,若右孩子存在,则选出三个数里最小的数赋值给根节点,如果右孩子 ...

  3. 水平ListView类

    package com.hztbc.android.HorizontalListView; /* * HorizontalListView.java v1.5 * *  * The MIT Licen ...

  4. UITabBarButton 点击失效问题

    开发过程: 在创建一个UIWindow时,直接在window上添加手势动作. 开发代码: UITapGestureRecognizer *tapRecognizer=[[UITapGestureRec ...

  5. python中字典的使用

    python中的字典的特性: 在字典中的元素是散列存放的,没有顺序, 在进行增删改查的时候使用字典中需要的关键字(key)即可. 一: 创建字典 1)直接定义一个: dict = {'ob1':'co ...

  6. select for update行锁

     select for update行锁 2008-05-26 15:15:37 分类: Oracle Select-For Update语句的语法与select语句相同,只是在select语句的后面 ...

  7. Request.UrlReferrer

    1:Request.UrlReferrer可以获取客户端上次请求的url,这样就可以实现类似“上一页”的功能等 2:刷新当前页面,不会改变Request.UrlReferrer的值 3:如果有A,B两 ...

  8. selenium设置Chrome

    关闭图片 from selenium import webdriver options = webdriver.ChromeOptions() prefs = { 'profile.default_c ...

  9. Python set集合类型操作总结

    Python中除了字典,列表,元组还有一个非常好用的数据结构,那就是set了,灵活的运用set可以减去不少的操作(虽然set可以用列表代替) 小例子 1.如果我要在许多列表中找出相同的项,那么用集合是 ...

  10. 图像分割实验:FCN数据集制作,网络模型定义,网络训练(提供数据集和模型文件,以供参考)

    论文:<Fully Convolutional Networks for Semantic Segmentation> 代码:FCN的Caffe 实现 数据集:PascalVOC 一 数据 ...