|
| 1 | +<!DOCTYPE html> |
| 2 | +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en-us"> |
| 3 | +<head> |
| 4 | + <meta http-equiv="content-type" content="text/html; charset=utf-8" /> |
| 5 | + <title>记对一次内存泄露的调试</title> |
| 6 | + <link rel="shortcut icon" href="favicon.ico"> |
| 7 | + <meta name="author" content="wangaichao" /> |
| 8 | + <link href="http://feeds.feedburner.com/tom-preston-werner" rel="alternate" title="Tom Preston-Werner" type="application/atom+xml" /> |
| 9 | + |
| 10 | + <!-- syntax highlighting CSS --> |
| 11 | + <link rel="stylesheet" href="/css/syntax.css" type="text/css" /> |
| 12 | + |
| 13 | + <!-- Homepage CSS --> |
| 14 | + <link rel="stylesheet" href="/css/screen.css" type="text/css" media="screen, projection" /> |
| 15 | + |
| 16 | + <!-- Typekit --> |
| 17 | + <script type="text/javascript" src="http://use.typekit.com/jpd0pfm.js"></script> |
| 18 | + <script type="text/javascript">try{Typekit.load();}catch(e){}</script> |
| 19 | +</head> |
| 20 | +<body> |
| 21 | + |
| 22 | +<!-- ClickTale Top part --> |
| 23 | +<script type="text/javascript"> |
| 24 | +var WRInitTime=(new Date()).getTime(); |
| 25 | +</script> |
| 26 | +<!-- ClickTale end of Top part --> |
| 27 | + |
| 28 | +<div class="site"> |
| 29 | + <div class="title"> |
| 30 | + <a href="/">王爱超</a> |
| 31 | + <a class="extra" href="/">home</a> |
| 32 | + </div> |
| 33 | + |
| 34 | + <div id="post"> |
| 35 | +<h2>记对一次内存泄露的调试</h2> |
| 36 | + |
| 37 | +<h3>1. 内存泄露的发现</h3> |
| 38 | + |
| 39 | +<blockquote><p>最开始发现内存泄露是程序在运行了两个多小时后就段错误然后down掉了。于是把程序编译了个debug版本,用gdb去跑,不到两个小时又down掉了。查看程序停下来的地方,发现是在对刚刚申请完的内存进行赋值时出了问题,打印一看,申请后的内存指针是空,应该是申请内存失败了,又没有加相应的判断。再去用top一看程序内存使用情况,占了70%多,而最开始的时候差不多只占用4%左右。看来是程序内有内存泄露了。</p></blockquote> |
| 40 | + |
| 41 | +<h3>2. 内存泄露的排查</h3> |
| 42 | + |
| 43 | +<blockquote><p>在开始进行内存泄露排查的时候,我直接就去看自己最怀疑的一个模块,结果在给这个可以 模块加入成对的内存使用记录之后,发现确实有内存对不上的地方,老是有好多内存没有 释放。接着就开始了混天暗地的读代码,测试代码阶段,搞了半天,突然发现在判断内存是否释放完成的时候有不准确的现象。虽然每次的输入都一样,但是每次不能匹配上的内存释放记录却不同。再回过头来看,发现是程序还没有运行完成早成了这个情况。于是再次回头解决如何界定程序运行完成的问题,在解决它的时候又发现了程序一个有关超时的bug,至此不匹配的内存释放发记录就稳定了。这时候内存泄露的排查已经过了两天了,自己觉得有点hold不住了,于是开始重新思考如何进行内存泄露的排查,找了张纸,列了下:</p> |
| 44 | + |
| 45 | +<blockquote><ul> |
| 46 | +<li>先梳理整个程序,程序不算太大,可以将每个使用内存的地方都列出来</li> |
| 47 | +<li>统一测试时的输入,保证每次测试的输入数据都相同</li> |
| 48 | +<li>分模块进行测试,从数据流开始的模块挨个进行排查</li> |
| 49 | +</ul> |
| 50 | +</blockquote> |
| 51 | + |
| 52 | +<p>之后变按照上面的顺序再次进行测试,发现自己忘记了程序中还有内存池这回事,于是件内存池临时去掉进行测试,最终找到了泄露的部分。而这个泄露的部分还不在最可疑的那个模块里面。oh,what a fucking day!</p></blockquote> |
| 53 | + |
| 54 | +<h3>3. 内存泄露的排查工具</h3> |
| 55 | + |
| 56 | +<blockquote><p>在做内存泄露排查的时候还用到了Valgrind这个内存检查软件,给自己帮了很大的忙 |
| 57 | +<a href="http://www.cnblogs.com/napoleon_liu/articles/2001802.html">Valgrind的使用方式</a></p></blockquote> |
| 58 | + |
| 59 | +</div> |
| 60 | + |
| 61 | +<div id="related"> |
| 62 | + <h2>Related Posts</h2> |
| 63 | + <ul class="posts"> |
| 64 | + |
| 65 | + </ul> |
| 66 | +</div> |
| 67 | + |
| 68 | + |
| 69 | + <div class="footer"> |
| 70 | +<!-- |
| 71 | + <div class="contact"> |
| 72 | + <p> |
| 73 | + Tom Preston-Werner<br /> |
| 74 | + wangaichao_1988@163.com |
| 75 | + </p> |
| 76 | + </div> |
| 77 | + <div class="contact"> |
| 78 | + <p> |
| 79 | + < a href="http://github.com/mojombo/">github.com/supercode</a><br /> |
| 80 | + <a href="http://flickr.com/photos/mojombo/">flickr.com/photos/mojombo</a> |
| 81 | + </p> |
| 82 | + </div> |
| 83 | + <div class="rss"> |
| 84 | + <a href="http://feeds.feedburner.com/tom-preston-werner"> |
| 85 | + <img src="/images/rss.png" alt="Subscribe to RSS Feed" /> |
| 86 | + </a> |
| 87 | + </div> |
| 88 | +--> |
| 89 | + </div> |
| 90 | +</div> |
| 91 | + |
| 92 | + |
| 93 | +<!-- ClickTale Bottom part --> |
| 94 | +<div id="ClickTaleDiv" style="display: none;"></div> |
| 95 | +<script type="text/javascript"> |
| 96 | +if(document.location.protocol!='https:') |
| 97 | + document.write(unescape("%3Cscript%20src='http://s.clicktale.net/WRb.js'%20type='text/javascript'%3E%3C/script%3E")); |
| 98 | +</script> |
| 99 | +<script type="text/javascript"> |
| 100 | +if(typeof ClickTale=='function') ClickTale(206,0.3,"www03"); |
| 101 | +</script> |
| 102 | +<!-- ClickTale end of Bottom part --> |
| 103 | + |
| 104 | +<!-- Google Analytics --> |
| 105 | +<script type="text/javascript"> |
| 106 | +var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www."); |
| 107 | +document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E")); |
| 108 | +</script> |
| 109 | +<script type="text/javascript"> |
| 110 | +var pageTracker = _gat._getTracker("UA-6016902-1"); |
| 111 | +pageTracker._trackPageview(); |
| 112 | +</script> |
| 113 | +<!-- Google Analytics end --> |
| 114 | + |
| 115 | +</body> |
| 116 | +</html> |
0 commit comments