-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathwei-xian-de-gc.html
124 lines (123 loc) · 5.84 KB
/
wei-xian-de-gc.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
<!DOCTYPE html>
<html lang="cn">
<head>
<meta charset="utf-8">
<title>危险的GC — Code Tip</title>
<meta name="description" content="Title: 危险的GC; Date: 2013-06-24; Author: Marsyas">
<meta name="author" content="Marsyas">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- Le HTML5 shim, for IE6-8 support of HTML elements -->
<!--[if lt IE 9]>
<script src="/theme/html5.js"></script>
<![endif]-->
<link href="/theme/css/ipython.css" rel="stylesheet">
<link href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css" rel="stylesheet">
<link href="//maxcdn.bootstrapcdn.com/font-awesome/4.1.0/css/font-awesome.min.css" rel="stylesheet">
<link href="//maxcdn.bootstrapcdn.com/bootswatch/3.2.0/simplex/bootstrap.min.css" rel="stylesheet">
<link href="/theme/css/local.css" rel="stylesheet">
<link href="/theme/css/pygments.css" rel="stylesheet">
</head>
<body>
<div class="container">
<div class="page-header">
<h1><a href="/">Code Tip</a>
<br> </div>
<div class="row">
<div class="col-md-8 col-md-offset-2">
<div class="article" itemscope itemtype="http://schema.org/BlogPosting">
<div class="text-center article-header">
<h1 itemprop="name headline" class="article-title">危险的GC</h1>
<span itemprop="author" itemscope itemtype="http://schema.org/Person">
<h4 itemprop="name">Marsyas</h4>
</span>
<time datetime="2013-06-24T00:00:00+08:00" itemprop="datePublished">Mon 24 June 2013</time>
</div>
<div>
Category:
<span itemprop="articleSection">
<a href="/category/ji-zhu.html" rel="category">技术</a>
</span>
</div>
<div>
Tags:
<span itemprop="keywords">
<a href="/tag/cocosbuilder.html" rel="tag">cocosbuilder</a>
</span>
<span itemprop="keywords">
<a href="/tag/cocos2d-x.html" rel="tag">cocos2d-x</a>
</span>
<span itemprop="keywords">
<a href="/tag/javascript.html" rel="tag">javascript</a>
</span>
</div>
<div itemprop="articleBody" class="article-body"><p>在用cocos2d-javascript binding作游戏的时候遇到一个莫名其妙崩溃的问题,调用堆栈显示是在GC的时候,执行一个叫做MarkObjectRoot的函数,发生了EXC_BAD_ACCESS错误。</p>
<p>于是查找了些关于ObjectRoot的信息,这东西主要是为了防止SpiderMonkey执行GC操作的时候把还在使用的Object引用清除掉而存在的,不少地方都在第一次使用Object的时候调用了JS_AddNamedObjectRoot/JS_AddObjectRoot函数,并在释放Object的时候调用JS_RemoveObjectRoot函数。</p>
<p>联系到前面的错误,很有可能是在什么地方使用Object的时候调用了AddNamedObjectRoot/JS_AddObjectRoot函数,但是在释放的时候没有调用相应的JS_RemoveObjectRoot函数,于是SpiderMonkey并不知道这个Object已经被释放了,GC的时候仍然对它执行了MarkObjectRoot操作,从而引发了这个crash。</p>
<p>虽然找到了方向,但是cocos2d-x代码中用到Add/Remove ObjectRoot的地方实在太多了,一个个查起来非常的浪费时间,于是反过来使用排除法,把代码注释到不再出现这个问题为止,然后一段一段地还原,找到了这个问题跟addCollisionHandler方法有关。查看本地代码,__jsb_cpSpace_addCollisionHandler这个方法里面确实调用了JS_AddNamedObjectRoot函数,然而JSB_cpSpace_finalize方法里面也调用了相应的JS_RemoveObjectRoot函数,按理说应该没问题才对。</p>
<p>接着打断点调试,addCollisionHandler方法是在每一关初始化物理环境的时候调用的,这次为了调试方便,我在一关玩完后会执行一次强制GC,发现从第一次玩初始化物理环境,到重玩本关的时候第二次初始化物理环境时(也就是第二次调用addCollisionHandler时),再到第二次玩完本关GC时,JSB_cpSpace_finalize函数都一直没有被调用到,而就在第二次GC的时候,程序崩溃。看来跟我前面猜得差不多,CollisionHandler在第一次GC的时候已经被释放掉了,但是SpiderMonkey不知道,于是第二次GC的时候直接崩溃,在代码里面手动添加了removeCollsionHandler之后,果然没问题了。</p></div>
<hr>
<h2>Comments</h2>
</div>
</div>
</div> <!-- <hr> -->
</div> <!-- /container -->
<footer class="aw-footer bg-danger">
<div class="container"> <!-- footer -->
<div class="row">
<div class="col-md-10 col-md-offset-1">
<div class="row">
<div class="col-md-3">
<h4>Navigation</h4>
<ul class="list-unstyled my-list-style">
<li><a href="">Code Tip</a></li>
</ul>
</div>
<div class="col-md-3">
<h4>Author</h4>
<ul class="list-unstyled my-list-style">
<li><a href="mailto:[email protected]">Email</a></li>
</ul>
</div>
<div class="col-md-3">
<h4>Categories</h4>
<ul class="list-unstyled my-list-style">
<li><a href="/category/技术.html">技术 (6)</a></li>
</ul>
</div>
<div class="col-md-3">
<h4>Links</h4>
<ul class="list-unstyled my-list-style">
<li><a href="https://github.com/fispurring/">Github</a></li>
</ul>
</div>
</div>
</div>
</div>
</div>
</footer>
<div class="container">
<div class="row">
<div class="col-md-12 text-center center-block aw-bottom">
<p>© Marsyas 2016</p>
<p>Powered by Pelican</p>
</div>
</div>
</div>
<!-- JavaScript -->
<script src="https://code.jquery.com/jquery-2.1.1.min.js"></script>
<script src="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script>
<script type="text/javascript">
jQuery(document).ready(function($) {
$("div.collapseheader").click(function () {
$header = $(this).children("span").first();
$codearea = $(this).children(".input_area");
$codearea.slideToggle(500, function () {
$header.text(function () {
return $codearea.is(":visible") ? "Collapse Code" : "Expand Code";
});
});
});
});
</script>
</body>
</html>