<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>C on Hacper&#39;s Blog</title>
    <link>https://hacperme.com/tags/c/</link>
    <description>Recent content in C on Hacper&#39;s Blog</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>zh</language>
    <lastBuildDate>Fri, 28 Feb 2025 00:49:37 +0800</lastBuildDate>
    <atom:link href="https://hacperme.com/tags/c/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>c 标准库 nano.spec 和 nosys.spec 的内存占用差异</title>
      <link>https://hacperme.com/posts/notes/2025/20250219_c_stdlib/</link>
      <pubDate>Fri, 28 Feb 2025 00:49:37 +0800</pubDate>
      <guid>https://hacperme.com/posts/notes/2025/20250219_c_stdlib/</guid>
      <description>c 库 nosys.spec vs nano.spec 的内存占用大小差异</description>
      <content:encoded><![CDATA[<p>相同应用代码下，nosys.spec vs nano.spec 的内存占用大小。</p>
<p>nosys.spec:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">Memory region         Used Size  Region Size  %age Used
</span></span><span class="line"><span class="cl">             RAM:        <span class="m">4240</span> B        <span class="m">16</span> KB     25.88%
</span></span><span class="line"><span class="cl">           FLASH:       <span class="m">44892</span> B        <span class="m">64</span> KB     68.50%
</span></span></code></pre></td></tr></table>
</div>
</div><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">library name,text,rodata,data,bss,code,flash,ram
</span></span><span class="line"><span class="cl">nofp<span class="se">\l</span>ibc.a,25152,1056,2476,60,26208,28684,2536
</span></span><span class="line"><span class="cl">nofp<span class="se">\l</span>ibgcc.a,3116,0,0,0,3116,3116,0
</span></span><span class="line"><span class="cl">main.c.obj,220,26,0,100,246,246,100
</span></span><span class="line"><span class="cl">libCMSIS.a,570,0,4,0,570,574,4
</span></span><span class="line"><span class="cl">libbsp.a,484,0,0,0,484,484,0
</span></span><span class="line"><span class="cl">libtask.a,220,0,0,16,220,220,16
</span></span><span class="line"><span class="cl">libn32g430_std_periph_driver.a,694,64,0,0,758,758,0
</span></span><span class="line"><span class="cl">nofp<span class="se">\l</span>ibnosys.a,144,0,0,4,144,144,4
</span></span><span class="line"><span class="cl">crtn.o,8,0,0,0,8,8,0
</span></span><span class="line"><span class="cl">crtbegin.o,0,0,0,0,0,0,0
</span></span></code></pre></td></tr></table>
</div>
</div><p>nano.spec:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">Memory region         Used Size  Region Size  %age Used
</span></span><span class="line"><span class="cl">             RAM:        <span class="m">1808</span> B        <span class="m">16</span> KB     11.04%
</span></span><span class="line"><span class="cl">           FLASH:       <span class="m">17620</span> B        <span class="m">64</span> KB     26.89%
</span></span></code></pre></td></tr></table>
</div>
</div><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">library name,text,rodata,data,bss,code,flash,ram
</span></span><span class="line"><span class="cl">nofp<span class="se">\l</span>ibc_nano.a,4328,151,100,15,4479,4579,115
</span></span><span class="line"><span class="cl">main.c.obj,220,26,0,100,246,246,100
</span></span><span class="line"><span class="cl">libCMSIS.a,570,0,4,0,570,574,4
</span></span><span class="line"><span class="cl">libbsp.a,484,0,0,0,484,484,0
</span></span><span class="line"><span class="cl">libtask.a,220,0,0,16,220,220,16
</span></span><span class="line"><span class="cl">libn32g430_std_periph_driver.a,694,64,0,0,758,758,0
</span></span><span class="line"><span class="cl">nofp<span class="se">\l</span>ibnosys.a,108,0,0,4,108,108,4
</span></span><span class="line"><span class="cl">crtn.o,8,0,0,0,8,8,0
</span></span><span class="line"><span class="cl">crtbegin.o,0,0,0,0,0,0,0
</span></span></code></pre></td></tr></table>
</div>
</div><p>当在内存资源不富裕的设备开发，应优先使用 nano.spec，不然光打印一个 hello word flash 内存就已经用到二、三十KB了，开销太大。</p>
]]></content:encoded>
    </item>
    <item>
      <title>为 freertos 的 heap_4 动态内存分配方案增加 heap info 调试信息</title>
      <link>https://hacperme.com/posts/notes/20240508_bk7321n_heap_memory_leak/</link>
      <pubDate>Sun, 23 Jun 2024 02:00:18 +0800</pubDate>
      <guid>https://hacperme.com/posts/notes/20240508_bk7321n_heap_memory_leak/</guid>
      <description>为 freertos 的 heap_4 增加 heap info 调试信息，用于排查内存泄漏和内存越界问题</description>
      <content:encoded><![CDATA[<h2 id="如何为-freertos-的-heap_4-动态内存分配方案增加-heap-info-调试信息">如何为 freertos 的 heap_4 动态内存分配方案增加 heap info 调试信息？</h2>
<p>增加调试信息的目的是为了方便排查内存泄漏和内存越界问题，为了排查内存泄漏，需要记录每个内存块的申请者信息，以下是针对内存泄漏问题调试的修改。</p>
<ul>
<li>修改内存块头部的数据结构，增加字段记录内存申请者的信息和申请的内存大小。</li>
</ul>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="k">typedef</span> <span class="k">struct</span> <span class="n">A_BLOCK_LINK</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">struct</span> <span class="n">A_BLOCK_LINK</span> <span class="o">*</span> <span class="n">pxNextFreeBlock</span><span class="p">;</span> <span class="cm">/*&lt;&lt; The next free block in the list. */</span>
</span></span><span class="line"><span class="cl">    <span class="kt">size_t</span> <span class="n">xBlockSize</span><span class="p">;</span>                     <span class="cm">/*&lt;&lt; The size of the free block. */</span>
</span></span><span class="line"><span class="cl">    <span class="kt">size_t</span> <span class="n">xWantedSize</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kt">void</span> <span class="o">*</span><span class="n">caller</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span> <span class="n">BlockLink_t</span><span class="p">;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>xWantedSize 和 caller 是新增的字段，分别用于记录内存分配时候的调用者信息和申请的内存大小。</p>
<ul>
<li>修改 pvPortMalloc 和 pvPortRealloc 的定义，传入参数增加 caller。</li>
</ul>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="kt">void</span> <span class="o">*</span> <span class="nf">pvPortMalloc</span><span class="p">(</span> <span class="kt">size_t</span> <span class="n">xSize</span> <span class="p">,</span> <span class="kt">void</span> <span class="o">*</span><span class="n">caller</span><span class="p">)</span> <span class="n">PRIVILEGED_FUNCTION</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="o">*</span> <span class="nf">pvPortRealloc</span><span class="p">(</span> <span class="kt">void</span> <span class="o">*</span><span class="n">p</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">                     <span class="kt">size_t</span> <span class="n">xSize</span><span class="p">,</span> <span class="kt">void</span> <span class="o">*</span><span class="n">caller</span><span class="p">)</span> <span class="n">PRIVILEGED_FUNCTION</span><span class="p">;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><ul>
<li>修改 prvHeapInit pvPortMalloc 的实现，增加记录 caller，增加新接口 show_heap_info 查看 heap 的内存使用情况。</li>
</ul>
<p>在 heap 初始化的时候增加 caller xWantedSize 的初始化。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span><span class="lnt">38
</span><span class="lnt">39
</span><span class="lnt">40
</span><span class="lnt">41
</span><span class="lnt">42
</span><span class="lnt">43
</span><span class="lnt">44
</span><span class="lnt">45
</span><span class="lnt">46
</span><span class="lnt">47
</span><span class="lnt">48
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="k">static</span> <span class="kt">void</span> <span class="nf">prvHeapInit</span><span class="p">(</span> <span class="kt">void</span> <span class="p">)</span> <span class="cm">/* PRIVILEGED_FUNCTION */</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">BlockLink_t</span> <span class="o">*</span> <span class="n">pxFirstFreeBlock</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kt">uint8_t</span> <span class="o">*</span> <span class="n">pucAlignedHeap</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kt">size_t</span> <span class="n">uxAddress</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kt">size_t</span> <span class="n">xTotalHeapSize</span> <span class="o">=</span> <span class="n">configTOTAL_HEAP_SIZE</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="cm">/* Ensure the heap starts on a correctly aligned boundary. */</span>
</span></span><span class="line"><span class="cl">    <span class="n">uxAddress</span> <span class="o">=</span> <span class="p">(</span> <span class="kt">size_t</span> <span class="p">)</span> <span class="n">ucHeap</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">if</span><span class="p">(</span> <span class="p">(</span> <span class="n">uxAddress</span> <span class="o">&amp;</span> <span class="n">portBYTE_ALIGNMENT_MASK</span> <span class="p">)</span> <span class="o">!=</span> <span class="mi">0</span> <span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="n">uxAddress</span> <span class="o">+=</span> <span class="p">(</span> <span class="n">portBYTE_ALIGNMENT</span> <span class="o">-</span> <span class="mi">1</span> <span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="n">uxAddress</span> <span class="o">&amp;=</span> <span class="o">~</span><span class="p">(</span> <span class="p">(</span> <span class="kt">size_t</span> <span class="p">)</span> <span class="n">portBYTE_ALIGNMENT_MASK</span> <span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="n">xTotalHeapSize</span> <span class="o">-=</span> <span class="n">uxAddress</span> <span class="o">-</span> <span class="p">(</span> <span class="kt">size_t</span> <span class="p">)</span> <span class="n">ucHeap</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">pucAlignedHeap</span> <span class="o">=</span> <span class="p">(</span> <span class="kt">uint8_t</span> <span class="o">*</span> <span class="p">)</span> <span class="n">uxAddress</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="cm">/* xStart is used to hold a pointer to the first item in the list of free
</span></span></span><span class="line"><span class="cl"><span class="cm">     * blocks.  The void cast is used to prevent compiler warnings. */</span>
</span></span><span class="line"><span class="cl">    <span class="n">xStart</span><span class="p">.</span><span class="n">pxNextFreeBlock</span> <span class="o">=</span> <span class="p">(</span> <span class="kt">void</span> <span class="o">*</span> <span class="p">)</span> <span class="n">pucAlignedHeap</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="n">xStart</span><span class="p">.</span><span class="n">xBlockSize</span> <span class="o">=</span> <span class="p">(</span> <span class="kt">size_t</span> <span class="p">)</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="n">xStart</span><span class="p">.</span><span class="n">caller</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="n">xStart</span><span class="p">.</span><span class="n">xWantedSize</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="cm">/* pxEnd is used to mark the end of the list of free blocks and is inserted
</span></span></span><span class="line"><span class="cl"><span class="cm">     * at the end of the heap space. */</span>
</span></span><span class="line"><span class="cl">    <span class="n">uxAddress</span> <span class="o">=</span> <span class="p">(</span> <span class="p">(</span> <span class="kt">size_t</span> <span class="p">)</span> <span class="n">pucAlignedHeap</span> <span class="p">)</span> <span class="o">+</span> <span class="n">xTotalHeapSize</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="n">uxAddress</span> <span class="o">-=</span> <span class="n">xHeapStructSize</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="n">uxAddress</span> <span class="o">&amp;=</span> <span class="o">~</span><span class="p">(</span> <span class="p">(</span> <span class="kt">size_t</span> <span class="p">)</span> <span class="n">portBYTE_ALIGNMENT_MASK</span> <span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">pxEnd</span> <span class="o">=</span> <span class="p">(</span> <span class="kt">void</span> <span class="o">*</span> <span class="p">)</span> <span class="n">uxAddress</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="n">pxEnd</span><span class="o">-&gt;</span><span class="n">xBlockSize</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="n">pxEnd</span><span class="o">-&gt;</span><span class="n">caller</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="n">pxEnd</span><span class="o">-&gt;</span><span class="n">pxNextFreeBlock</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="cm">/* To start with there is a single free block that is sized to take up the
</span></span></span><span class="line"><span class="cl"><span class="cm">     * entire heap space, minus the space taken by pxEnd. */</span>
</span></span><span class="line"><span class="cl">    <span class="n">pxFirstFreeBlock</span> <span class="o">=</span> <span class="p">(</span> <span class="kt">void</span> <span class="o">*</span> <span class="p">)</span> <span class="n">pucAlignedHeap</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="n">pxFirstFreeBlock</span><span class="o">-&gt;</span><span class="n">xBlockSize</span> <span class="o">=</span> <span class="n">uxAddress</span> <span class="o">-</span> <span class="p">(</span> <span class="kt">size_t</span> <span class="p">)</span> <span class="n">pxFirstFreeBlock</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="n">pxFirstFreeBlock</span><span class="o">-&gt;</span><span class="n">xWantedSize</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="n">pxFirstFreeBlock</span><span class="o">-&gt;</span><span class="n">caller</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="n">pxFirstFreeBlock</span><span class="o">-&gt;</span><span class="n">pxNextFreeBlock</span> <span class="o">=</span> <span class="n">pxEnd</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="cm">/* Only one block exists - and it covers the entire usable heap space. */</span>
</span></span><span class="line"><span class="cl">    <span class="n">xMinimumEverFreeBytesRemaining</span> <span class="o">=</span> <span class="n">pxFirstFreeBlock</span><span class="o">-&gt;</span><span class="n">xBlockSize</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="n">xFreeBytesRemaining</span> <span class="o">=</span> <span class="n">pxFirstFreeBlock</span><span class="o">-&gt;</span><span class="n">xBlockSize</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>在分配内存的时候，记录caller 和 xWantedSize 到内存卡的头部。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">  1
</span><span class="lnt">  2
</span><span class="lnt">  3
</span><span class="lnt">  4
</span><span class="lnt">  5
</span><span class="lnt">  6
</span><span class="lnt">  7
</span><span class="lnt">  8
</span><span class="lnt">  9
</span><span class="lnt"> 10
</span><span class="lnt"> 11
</span><span class="lnt"> 12
</span><span class="lnt"> 13
</span><span class="lnt"> 14
</span><span class="lnt"> 15
</span><span class="lnt"> 16
</span><span class="lnt"> 17
</span><span class="lnt"> 18
</span><span class="lnt"> 19
</span><span class="lnt"> 20
</span><span class="lnt"> 21
</span><span class="lnt"> 22
</span><span class="lnt"> 23
</span><span class="lnt"> 24
</span><span class="lnt"> 25
</span><span class="lnt"> 26
</span><span class="lnt"> 27
</span><span class="lnt"> 28
</span><span class="lnt"> 29
</span><span class="lnt"> 30
</span><span class="lnt"> 31
</span><span class="lnt"> 32
</span><span class="lnt"> 33
</span><span class="lnt"> 34
</span><span class="lnt"> 35
</span><span class="lnt"> 36
</span><span class="lnt"> 37
</span><span class="lnt"> 38
</span><span class="lnt"> 39
</span><span class="lnt"> 40
</span><span class="lnt"> 41
</span><span class="lnt"> 42
</span><span class="lnt"> 43
</span><span class="lnt"> 44
</span><span class="lnt"> 45
</span><span class="lnt"> 46
</span><span class="lnt"> 47
</span><span class="lnt"> 48
</span><span class="lnt"> 49
</span><span class="lnt"> 50
</span><span class="lnt"> 51
</span><span class="lnt"> 52
</span><span class="lnt"> 53
</span><span class="lnt"> 54
</span><span class="lnt"> 55
</span><span class="lnt"> 56
</span><span class="lnt"> 57
</span><span class="lnt"> 58
</span><span class="lnt"> 59
</span><span class="lnt"> 60
</span><span class="lnt"> 61
</span><span class="lnt"> 62
</span><span class="lnt"> 63
</span><span class="lnt"> 64
</span><span class="lnt"> 65
</span><span class="lnt"> 66
</span><span class="lnt"> 67
</span><span class="lnt"> 68
</span><span class="lnt"> 69
</span><span class="lnt"> 70
</span><span class="lnt"> 71
</span><span class="lnt"> 72
</span><span class="lnt"> 73
</span><span class="lnt"> 74
</span><span class="lnt"> 75
</span><span class="lnt"> 76
</span><span class="lnt"> 77
</span><span class="lnt"> 78
</span><span class="lnt"> 79
</span><span class="lnt"> 80
</span><span class="lnt"> 81
</span><span class="lnt"> 82
</span><span class="lnt"> 83
</span><span class="lnt"> 84
</span><span class="lnt"> 85
</span><span class="lnt"> 86
</span><span class="lnt"> 87
</span><span class="lnt"> 88
</span><span class="lnt"> 89
</span><span class="lnt"> 90
</span><span class="lnt"> 91
</span><span class="lnt"> 92
</span><span class="lnt"> 93
</span><span class="lnt"> 94
</span><span class="lnt"> 95
</span><span class="lnt"> 96
</span><span class="lnt"> 97
</span><span class="lnt"> 98
</span><span class="lnt"> 99
</span><span class="lnt">100
</span><span class="lnt">101
</span><span class="lnt">102
</span><span class="lnt">103
</span><span class="lnt">104
</span><span class="lnt">105
</span><span class="lnt">106
</span><span class="lnt">107
</span><span class="lnt">108
</span><span class="lnt">109
</span><span class="lnt">110
</span><span class="lnt">111
</span><span class="lnt">112
</span><span class="lnt">113
</span><span class="lnt">114
</span><span class="lnt">115
</span><span class="lnt">116
</span><span class="lnt">117
</span><span class="lnt">118
</span><span class="lnt">119
</span><span class="lnt">120
</span><span class="lnt">121
</span><span class="lnt">122
</span><span class="lnt">123
</span><span class="lnt">124
</span><span class="lnt">125
</span><span class="lnt">126
</span><span class="lnt">127
</span><span class="lnt">128
</span><span class="lnt">129
</span><span class="lnt">130
</span><span class="lnt">131
</span><span class="lnt">132
</span><span class="lnt">133
</span><span class="lnt">134
</span><span class="lnt">135
</span><span class="lnt">136
</span><span class="lnt">137
</span><span class="lnt">138
</span><span class="lnt">139
</span><span class="lnt">140
</span><span class="lnt">141
</span><span class="lnt">142
</span><span class="lnt">143
</span><span class="lnt">144
</span><span class="lnt">145
</span><span class="lnt">146
</span><span class="lnt">147
</span><span class="lnt">148
</span><span class="lnt">149
</span><span class="lnt">150
</span><span class="lnt">151
</span><span class="lnt">152
</span><span class="lnt">153
</span><span class="lnt">154
</span><span class="lnt">155
</span><span class="lnt">156
</span><span class="lnt">157
</span><span class="lnt">158
</span><span class="lnt">159
</span><span class="lnt">160
</span><span class="lnt">161
</span><span class="lnt">162
</span><span class="lnt">163
</span><span class="lnt">164
</span><span class="lnt">165
</span><span class="lnt">166
</span><span class="lnt">167
</span><span class="lnt">168
</span><span class="lnt">169
</span><span class="lnt">170
</span><span class="lnt">171
</span><span class="lnt">172
</span><span class="lnt">173
</span><span class="lnt">174
</span><span class="lnt">175
</span><span class="lnt">176
</span><span class="lnt">177
</span><span class="lnt">178
</span><span class="lnt">179
</span><span class="lnt">180
</span><span class="lnt">181
</span><span class="lnt">182
</span><span class="lnt">183
</span><span class="lnt">184
</span><span class="lnt">185
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="kt">void</span> <span class="o">*</span> <span class="nf">pvPortMalloc</span><span class="p">(</span> <span class="kt">size_t</span> <span class="n">xWantedSize</span> <span class="p">,</span> <span class="kt">void</span> <span class="o">*</span> <span class="n">caller</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">BlockLink_t</span> <span class="o">*</span> <span class="n">pxBlock</span><span class="p">,</span> <span class="o">*</span> <span class="n">pxPreviousBlock</span><span class="p">,</span> <span class="o">*</span> <span class="n">pxNewBlockLink</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kt">void</span> <span class="o">*</span> <span class="n">pvReturn</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kt">size_t</span> <span class="n">xAdditionalRequiredSize</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kt">size_t</span> <span class="n">_xWantedSize</span> <span class="o">=</span> <span class="n">xWantedSize</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nf">vTaskSuspendAll</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="cm">/* If this is the first call to malloc then the heap will require
</span></span></span><span class="line"><span class="cl"><span class="cm">         * initialisation to setup the list of free blocks. */</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span><span class="p">(</span> <span class="n">pxEnd</span> <span class="o">==</span> <span class="nb">NULL</span> <span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="nf">prvHeapInit</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="k">else</span>
</span></span><span class="line"><span class="cl">        <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="nf">mtCOVERAGE_TEST_MARKER</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="k">if</span><span class="p">(</span> <span class="n">xWantedSize</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="cm">/* The wanted size must be increased so it can contain a BlockLink_t
</span></span></span><span class="line"><span class="cl"><span class="cm">             * structure in addition to the requested amount of bytes. Some
</span></span></span><span class="line"><span class="cl"><span class="cm">             * additional increment may also be needed for alignment. */</span>
</span></span><span class="line"><span class="cl">            <span class="n">xAdditionalRequiredSize</span> <span class="o">=</span> <span class="n">xHeapStructSize</span>  <span class="o">+</span> <span class="n">portBYTE_ALIGNMENT</span> <span class="o">-</span> <span class="p">(</span> <span class="n">xWantedSize</span> <span class="o">&amp;</span> <span class="n">portBYTE_ALIGNMENT_MASK</span> <span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            <span class="k">if</span><span class="p">(</span> <span class="nf">heapADD_WILL_OVERFLOW</span><span class="p">(</span> <span class="n">xWantedSize</span><span class="p">,</span> <span class="n">xAdditionalRequiredSize</span> <span class="p">)</span> <span class="o">==</span> <span class="mi">0</span> <span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="p">{</span>
</span></span><span class="line"><span class="cl">                <span class="n">xWantedSize</span> <span class="o">+=</span> <span class="n">xAdditionalRequiredSize</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">            <span class="p">}</span>
</span></span><span class="line"><span class="cl">            <span class="k">else</span>
</span></span><span class="line"><span class="cl">            <span class="p">{</span>
</span></span><span class="line"><span class="cl">                <span class="n">xWantedSize</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">            <span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="k">else</span>
</span></span><span class="line"><span class="cl">        <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="nf">mtCOVERAGE_TEST_MARKER</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="cm">/* Check the block size we are trying to allocate is not so large that the
</span></span></span><span class="line"><span class="cl"><span class="cm">         * top bit is set.  The top bit of the block size member of the BlockLink_t
</span></span></span><span class="line"><span class="cl"><span class="cm">         * structure is used to determine who owns the block - the application or
</span></span></span><span class="line"><span class="cl"><span class="cm">         * the kernel, so it must be free. */</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span><span class="p">(</span> <span class="nf">heapBLOCK_SIZE_IS_VALID</span><span class="p">(</span> <span class="n">xWantedSize</span> <span class="p">)</span> <span class="o">!=</span> <span class="mi">0</span> <span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="k">if</span><span class="p">(</span> <span class="p">(</span> <span class="n">xWantedSize</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="p">(</span> <span class="n">xWantedSize</span> <span class="o">&lt;=</span> <span class="n">xFreeBytesRemaining</span> <span class="p">)</span> <span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="p">{</span>
</span></span><span class="line"><span class="cl">                <span class="cm">/* Traverse the list from the start (lowest address) block until
</span></span></span><span class="line"><span class="cl"><span class="cm">                 * one of adequate size is found. */</span>
</span></span><span class="line"><span class="cl">                <span class="n">pxPreviousBlock</span> <span class="o">=</span> <span class="o">&amp;</span><span class="n">xStart</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">                <span class="n">pxBlock</span> <span class="o">=</span> <span class="n">xStart</span><span class="p">.</span><span class="n">pxNextFreeBlock</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                <span class="k">while</span><span class="p">(</span> <span class="p">(</span> <span class="n">pxBlock</span><span class="o">-&gt;</span><span class="n">xBlockSize</span> <span class="o">&lt;</span> <span class="n">xWantedSize</span> <span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="p">(</span> <span class="n">pxBlock</span><span class="o">-&gt;</span><span class="n">pxNextFreeBlock</span> <span class="o">!=</span> <span class="nb">NULL</span> <span class="p">)</span> <span class="p">)</span>
</span></span><span class="line"><span class="cl">                <span class="p">{</span>
</span></span><span class="line"><span class="cl">                    <span class="n">pxPreviousBlock</span> <span class="o">=</span> <span class="n">pxBlock</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">                    <span class="n">pxBlock</span> <span class="o">=</span> <span class="n">pxBlock</span><span class="o">-&gt;</span><span class="n">pxNextFreeBlock</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">                <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                <span class="cm">/* If the end marker was reached then a block of adequate size
</span></span></span><span class="line"><span class="cl"><span class="cm">                 * was not found. */</span>
</span></span><span class="line"><span class="cl">                <span class="k">if</span><span class="p">(</span> <span class="n">pxBlock</span> <span class="o">!=</span> <span class="n">pxEnd</span> <span class="p">)</span>
</span></span><span class="line"><span class="cl">                <span class="p">{</span>
</span></span><span class="line"><span class="cl">                    <span class="cm">/* Return the memory space pointed to - jumping over the
</span></span></span><span class="line"><span class="cl"><span class="cm">                     * BlockLink_t structure at its start. */</span>
</span></span><span class="line"><span class="cl">                    <span class="n">pvReturn</span> <span class="o">=</span> <span class="p">(</span> <span class="kt">void</span> <span class="o">*</span> <span class="p">)</span> <span class="p">(</span> <span class="p">(</span> <span class="p">(</span> <span class="kt">uint8_t</span> <span class="o">*</span> <span class="p">)</span> <span class="n">pxPreviousBlock</span><span class="o">-&gt;</span><span class="n">pxNextFreeBlock</span> <span class="p">)</span> <span class="o">+</span> <span class="n">xHeapStructSize</span> <span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                    <span class="cm">/* This block is being returned for use so must be taken out
</span></span></span><span class="line"><span class="cl"><span class="cm">                     * of the list of free blocks. */</span>
</span></span><span class="line"><span class="cl">                    <span class="n">pxPreviousBlock</span><span class="o">-&gt;</span><span class="n">pxNextFreeBlock</span> <span class="o">=</span> <span class="n">pxBlock</span><span class="o">-&gt;</span><span class="n">pxNextFreeBlock</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                    <span class="cm">/* If the block is larger than required it can be split into
</span></span></span><span class="line"><span class="cl"><span class="cm">                     * two. */</span>
</span></span><span class="line"><span class="cl">                    <span class="k">if</span><span class="p">(</span> <span class="p">(</span> <span class="n">pxBlock</span><span class="o">-&gt;</span><span class="n">xBlockSize</span> <span class="o">-</span> <span class="n">xWantedSize</span> <span class="p">)</span> <span class="o">&gt;</span> <span class="n">heapMINIMUM_BLOCK_SIZE</span> <span class="p">)</span>
</span></span><span class="line"><span class="cl">                    <span class="p">{</span>
</span></span><span class="line"><span class="cl">                        <span class="cm">/* This block is to be split into two.  Create a new
</span></span></span><span class="line"><span class="cl"><span class="cm">                         * block following the number of bytes requested. The void
</span></span></span><span class="line"><span class="cl"><span class="cm">                         * cast is used to prevent byte alignment warnings from the
</span></span></span><span class="line"><span class="cl"><span class="cm">                         * compiler. */</span>
</span></span><span class="line"><span class="cl">                        <span class="n">pxNewBlockLink</span> <span class="o">=</span> <span class="p">(</span> <span class="kt">void</span> <span class="o">*</span> <span class="p">)</span> <span class="p">(</span> <span class="p">(</span> <span class="p">(</span> <span class="kt">uint8_t</span> <span class="o">*</span> <span class="p">)</span> <span class="n">pxBlock</span> <span class="p">)</span> <span class="o">+</span> <span class="n">xWantedSize</span> <span class="p">);</span>
</span></span><span class="line"><span class="cl">                        <span class="nf">configASSERT</span><span class="p">(</span> <span class="p">(</span> <span class="p">(</span> <span class="p">(</span> <span class="kt">size_t</span> <span class="p">)</span> <span class="n">pxNewBlockLink</span> <span class="p">)</span> <span class="o">&amp;</span> <span class="n">portBYTE_ALIGNMENT_MASK</span> <span class="p">)</span> <span class="o">==</span> <span class="mi">0</span> <span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                        <span class="cm">/* Calculate the sizes of two blocks split from the
</span></span></span><span class="line"><span class="cl"><span class="cm">                         * single block. */</span>
</span></span><span class="line"><span class="cl">                        <span class="n">pxNewBlockLink</span><span class="o">-&gt;</span><span class="n">xBlockSize</span> <span class="o">=</span> <span class="n">pxBlock</span><span class="o">-&gt;</span><span class="n">xBlockSize</span> <span class="o">-</span> <span class="n">xWantedSize</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">                        <span class="n">pxNewBlockLink</span><span class="o">-&gt;</span><span class="n">xWantedSize</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">                        <span class="n">pxNewBlockLink</span><span class="o">-&gt;</span><span class="n">caller</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">                        <span class="n">pxBlock</span><span class="o">-&gt;</span><span class="n">xBlockSize</span> <span class="o">=</span> <span class="n">xWantedSize</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                        <span class="cm">/* Insert the new block into the list of free blocks. */</span>
</span></span><span class="line"><span class="cl">                        <span class="nf">prvInsertBlockIntoFreeList</span><span class="p">(</span> <span class="n">pxNewBlockLink</span> <span class="p">);</span>
</span></span><span class="line"><span class="cl">                    <span class="p">}</span>
</span></span><span class="line"><span class="cl">                    <span class="k">else</span>
</span></span><span class="line"><span class="cl">                    <span class="p">{</span>
</span></span><span class="line"><span class="cl">                        <span class="nf">mtCOVERAGE_TEST_MARKER</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">                    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                    
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                    <span class="n">xFreeBytesRemaining</span> <span class="o">-=</span> <span class="n">pxBlock</span><span class="o">-&gt;</span><span class="n">xBlockSize</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">                    
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                    <span class="k">if</span><span class="p">(</span> <span class="n">xFreeBytesRemaining</span> <span class="o">&lt;</span> <span class="n">xMinimumEverFreeBytesRemaining</span> <span class="p">)</span>
</span></span><span class="line"><span class="cl">                    <span class="p">{</span>
</span></span><span class="line"><span class="cl">                        <span class="n">xMinimumEverFreeBytesRemaining</span> <span class="o">=</span> <span class="n">xFreeBytesRemaining</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">                    <span class="p">}</span>
</span></span><span class="line"><span class="cl">                    <span class="k">else</span>
</span></span><span class="line"><span class="cl">                    <span class="p">{</span>
</span></span><span class="line"><span class="cl">                        <span class="nf">mtCOVERAGE_TEST_MARKER</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">                    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">              
</span></span><span class="line"><span class="cl">                    <span class="n">pxBlock</span><span class="o">-&gt;</span><span class="n">xWantedSize</span> <span class="o">=</span> <span class="n">_xWantedSize</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">                    <span class="n">pxBlock</span><span class="o">-&gt;</span><span class="n">caller</span> <span class="o">=</span> <span class="n">caller</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">                    <span class="cm">/* The block is being returned - it is allocated and owned
</span></span></span><span class="line"><span class="cl"><span class="cm">                     * by the application and has no &#34;next&#34; block. */</span>
</span></span><span class="line"><span class="cl">                    <span class="nf">heapALLOCATE_BLOCK</span><span class="p">(</span> <span class="n">pxBlock</span> <span class="p">);</span>
</span></span><span class="line"><span class="cl">                    <span class="n">pxBlock</span><span class="o">-&gt;</span><span class="n">pxNextFreeBlock</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">                    <span class="n">xNumberOfSuccessfulAllocations</span><span class="o">++</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">                <span class="p">}</span>
</span></span><span class="line"><span class="cl">                <span class="k">else</span>
</span></span><span class="line"><span class="cl">                <span class="p">{</span>
</span></span><span class="line"><span class="cl">                    <span class="nf">mtCOVERAGE_TEST_MARKER</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">                <span class="p">}</span>
</span></span><span class="line"><span class="cl">            <span class="p">}</span>
</span></span><span class="line"><span class="cl">            <span class="k">else</span>
</span></span><span class="line"><span class="cl">            <span class="p">{</span>
</span></span><span class="line"><span class="cl">                <span class="nf">mtCOVERAGE_TEST_MARKER</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">            <span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="k">else</span>
</span></span><span class="line"><span class="cl">        <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="nf">mtCOVERAGE_TEST_MARKER</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="nf">traceMALLOC</span><span class="p">(</span> <span class="n">pvReturn</span><span class="p">,</span> <span class="n">xWantedSize</span> <span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="nf">xTaskResumeAll</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="cp">#if ( configUSE_MALLOC_FAILED_HOOK == 1 )
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span><span class="p">(</span> <span class="n">pvReturn</span> <span class="o">==</span> <span class="nb">NULL</span> <span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="nf">vApplicationMallocFailedHook</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="k">else</span>
</span></span><span class="line"><span class="cl">        <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="nf">mtCOVERAGE_TEST_MARKER</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="cp">#endif </span><span class="cm">/* if ( configUSE_MALLOC_FAILED_HOOK == 1 ) */</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl">    <span class="nf">configASSERT</span><span class="p">(</span> <span class="p">(</span> <span class="p">(</span> <span class="p">(</span> <span class="kt">size_t</span> <span class="p">)</span> <span class="n">pvReturn</span> <span class="p">)</span> <span class="o">&amp;</span> <span class="p">(</span> <span class="kt">size_t</span> <span class="p">)</span> <span class="n">portBYTE_ALIGNMENT_MASK</span> <span class="p">)</span> <span class="o">==</span> <span class="mi">0</span> <span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">pvReturn</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="o">*</span><span class="nf">pvPortRealloc</span><span class="p">(</span><span class="kt">void</span> <span class="o">*</span><span class="n">p</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">                    <span class="kt">size_t</span> <span class="n">xSize</span><span class="p">,</span> <span class="kt">void</span> <span class="o">*</span> <span class="n">caller</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kt">void</span> <span class="o">*</span><span class="n">pv</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kt">uint8_t</span> <span class="o">*</span><span class="n">puc</span> <span class="o">=</span> <span class="p">(</span><span class="kt">uint8_t</span> <span class="o">*</span><span class="p">)</span><span class="n">p</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="n">BlockLink_t</span> <span class="o">*</span><span class="n">pxLink</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="p">(</span><span class="n">p</span> <span class="o">==</span> <span class="nb">NULL</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="nb">NULL</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">puc</span> <span class="o">-=</span> <span class="n">xHeapStructSize</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="n">pxLink</span> <span class="o">=</span> <span class="p">(</span><span class="kt">void</span> <span class="o">*</span><span class="p">)</span><span class="n">puc</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nf">configASSERT</span><span class="p">(</span><span class="nf">heapBLOCK_IS_ALLOCATED</span><span class="p">(</span><span class="n">pxLink</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">configASSERT</span><span class="p">(</span><span class="n">pxLink</span><span class="o">-&gt;</span><span class="n">pxNextFreeBlock</span> <span class="o">==</span> <span class="nb">NULL</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">pv</span> <span class="o">=</span> <span class="nf">pvPortMalloc</span><span class="p">(</span><span class="n">xSize</span><span class="p">,</span> <span class="n">caller</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="p">(</span><span class="n">pv</span> <span class="o">==</span> <span class="nb">NULL</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="nb">NULL</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="nf">memcpy</span><span class="p">(</span><span class="n">pv</span><span class="p">,</span> <span class="n">p</span><span class="p">,</span> <span class="n">pxLink</span><span class="o">-&gt;</span><span class="n">xWantedSize</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">vPortFree</span><span class="p">(</span><span class="n">p</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">pv</span><span class="p">;</span>   
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>遍历 heap 所有的内存块，打印出其调用者、申请内存大小、是已分配的内存块还是空闲的内存块，利用这些信息排查内存泄漏。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">show_heap_info</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">BlockLink_t</span> <span class="o">*</span> <span class="n">pxLink</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kt">uint8_t</span> <span class="o">*</span> <span class="n">pucAlignedHeap</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kt">size_t</span> <span class="n">uxAddress</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kt">size_t</span> <span class="n">xTotalHeapSize</span> <span class="o">=</span> <span class="n">configTOTAL_HEAP_SIZE</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nf">vTaskSuspendAll</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">    <span class="n">uxAddress</span> <span class="o">=</span> <span class="p">(</span> <span class="kt">size_t</span> <span class="p">)</span> <span class="n">ucHeap</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">if</span><span class="p">(</span> <span class="p">(</span> <span class="n">uxAddress</span> <span class="o">&amp;</span> <span class="n">portBYTE_ALIGNMENT_MASK</span> <span class="p">)</span> <span class="o">!=</span> <span class="mi">0</span> <span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="n">uxAddress</span> <span class="o">+=</span> <span class="p">(</span> <span class="n">portBYTE_ALIGNMENT</span> <span class="o">-</span> <span class="mi">1</span> <span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="n">uxAddress</span> <span class="o">&amp;=</span> <span class="o">~</span><span class="p">(</span> <span class="p">(</span> <span class="kt">size_t</span> <span class="p">)</span> <span class="n">portBYTE_ALIGNMENT_MASK</span> <span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="n">xTotalHeapSize</span> <span class="o">-=</span> <span class="n">uxAddress</span> <span class="o">-</span> <span class="p">(</span> <span class="kt">size_t</span> <span class="p">)</span> <span class="n">ucHeap</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">pucAlignedHeap</span> <span class="o">=</span> <span class="p">(</span> <span class="kt">uint8_t</span> <span class="o">*</span> <span class="p">)</span> <span class="n">uxAddress</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">pxLink</span> <span class="o">=</span> <span class="p">(</span><span class="n">BlockLink_t</span> <span class="o">*</span><span class="p">)</span><span class="n">pucAlignedHeap</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\r\n</span><span class="s">address: 0x%p</span><span class="se">\r\n</span><span class="s">size: %d</span><span class="se">\r\n</span><span class="s">avail: %d</span><span class="se">\r\n</span><span class="s">pool_start: 0x%p</span><span class="se">\r\n</span><span class="s">pool_end: 0x%p</span><span class="se">\r\n</span><span class="s">&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">           <span class="n">ucHeap</span><span class="p">,</span> <span class="n">xTotalHeapSize</span><span class="p">,</span> <span class="n">xFreeBytesRemaining</span><span class="p">,</span> <span class="n">pucAlignedHeap</span><span class="p">,</span> <span class="n">pxEnd</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;state,block_addr,user_addr,caller,blocksize,wanted_size</span><span class="se">\r\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"> 
</span></span><span class="line"><span class="cl">    <span class="k">while</span> <span class="p">(</span><span class="n">pxLink</span> <span class="o">!=</span> <span class="n">pxEnd</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">		
</span></span><span class="line"><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;%s, 0x%p, 0x%p, 0x%p,%d,%d</span><span class="se">\r\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="p">((</span><span class="n">pxLink</span><span class="o">-&gt;</span><span class="n">xBlockSize</span> <span class="o">&amp;</span> <span class="n">heapBLOCK_ALLOCATED_BITMASK</span><span class="p">)</span><span class="o">!=</span><span class="mi">0</span><span class="p">)</span><span class="o">?</span> <span class="s">&#34;U&#34;</span><span class="o">:</span><span class="s">&#34;F&#34;</span><span class="p">,</span> <span class="n">pxLink</span><span class="p">,</span> <span class="p">(</span><span class="kt">uint8_t</span> <span class="o">*</span><span class="p">)</span><span class="n">pxLink</span><span class="o">+</span><span class="n">xHeapStructSize</span><span class="p">,</span> <span class="n">pxLink</span><span class="o">-&gt;</span><span class="n">caller</span><span class="p">,</span> <span class="p">((</span> <span class="n">pxLink</span><span class="o">-&gt;</span><span class="n">xBlockSize</span> <span class="p">)</span> <span class="o">&amp;</span> <span class="o">~</span><span class="n">heapBLOCK_ALLOCATED_BITMASK</span><span class="p">),</span> <span class="n">pxLink</span><span class="o">-&gt;</span><span class="n">xWantedSize</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="n">pxLink</span> <span class="o">=</span><span class="p">(</span><span class="n">BlockLink_t</span> <span class="o">*</span><span class="p">)</span> <span class="p">((</span> <span class="kt">uint8_t</span> <span class="o">*</span> <span class="p">)</span><span class="n">pxLink</span> <span class="o">+</span> <span class="p">((</span> <span class="n">pxLink</span><span class="o">-&gt;</span><span class="n">xBlockSize</span> <span class="p">)</span> <span class="o">&amp;</span> <span class="o">~</span><span class="n">heapBLOCK_ALLOCATED_BITMASK</span><span class="p">));</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nf">xTaskResumeAll</span><span class="p">();</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><ul>
<li>利用库打桩机制，替换标准库中的 malloc free realloc 等内存分配函数。</li>
</ul>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span><span class="lnt">38
</span><span class="lnt">39
</span><span class="lnt">40
</span><span class="lnt">41
</span><span class="lnt">42
</span><span class="lnt">43
</span><span class="lnt">44
</span><span class="lnt">45
</span><span class="lnt">46
</span><span class="lnt">47
</span><span class="lnt">48
</span><span class="lnt">49
</span><span class="lnt">50
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="cm">/************** wrap C library functions **************/</span>
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="o">*</span> <span class="nf">__wrap_malloc</span> <span class="p">(</span><span class="kt">size_t</span> <span class="n">size</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kt">void</span> <span class="o">*</span><span class="n">caller</span> <span class="o">=</span> <span class="nf">__builtin_return_address</span> <span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="k">return</span> <span class="nf">pvPortMalloc</span><span class="p">(</span><span class="n">size</span><span class="p">,</span> <span class="n">caller</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="o">*</span> <span class="nf">__wrap__malloc_r</span> <span class="p">(</span><span class="kt">void</span> <span class="o">*</span><span class="n">p</span><span class="p">,</span> <span class="kt">size_t</span> <span class="n">size</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="kt">void</span> <span class="o">*</span><span class="n">caller</span> <span class="o">=</span> <span class="nf">__builtin_return_address</span> <span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="k">return</span> <span class="nf">pvPortMalloc</span><span class="p">(</span><span class="n">size</span><span class="p">,</span> <span class="n">caller</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">__wrap_free</span> <span class="p">(</span><span class="kt">void</span> <span class="o">*</span><span class="n">pv</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="nf">vPortFree</span><span class="p">(</span><span class="n">pv</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="o">*</span> <span class="nf">__wrap_calloc</span> <span class="p">(</span><span class="kt">size_t</span> <span class="n">a</span><span class="p">,</span> <span class="kt">size_t</span> <span class="n">b</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="kt">void</span> <span class="o">*</span><span class="n">pvReturn</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kt">void</span> <span class="o">*</span><span class="n">caller</span> <span class="o">=</span> <span class="nf">__builtin_return_address</span> <span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">pvReturn</span> <span class="o">=</span> <span class="nf">pvPortMalloc</span><span class="p">(</span> <span class="n">a</span><span class="o">*</span><span class="n">b</span><span class="p">,</span> <span class="n">caller</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="p">(</span><span class="n">pvReturn</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nf">memset</span><span class="p">(</span><span class="n">pvReturn</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">a</span><span class="o">*</span><span class="n">b</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">pvReturn</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="o">*</span> <span class="nf">__wrap_realloc</span> <span class="p">(</span><span class="kt">void</span><span class="o">*</span> <span class="n">pv</span><span class="p">,</span> <span class="kt">size_t</span> <span class="n">size</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kt">void</span> <span class="o">*</span><span class="n">caller</span> <span class="o">=</span> <span class="nf">__builtin_return_address</span> <span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="k">return</span> <span class="nf">pvPortRealloc</span><span class="p">(</span><span class="n">pv</span><span class="p">,</span> <span class="n">size</span><span class="p">,</span> <span class="n">caller</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">__wrap__free_r</span> <span class="p">(</span><span class="kt">void</span> <span class="o">*</span><span class="n">p</span><span class="p">,</span> <span class="kt">void</span> <span class="o">*</span><span class="n">x</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nf">__wrap_free</span><span class="p">(</span><span class="n">x</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">void</span><span class="o">*</span> <span class="nf">__wrap__realloc_r</span> <span class="p">(</span><span class="kt">void</span> <span class="o">*</span><span class="n">p</span><span class="p">,</span> <span class="kt">void</span><span class="o">*</span> <span class="n">x</span><span class="p">,</span> <span class="kt">size_t</span> <span class="n">sz</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kt">void</span> <span class="o">*</span><span class="n">caller</span> <span class="o">=</span> <span class="nf">__builtin_return_address</span> <span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="k">return</span> <span class="nf">pvPortRealloc</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">sz</span><span class="p">,</span> <span class="n">caller</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="cm">/*-----------------------------------------------------------*/</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>gcc 的链接器支持用 &ndash;wrap f 参数进行链接时打桩，这个参数告诉链接器，把对符号 f 的引用解析成 __wrap_f。通过这个机制，我们调用malloc的时候，便会替换成我们加了调试信息的__wrap_malloc。另外，再使用 __builtin_return_address 接口获取函数的返回地址并记录，这样就知道是谁申请了这块内存。</p>
<p>最后再添加连接器参数：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span><span class="lnt">9
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">sdk_add_link_options(
</span></span><span class="line"><span class="cl">        -Wl,--wrap=malloc
</span></span><span class="line"><span class="cl">        -Wl,--wrap=_malloc_r
</span></span><span class="line"><span class="cl">        -Wl,--wrap=free
</span></span><span class="line"><span class="cl">        -Wl,--wrap=calloc
</span></span><span class="line"><span class="cl">        -Wl,--wrap=realloc
</span></span><span class="line"><span class="cl">        -Wl,--wrap=_free_r
</span></span><span class="line"><span class="cl">        -Wl,--wrap=_realloc_r
</span></span><span class="line"><span class="cl">)
</span></span></code></pre></td></tr></table>
</div>
</div><p>对于内存越界问题，可以在每个内存块的末尾增加冗余长度，并填充特定数据，在内存释放的时候检查填充的数据有没有被篡改，以此判断是否存在内存被破坏问题。</p>
<ul>
<li>pvPortMalloc 的修改</li>
</ul>
<p>在 xWantedSize 的基础上增加一个字节，确保内存块的尾部够空间填充一个特殊数据。然后在将要分配出去的内存块中末尾未使用的数据全部填充为0xfd，填充的长度为 pxBlock-&gt;xBlockSize-_xWantedSize-xHeapStructSize。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">  1
</span><span class="lnt">  2
</span><span class="lnt">  3
</span><span class="lnt">  4
</span><span class="lnt">  5
</span><span class="lnt">  6
</span><span class="lnt">  7
</span><span class="lnt">  8
</span><span class="lnt">  9
</span><span class="lnt"> 10
</span><span class="lnt"> 11
</span><span class="lnt"> 12
</span><span class="lnt"> 13
</span><span class="lnt"> 14
</span><span class="lnt"> 15
</span><span class="lnt"> 16
</span><span class="lnt"> 17
</span><span class="lnt"> 18
</span><span class="lnt"> 19
</span><span class="lnt"> 20
</span><span class="lnt"> 21
</span><span class="lnt"> 22
</span><span class="lnt"> 23
</span><span class="lnt"> 24
</span><span class="lnt"> 25
</span><span class="lnt"> 26
</span><span class="lnt"> 27
</span><span class="lnt"> 28
</span><span class="lnt"> 29
</span><span class="lnt"> 30
</span><span class="lnt"> 31
</span><span class="lnt"> 32
</span><span class="lnt"> 33
</span><span class="lnt"> 34
</span><span class="lnt"> 35
</span><span class="lnt"> 36
</span><span class="lnt"> 37
</span><span class="lnt"> 38
</span><span class="lnt"> 39
</span><span class="lnt"> 40
</span><span class="lnt"> 41
</span><span class="lnt"> 42
</span><span class="lnt"> 43
</span><span class="lnt"> 44
</span><span class="lnt"> 45
</span><span class="lnt"> 46
</span><span class="lnt"> 47
</span><span class="lnt"> 48
</span><span class="lnt"> 49
</span><span class="lnt"> 50
</span><span class="lnt"> 51
</span><span class="lnt"> 52
</span><span class="lnt"> 53
</span><span class="lnt"> 54
</span><span class="lnt"> 55
</span><span class="lnt"> 56
</span><span class="lnt"> 57
</span><span class="lnt"> 58
</span><span class="lnt"> 59
</span><span class="lnt"> 60
</span><span class="lnt"> 61
</span><span class="lnt"> 62
</span><span class="lnt"> 63
</span><span class="lnt"> 64
</span><span class="lnt"> 65
</span><span class="lnt"> 66
</span><span class="lnt"> 67
</span><span class="lnt"> 68
</span><span class="lnt"> 69
</span><span class="lnt"> 70
</span><span class="lnt"> 71
</span><span class="lnt"> 72
</span><span class="lnt"> 73
</span><span class="lnt"> 74
</span><span class="lnt"> 75
</span><span class="lnt"> 76
</span><span class="lnt"> 77
</span><span class="lnt"> 78
</span><span class="lnt"> 79
</span><span class="lnt"> 80
</span><span class="lnt"> 81
</span><span class="lnt"> 82
</span><span class="lnt"> 83
</span><span class="lnt"> 84
</span><span class="lnt"> 85
</span><span class="lnt"> 86
</span><span class="lnt"> 87
</span><span class="lnt"> 88
</span><span class="lnt"> 89
</span><span class="lnt"> 90
</span><span class="lnt"> 91
</span><span class="lnt"> 92
</span><span class="lnt"> 93
</span><span class="lnt"> 94
</span><span class="lnt"> 95
</span><span class="lnt"> 96
</span><span class="lnt"> 97
</span><span class="lnt"> 98
</span><span class="lnt"> 99
</span><span class="lnt">100
</span><span class="lnt">101
</span><span class="lnt">102
</span><span class="lnt">103
</span><span class="lnt">104
</span><span class="lnt">105
</span><span class="lnt">106
</span><span class="lnt">107
</span><span class="lnt">108
</span><span class="lnt">109
</span><span class="lnt">110
</span><span class="lnt">111
</span><span class="lnt">112
</span><span class="lnt">113
</span><span class="lnt">114
</span><span class="lnt">115
</span><span class="lnt">116
</span><span class="lnt">117
</span><span class="lnt">118
</span><span class="lnt">119
</span><span class="lnt">120
</span><span class="lnt">121
</span><span class="lnt">122
</span><span class="lnt">123
</span><span class="lnt">124
</span><span class="lnt">125
</span><span class="lnt">126
</span><span class="lnt">127
</span><span class="lnt">128
</span><span class="lnt">129
</span><span class="lnt">130
</span><span class="lnt">131
</span><span class="lnt">132
</span><span class="lnt">133
</span><span class="lnt">134
</span><span class="lnt">135
</span><span class="lnt">136
</span><span class="lnt">137
</span><span class="lnt">138
</span><span class="lnt">139
</span><span class="lnt">140
</span><span class="lnt">141
</span><span class="lnt">142
</span><span class="lnt">143
</span><span class="lnt">144
</span><span class="lnt">145
</span><span class="lnt">146
</span><span class="lnt">147
</span><span class="lnt">148
</span><span class="lnt">149
</span><span class="lnt">150
</span><span class="lnt">151
</span><span class="lnt">152
</span><span class="lnt">153
</span><span class="lnt">154
</span><span class="lnt">155
</span><span class="lnt">156
</span><span class="lnt">157
</span><span class="lnt">158
</span><span class="lnt">159
</span><span class="lnt">160
</span><span class="lnt">161
</span><span class="lnt">162
</span><span class="lnt">163
</span><span class="lnt">164
</span><span class="lnt">165
</span><span class="lnt">166
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="kt">void</span> <span class="o">*</span> <span class="nf">pvPortMalloc</span><span class="p">(</span> <span class="kt">size_t</span> <span class="n">xWantedSize</span> <span class="p">,</span> <span class="kt">void</span> <span class="o">*</span> <span class="n">caller</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">BlockLink_t</span> <span class="o">*</span> <span class="n">pxBlock</span><span class="p">,</span> <span class="o">*</span> <span class="n">pxPreviousBlock</span><span class="p">,</span> <span class="o">*</span> <span class="n">pxNewBlockLink</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kt">void</span> <span class="o">*</span> <span class="n">pvReturn</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kt">size_t</span> <span class="n">xAdditionalRequiredSize</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kt">size_t</span> <span class="n">_xWantedSize</span> <span class="o">=</span> <span class="n">xWantedSize</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nf">vTaskSuspendAll</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="cm">/* If this is the first call to malloc then the heap will require
</span></span></span><span class="line"><span class="cl"><span class="cm">         * initialisation to setup the list of free blocks. */</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span><span class="p">(</span> <span class="n">pxEnd</span> <span class="o">==</span> <span class="nb">NULL</span> <span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="nf">prvHeapInit</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="k">else</span>
</span></span><span class="line"><span class="cl">        <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="nf">mtCOVERAGE_TEST_MARKER</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="k">if</span><span class="p">(</span> <span class="n">xWantedSize</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="cm">/* The wanted size must be increased so it can contain a BlockLink_t
</span></span></span><span class="line"><span class="cl"><span class="cm">             * structure in addition to the requested amount of bytes. Some
</span></span></span><span class="line"><span class="cl"><span class="cm">             * additional increment may also be needed for alignment. */</span>
</span></span><span class="line"><span class="cl">            <span class="n">xWantedSize</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">            <span class="n">xAdditionalRequiredSize</span> <span class="o">=</span> <span class="n">xHeapStructSize</span>  <span class="o">+</span> <span class="n">portBYTE_ALIGNMENT</span> <span class="o">-</span> <span class="p">(</span> <span class="n">xWantedSize</span> <span class="o">&amp;</span> <span class="n">portBYTE_ALIGNMENT_MASK</span> <span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            <span class="k">if</span><span class="p">(</span> <span class="nf">heapADD_WILL_OVERFLOW</span><span class="p">(</span> <span class="n">xWantedSize</span><span class="p">,</span> <span class="n">xAdditionalRequiredSize</span> <span class="p">)</span> <span class="o">==</span> <span class="mi">0</span> <span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="p">{</span>
</span></span><span class="line"><span class="cl">                <span class="n">xWantedSize</span> <span class="o">+=</span> <span class="n">xAdditionalRequiredSize</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">            <span class="p">}</span>
</span></span><span class="line"><span class="cl">            <span class="k">else</span>
</span></span><span class="line"><span class="cl">            <span class="p">{</span>
</span></span><span class="line"><span class="cl">                <span class="n">xWantedSize</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">            <span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="k">else</span>
</span></span><span class="line"><span class="cl">        <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="nf">mtCOVERAGE_TEST_MARKER</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="cm">/* Check the block size we are trying to allocate is not so large that the
</span></span></span><span class="line"><span class="cl"><span class="cm">         * top bit is set.  The top bit of the block size member of the BlockLink_t
</span></span></span><span class="line"><span class="cl"><span class="cm">         * structure is used to determine who owns the block - the application or
</span></span></span><span class="line"><span class="cl"><span class="cm">         * the kernel, so it must be free. */</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span><span class="p">(</span> <span class="nf">heapBLOCK_SIZE_IS_VALID</span><span class="p">(</span> <span class="n">xWantedSize</span> <span class="p">)</span> <span class="o">!=</span> <span class="mi">0</span> <span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="k">if</span><span class="p">(</span> <span class="p">(</span> <span class="n">xWantedSize</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="p">(</span> <span class="n">xWantedSize</span> <span class="o">&lt;=</span> <span class="n">xFreeBytesRemaining</span> <span class="p">)</span> <span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="p">{</span>
</span></span><span class="line"><span class="cl">                <span class="cm">/* Traverse the list from the start (lowest address) block until
</span></span></span><span class="line"><span class="cl"><span class="cm">                 * one of adequate size is found. */</span>
</span></span><span class="line"><span class="cl">                <span class="n">pxPreviousBlock</span> <span class="o">=</span> <span class="o">&amp;</span><span class="n">xStart</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">                <span class="n">pxBlock</span> <span class="o">=</span> <span class="n">xStart</span><span class="p">.</span><span class="n">pxNextFreeBlock</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                <span class="k">while</span><span class="p">(</span> <span class="p">(</span> <span class="n">pxBlock</span><span class="o">-&gt;</span><span class="n">xBlockSize</span> <span class="o">&lt;</span> <span class="n">xWantedSize</span> <span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="p">(</span> <span class="n">pxBlock</span><span class="o">-&gt;</span><span class="n">pxNextFreeBlock</span> <span class="o">!=</span> <span class="nb">NULL</span> <span class="p">)</span> <span class="p">)</span>
</span></span><span class="line"><span class="cl">                <span class="p">{</span>
</span></span><span class="line"><span class="cl">                    <span class="n">pxPreviousBlock</span> <span class="o">=</span> <span class="n">pxBlock</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">                    <span class="n">pxBlock</span> <span class="o">=</span> <span class="n">pxBlock</span><span class="o">-&gt;</span><span class="n">pxNextFreeBlock</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">                <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                <span class="cm">/* If the end marker was reached then a block of adequate size
</span></span></span><span class="line"><span class="cl"><span class="cm">                 * was not found. */</span>
</span></span><span class="line"><span class="cl">                <span class="k">if</span><span class="p">(</span> <span class="n">pxBlock</span> <span class="o">!=</span> <span class="n">pxEnd</span> <span class="p">)</span>
</span></span><span class="line"><span class="cl">                <span class="p">{</span>
</span></span><span class="line"><span class="cl">                    <span class="cm">/* Return the memory space pointed to - jumping over the
</span></span></span><span class="line"><span class="cl"><span class="cm">                     * BlockLink_t structure at its start. */</span>
</span></span><span class="line"><span class="cl">                    <span class="n">pvReturn</span> <span class="o">=</span> <span class="p">(</span> <span class="kt">void</span> <span class="o">*</span> <span class="p">)</span> <span class="p">(</span> <span class="p">(</span> <span class="p">(</span> <span class="kt">uint8_t</span> <span class="o">*</span> <span class="p">)</span> <span class="n">pxPreviousBlock</span><span class="o">-&gt;</span><span class="n">pxNextFreeBlock</span> <span class="p">)</span> <span class="o">+</span> <span class="n">xHeapStructSize</span> <span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                    <span class="cm">/* This block is being returned for use so must be taken out
</span></span></span><span class="line"><span class="cl"><span class="cm">                     * of the list of free blocks. */</span>
</span></span><span class="line"><span class="cl">                    <span class="n">pxPreviousBlock</span><span class="o">-&gt;</span><span class="n">pxNextFreeBlock</span> <span class="o">=</span> <span class="n">pxBlock</span><span class="o">-&gt;</span><span class="n">pxNextFreeBlock</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                    <span class="cm">/* If the block is larger than required it can be split into
</span></span></span><span class="line"><span class="cl"><span class="cm">                     * two. */</span>
</span></span><span class="line"><span class="cl">                    <span class="k">if</span><span class="p">(</span> <span class="p">(</span> <span class="n">pxBlock</span><span class="o">-&gt;</span><span class="n">xBlockSize</span> <span class="o">-</span> <span class="n">xWantedSize</span> <span class="p">)</span> <span class="o">&gt;</span> <span class="n">heapMINIMUM_BLOCK_SIZE</span> <span class="p">)</span>
</span></span><span class="line"><span class="cl">                    <span class="p">{</span>
</span></span><span class="line"><span class="cl">                        <span class="cm">/* This block is to be split into two.  Create a new
</span></span></span><span class="line"><span class="cl"><span class="cm">                         * block following the number of bytes requested. The void
</span></span></span><span class="line"><span class="cl"><span class="cm">                         * cast is used to prevent byte alignment warnings from the
</span></span></span><span class="line"><span class="cl"><span class="cm">                         * compiler. */</span>
</span></span><span class="line"><span class="cl">                        <span class="n">pxNewBlockLink</span> <span class="o">=</span> <span class="p">(</span> <span class="kt">void</span> <span class="o">*</span> <span class="p">)</span> <span class="p">(</span> <span class="p">(</span> <span class="p">(</span> <span class="kt">uint8_t</span> <span class="o">*</span> <span class="p">)</span> <span class="n">pxBlock</span> <span class="p">)</span> <span class="o">+</span> <span class="n">xWantedSize</span> <span class="p">);</span>
</span></span><span class="line"><span class="cl">                        <span class="nf">configASSERT</span><span class="p">(</span> <span class="p">(</span> <span class="p">(</span> <span class="p">(</span> <span class="kt">size_t</span> <span class="p">)</span> <span class="n">pxNewBlockLink</span> <span class="p">)</span> <span class="o">&amp;</span> <span class="n">portBYTE_ALIGNMENT_MASK</span> <span class="p">)</span> <span class="o">==</span> <span class="mi">0</span> <span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                        <span class="cm">/* Calculate the sizes of two blocks split from the
</span></span></span><span class="line"><span class="cl"><span class="cm">                         * single block. */</span>
</span></span><span class="line"><span class="cl">                        <span class="n">pxNewBlockLink</span><span class="o">-&gt;</span><span class="n">xBlockSize</span> <span class="o">=</span> <span class="n">pxBlock</span><span class="o">-&gt;</span><span class="n">xBlockSize</span> <span class="o">-</span> <span class="n">xWantedSize</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">                        <span class="n">pxNewBlockLink</span><span class="o">-&gt;</span><span class="n">xWantedSize</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">                        <span class="n">pxNewBlockLink</span><span class="o">-&gt;</span><span class="n">caller</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">                        <span class="n">pxBlock</span><span class="o">-&gt;</span><span class="n">xBlockSize</span> <span class="o">=</span> <span class="n">xWantedSize</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                        <span class="cm">/* Insert the new block into the list of free blocks. */</span>
</span></span><span class="line"><span class="cl">                        <span class="nf">prvInsertBlockIntoFreeList</span><span class="p">(</span> <span class="n">pxNewBlockLink</span> <span class="p">);</span>
</span></span><span class="line"><span class="cl">                    <span class="p">}</span>
</span></span><span class="line"><span class="cl">                    <span class="k">else</span>
</span></span><span class="line"><span class="cl">                    <span class="p">{</span>
</span></span><span class="line"><span class="cl">                        <span class="nf">mtCOVERAGE_TEST_MARKER</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">                    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                    
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                    <span class="n">xFreeBytesRemaining</span> <span class="o">-=</span> <span class="n">pxBlock</span><span class="o">-&gt;</span><span class="n">xBlockSize</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">                    
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                    <span class="k">if</span><span class="p">(</span> <span class="n">xFreeBytesRemaining</span> <span class="o">&lt;</span> <span class="n">xMinimumEverFreeBytesRemaining</span> <span class="p">)</span>
</span></span><span class="line"><span class="cl">                    <span class="p">{</span>
</span></span><span class="line"><span class="cl">                        <span class="n">xMinimumEverFreeBytesRemaining</span> <span class="o">=</span> <span class="n">xFreeBytesRemaining</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">                    <span class="p">}</span>
</span></span><span class="line"><span class="cl">                    <span class="k">else</span>
</span></span><span class="line"><span class="cl">                    <span class="p">{</span>
</span></span><span class="line"><span class="cl">                        <span class="nf">mtCOVERAGE_TEST_MARKER</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">                    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">              
</span></span><span class="line"><span class="cl">                    <span class="n">pxBlock</span><span class="o">-&gt;</span><span class="n">xWantedSize</span> <span class="o">=</span> <span class="n">_xWantedSize</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">                    <span class="n">pxBlock</span><span class="o">-&gt;</span><span class="n">caller</span> <span class="o">=</span> <span class="n">caller</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">                    <span class="kt">int</span> <span class="n">_len</span> <span class="o">=</span> <span class="n">pxBlock</span><span class="o">-&gt;</span><span class="n">xBlockSize</span><span class="o">-</span><span class="n">_xWantedSize</span><span class="o">-</span><span class="n">xHeapStructSize</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">					<span class="kt">uint8_t</span> <span class="o">*</span><span class="n">_p</span> <span class="o">=</span> <span class="p">(</span><span class="kt">uint8_t</span> <span class="o">*</span><span class="p">)</span><span class="n">pxBlock</span><span class="o">+</span><span class="n">_xWantedSize</span><span class="o">+</span><span class="n">xHeapStructSize</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">					<span class="k">while</span> <span class="p">(</span><span class="n">_len</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">					<span class="p">{</span>
</span></span><span class="line"><span class="cl">						<span class="o">*</span><span class="n">_p</span> <span class="o">=</span> <span class="mh">0xfd</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">						<span class="n">_p</span><span class="o">++</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">						<span class="n">_len</span><span class="o">--</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">					<span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                    <span class="cm">/* The block is being returned - it is allocated and owned
</span></span></span><span class="line"><span class="cl"><span class="cm">                     * by the application and has no &#34;next&#34; block. */</span>
</span></span><span class="line"><span class="cl">                    <span class="nf">heapALLOCATE_BLOCK</span><span class="p">(</span> <span class="n">pxBlock</span> <span class="p">);</span>
</span></span><span class="line"><span class="cl">                    <span class="n">pxBlock</span><span class="o">-&gt;</span><span class="n">pxNextFreeBlock</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">                    <span class="n">xNumberOfSuccessfulAllocations</span><span class="o">++</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">                <span class="p">}</span>
</span></span><span class="line"><span class="cl">                <span class="k">else</span>
</span></span><span class="line"><span class="cl">                <span class="p">{</span>
</span></span><span class="line"><span class="cl">                    <span class="nf">mtCOVERAGE_TEST_MARKER</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">                <span class="p">}</span>
</span></span><span class="line"><span class="cl">            <span class="p">}</span>
</span></span><span class="line"><span class="cl">            <span class="k">else</span>
</span></span><span class="line"><span class="cl">            <span class="p">{</span>
</span></span><span class="line"><span class="cl">                <span class="nf">mtCOVERAGE_TEST_MARKER</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">            <span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="k">else</span>
</span></span><span class="line"><span class="cl">        <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="nf">mtCOVERAGE_TEST_MARKER</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="nf">traceMALLOC</span><span class="p">(</span> <span class="n">pvReturn</span><span class="p">,</span> <span class="n">xWantedSize</span> <span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="nf">xTaskResumeAll</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="cp">#if ( configUSE_MALLOC_FAILED_HOOK == 1 )
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span><span class="p">(</span> <span class="n">pvReturn</span> <span class="o">==</span> <span class="nb">NULL</span> <span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="nf">vApplicationMallocFailedHook</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="k">else</span>
</span></span><span class="line"><span class="cl">        <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="nf">mtCOVERAGE_TEST_MARKER</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="cp">#endif </span><span class="cm">/* if ( configUSE_MALLOC_FAILED_HOOK == 1 ) */</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl">    <span class="nf">configASSERT</span><span class="p">(</span> <span class="p">(</span> <span class="p">(</span> <span class="p">(</span> <span class="kt">size_t</span> <span class="p">)</span> <span class="n">pvReturn</span> <span class="p">)</span> <span class="o">&amp;</span> <span class="p">(</span> <span class="kt">size_t</span> <span class="p">)</span> <span class="n">portBYTE_ALIGNMENT_MASK</span> <span class="p">)</span> <span class="o">==</span> <span class="mi">0</span> <span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">pvReturn</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>在释放内存的时候检查内存块的填充数据是否有被篡改，如果有被篡改则说明出现了内存越界问题，可以打印当前内存块的 caller 信息和 dump 整个 block 数据，然后立再触发 ASSERT。
除了在内存释放的时候检查heap是否有越界，也可以在任务上下文切换的时候检查，不过这样会增加任务调度的开销，影响任务切换的效率。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span><span class="lnt">38
</span><span class="lnt">39
</span><span class="lnt">40
</span><span class="lnt">41
</span><span class="lnt">42
</span><span class="lnt">43
</span><span class="lnt">44
</span><span class="lnt">45
</span><span class="lnt">46
</span><span class="lnt">47
</span><span class="lnt">48
</span><span class="lnt">49
</span><span class="lnt">50
</span><span class="lnt">51
</span><span class="lnt">52
</span><span class="lnt">53
</span><span class="lnt">54
</span><span class="lnt">55
</span><span class="lnt">56
</span><span class="lnt">57
</span><span class="lnt">58
</span><span class="lnt">59
</span><span class="lnt">60
</span><span class="lnt">61
</span><span class="lnt">62
</span><span class="lnt">63
</span><span class="lnt">64
</span><span class="lnt">65
</span><span class="lnt">66
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">vPortFree</span><span class="p">(</span> <span class="kt">void</span> <span class="o">*</span> <span class="n">pv</span> <span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kt">uint8_t</span> <span class="o">*</span> <span class="n">puc</span> <span class="o">=</span> <span class="p">(</span> <span class="kt">uint8_t</span> <span class="o">*</span> <span class="p">)</span> <span class="n">pv</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="n">BlockLink_t</span> <span class="o">*</span> <span class="n">pxLink</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">if</span><span class="p">(</span> <span class="n">pv</span> <span class="o">!=</span> <span class="nb">NULL</span> <span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="cm">/* The memory being freed will have an BlockLink_t structure immediately
</span></span></span><span class="line"><span class="cl"><span class="cm">         * before it. */</span>
</span></span><span class="line"><span class="cl">        <span class="n">puc</span> <span class="o">-=</span> <span class="n">xHeapStructSize</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="cm">/* This casting is to keep the compiler from issuing warnings. */</span>
</span></span><span class="line"><span class="cl">        <span class="n">pxLink</span> <span class="o">=</span> <span class="p">(</span> <span class="kt">void</span> <span class="o">*</span> <span class="p">)</span> <span class="n">puc</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="nf">configASSERT</span><span class="p">(</span> <span class="nf">heapBLOCK_IS_ALLOCATED</span><span class="p">(</span> <span class="n">pxLink</span> <span class="p">)</span> <span class="o">!=</span> <span class="mi">0</span> <span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="nf">configASSERT</span><span class="p">(</span> <span class="n">pxLink</span><span class="o">-&gt;</span><span class="n">pxNextFreeBlock</span> <span class="o">==</span> <span class="nb">NULL</span> <span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="k">if</span><span class="p">(</span> <span class="nf">heapBLOCK_IS_ALLOCATED</span><span class="p">(</span> <span class="n">pxLink</span> <span class="p">)</span> <span class="o">!=</span> <span class="mi">0</span> <span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="k">if</span><span class="p">(</span> <span class="n">pxLink</span><span class="o">-&gt;</span><span class="n">pxNextFreeBlock</span> <span class="o">==</span> <span class="nb">NULL</span> <span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="p">{</span>
</span></span><span class="line"><span class="cl">                <span class="cm">/* The block is being returned to the heap - it is no longer
</span></span></span><span class="line"><span class="cl"><span class="cm">                 * allocated. */</span>
</span></span><span class="line"><span class="cl">                <span class="nf">heapFREE_BLOCK</span><span class="p">(</span> <span class="n">pxLink</span> <span class="p">);</span>
</span></span><span class="line"><span class="cl">                <span class="cp">#if ( configHEAP_CLEAR_MEMORY_ON_FREE == 1 )
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>                <span class="p">{</span>
</span></span><span class="line"><span class="cl">                    <span class="p">(</span> <span class="kt">void</span> <span class="p">)</span> <span class="nf">memset</span><span class="p">(</span> <span class="n">puc</span> <span class="o">+</span> <span class="n">xHeapStructSize</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">pxLink</span><span class="o">-&gt;</span><span class="n">xBlockSize</span> <span class="o">-</span> <span class="n">xHeapStructSize</span> <span class="p">);</span>
</span></span><span class="line"><span class="cl">                <span class="p">}</span>
</span></span><span class="line"><span class="cl">                <span class="cp">#endif
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl">                <span class="nf">vTaskSuspendAll</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">                <span class="kt">int</span> <span class="n">_len</span> <span class="o">=</span> <span class="n">pxLink</span><span class="o">-&gt;</span><span class="n">xBlockSize</span> <span class="o">-</span> <span class="n">pxLink</span><span class="o">-&gt;</span><span class="n">xWantedSize</span> <span class="o">-</span> <span class="n">xHeapStructSize</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">				<span class="kt">uint8_t</span> <span class="o">*</span><span class="n">_p</span> <span class="o">=</span> <span class="p">(</span><span class="kt">uint8_t</span> <span class="o">*</span><span class="p">)</span><span class="n">pxLink</span> <span class="o">+</span> <span class="n">pxLink</span><span class="o">-&gt;</span><span class="n">xWantedSize</span> <span class="o">+</span> <span class="n">xHeapStructSize</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">				<span class="k">while</span> <span class="p">(</span><span class="n">_len</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">				<span class="p">{</span>
</span></span><span class="line"><span class="cl">					<span class="k">if</span><span class="p">(</span><span class="o">*</span><span class="n">_p</span> <span class="o">!=</span> <span class="mh">0xfd</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">					<span class="p">{</span>
</span></span><span class="line"><span class="cl">						<span class="nf">printf</span><span class="p">(</span><span class="s">&#34;mem crash,block:0x%p,caller: 0x%p, 0x%02x</span><span class="se">\r\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">pxLink</span><span class="p">,</span> <span class="n">pxLink</span><span class="o">-&gt;</span><span class="n">caller</span><span class="p">,</span> <span class="o">*</span><span class="n">_p</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">					<span class="p">}</span>
</span></span><span class="line"><span class="cl">					<span class="nf">configASSERT</span><span class="p">(</span> <span class="p">(</span><span class="o">*</span><span class="n">_p</span> <span class="o">==</span> <span class="mh">0xfd</span> <span class="p">)</span> <span class="p">);</span>
</span></span><span class="line"><span class="cl">					<span class="n">_p</span><span class="o">++</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">					<span class="n">_len</span><span class="o">--</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">				<span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                <span class="p">{</span>
</span></span><span class="line"><span class="cl">                    <span class="cm">/* Add this block to the list of free blocks. */</span>
</span></span><span class="line"><span class="cl">                    <span class="n">xFreeBytesRemaining</span> <span class="o">+=</span> <span class="n">pxLink</span><span class="o">-&gt;</span><span class="n">xBlockSize</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">                    <span class="nf">traceFREE</span><span class="p">(</span> <span class="n">pv</span><span class="p">,</span> <span class="n">pxLink</span><span class="o">-&gt;</span><span class="n">xBlockSize</span> <span class="p">);</span>
</span></span><span class="line"><span class="cl">                    <span class="n">pxLink</span><span class="o">-&gt;</span><span class="n">xWantedSize</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">                    <span class="nf">prvInsertBlockIntoFreeList</span><span class="p">(</span> <span class="p">(</span> <span class="p">(</span> <span class="n">BlockLink_t</span> <span class="o">*</span> <span class="p">)</span> <span class="n">pxLink</span> <span class="p">)</span> <span class="p">);</span>
</span></span><span class="line"><span class="cl">                    <span class="n">xNumberOfSuccessfulFrees</span><span class="o">++</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">                <span class="p">}</span>
</span></span><span class="line"><span class="cl">                <span class="cm">/*( void ) */</span><span class="nf">xTaskResumeAll</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">            <span class="p">}</span>
</span></span><span class="line"><span class="cl">            <span class="k">else</span>
</span></span><span class="line"><span class="cl">            <span class="p">{</span>
</span></span><span class="line"><span class="cl">                <span class="nf">mtCOVERAGE_TEST_MARKER</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">            <span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="k">else</span>
</span></span><span class="line"><span class="cl">        <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="nf">mtCOVERAGE_TEST_MARKER</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>增加 heap info 信息会增加内存分配的开销，导致实际可以使用的 heap 内存变小，在内存较小的机器，应在正式软件上关闭 heap info 信息，以节省内存。</p>
<h2 id="heap-info-调试案例">heap info 调试案例</h2>
<h3 id="内存泄漏问题案例">内存泄漏问题案例</h3>
<h4 id="案例1">案例1</h4>
<p>打开 mqtt 之前的 heap info：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">  1
</span><span class="lnt">  2
</span><span class="lnt">  3
</span><span class="lnt">  4
</span><span class="lnt">  5
</span><span class="lnt">  6
</span><span class="lnt">  7
</span><span class="lnt">  8
</span><span class="lnt">  9
</span><span class="lnt"> 10
</span><span class="lnt"> 11
</span><span class="lnt"> 12
</span><span class="lnt"> 13
</span><span class="lnt"> 14
</span><span class="lnt"> 15
</span><span class="lnt"> 16
</span><span class="lnt"> 17
</span><span class="lnt"> 18
</span><span class="lnt"> 19
</span><span class="lnt"> 20
</span><span class="lnt"> 21
</span><span class="lnt"> 22
</span><span class="lnt"> 23
</span><span class="lnt"> 24
</span><span class="lnt"> 25
</span><span class="lnt"> 26
</span><span class="lnt"> 27
</span><span class="lnt"> 28
</span><span class="lnt"> 29
</span><span class="lnt"> 30
</span><span class="lnt"> 31
</span><span class="lnt"> 32
</span><span class="lnt"> 33
</span><span class="lnt"> 34
</span><span class="lnt"> 35
</span><span class="lnt"> 36
</span><span class="lnt"> 37
</span><span class="lnt"> 38
</span><span class="lnt"> 39
</span><span class="lnt"> 40
</span><span class="lnt"> 41
</span><span class="lnt"> 42
</span><span class="lnt"> 43
</span><span class="lnt"> 44
</span><span class="lnt"> 45
</span><span class="lnt"> 46
</span><span class="lnt"> 47
</span><span class="lnt"> 48
</span><span class="lnt"> 49
</span><span class="lnt"> 50
</span><span class="lnt"> 51
</span><span class="lnt"> 52
</span><span class="lnt"> 53
</span><span class="lnt"> 54
</span><span class="lnt"> 55
</span><span class="lnt"> 56
</span><span class="lnt"> 57
</span><span class="lnt"> 58
</span><span class="lnt"> 59
</span><span class="lnt"> 60
</span><span class="lnt"> 61
</span><span class="lnt"> 62
</span><span class="lnt"> 63
</span><span class="lnt"> 64
</span><span class="lnt"> 65
</span><span class="lnt"> 66
</span><span class="lnt"> 67
</span><span class="lnt"> 68
</span><span class="lnt"> 69
</span><span class="lnt"> 70
</span><span class="lnt"> 71
</span><span class="lnt"> 72
</span><span class="lnt"> 73
</span><span class="lnt"> 74
</span><span class="lnt"> 75
</span><span class="lnt"> 76
</span><span class="lnt"> 77
</span><span class="lnt"> 78
</span><span class="lnt"> 79
</span><span class="lnt"> 80
</span><span class="lnt"> 81
</span><span class="lnt"> 82
</span><span class="lnt"> 83
</span><span class="lnt"> 84
</span><span class="lnt"> 85
</span><span class="lnt"> 86
</span><span class="lnt"> 87
</span><span class="lnt"> 88
</span><span class="lnt"> 89
</span><span class="lnt"> 90
</span><span class="lnt"> 91
</span><span class="lnt"> 92
</span><span class="lnt"> 93
</span><span class="lnt"> 94
</span><span class="lnt"> 95
</span><span class="lnt"> 96
</span><span class="lnt"> 97
</span><span class="lnt"> 98
</span><span class="lnt"> 99
</span><span class="lnt">100
</span><span class="lnt">101
</span><span class="lnt">102
</span><span class="lnt">103
</span><span class="lnt">104
</span><span class="lnt">105
</span><span class="lnt">106
</span><span class="lnt">107
</span><span class="lnt">108
</span><span class="lnt">109
</span><span class="lnt">110
</span><span class="lnt">111
</span><span class="lnt">112
</span><span class="lnt">113
</span><span class="lnt">114
</span><span class="lnt">115
</span><span class="lnt">116
</span><span class="lnt">117
</span><span class="lnt">118
</span><span class="lnt">119
</span><span class="lnt">120
</span><span class="lnt">121
</span><span class="lnt">122
</span><span class="lnt">123
</span><span class="lnt">124
</span><span class="lnt">125
</span><span class="lnt">126
</span><span class="lnt">127
</span><span class="lnt">128
</span><span class="lnt">129
</span><span class="lnt">130
</span><span class="lnt">131
</span><span class="lnt">132
</span><span class="lnt">133
</span><span class="lnt">134
</span><span class="lnt">135
</span><span class="lnt">136
</span><span class="lnt">137
</span><span class="lnt">138
</span><span class="lnt">139
</span><span class="lnt">140
</span><span class="lnt">141
</span><span class="lnt">142
</span><span class="lnt">143
</span><span class="lnt">144
</span><span class="lnt">145
</span><span class="lnt">146
</span><span class="lnt">147
</span><span class="lnt">148
</span><span class="lnt">149
</span><span class="lnt">150
</span><span class="lnt">151
</span><span class="lnt">152
</span><span class="lnt">153
</span><span class="lnt">154
</span><span class="lnt">155
</span><span class="lnt">156
</span><span class="lnt">157
</span><span class="lnt">158
</span><span class="lnt">159
</span><span class="lnt">160
</span><span class="lnt">161
</span><span class="lnt">162
</span><span class="lnt">163
</span><span class="lnt">164
</span><span class="lnt">165
</span><span class="lnt">166
</span><span class="lnt">167
</span><span class="lnt">168
</span><span class="lnt">169
</span><span class="lnt">170
</span><span class="lnt">171
</span><span class="lnt">172
</span><span class="lnt">173
</span><span class="lnt">174
</span><span class="lnt">175
</span><span class="lnt">176
</span><span class="lnt">177
</span><span class="lnt">178
</span><span class="lnt">179
</span><span class="lnt">180
</span><span class="lnt">181
</span><span class="lnt">182
</span><span class="lnt">183
</span><span class="lnt">184
</span><span class="lnt">185
</span><span class="lnt">186
</span><span class="lnt">187
</span><span class="lnt">188
</span><span class="lnt">189
</span><span class="lnt">190
</span><span class="lnt">191
</span><span class="lnt">192
</span><span class="lnt">193
</span><span class="lnt">194
</span><span class="lnt">195
</span><span class="lnt">196
</span><span class="lnt">197
</span><span class="lnt">198
</span><span class="lnt">199
</span><span class="lnt">200
</span><span class="lnt">201
</span><span class="lnt">202
</span><span class="lnt">203
</span><span class="lnt">204
</span><span class="lnt">205
</span><span class="lnt">206
</span><span class="lnt">207
</span><span class="lnt">208
</span><span class="lnt">209
</span><span class="lnt">210
</span><span class="lnt">211
</span><span class="lnt">212
</span><span class="lnt">213
</span><span class="lnt">214
</span><span class="lnt">215
</span><span class="lnt">216
</span><span class="lnt">217
</span><span class="lnt">218
</span><span class="lnt">219
</span><span class="lnt">220
</span><span class="lnt">221
</span><span class="lnt">222
</span><span class="lnt">223
</span><span class="lnt">224
</span><span class="lnt">225
</span><span class="lnt">226
</span><span class="lnt">227
</span><span class="lnt">228
</span><span class="lnt">229
</span><span class="lnt">230
</span><span class="lnt">231
</span><span class="lnt">232
</span><span class="lnt">233
</span><span class="lnt">234
</span><span class="lnt">235
</span><span class="lnt">236
</span><span class="lnt">237
</span><span class="lnt">238
</span><span class="lnt">239
</span><span class="lnt">240
</span><span class="lnt">241
</span><span class="lnt">242
</span><span class="lnt">243
</span><span class="lnt">244
</span><span class="lnt">245
</span><span class="lnt">246
</span><span class="lnt">247
</span><span class="lnt">248
</span><span class="lnt">249
</span><span class="lnt">250
</span><span class="lnt">251
</span><span class="lnt">252
</span><span class="lnt">253
</span><span class="lnt">254
</span><span class="lnt">255
</span><span class="lnt">256
</span><span class="lnt">257
</span><span class="lnt">258
</span><span class="lnt">259
</span><span class="lnt">260
</span><span class="lnt">261
</span><span class="lnt">262
</span><span class="lnt">263
</span><span class="lnt">264
</span><span class="lnt">265
</span><span class="lnt">266
</span><span class="lnt">267
</span><span class="lnt">268
</span><span class="lnt">269
</span><span class="lnt">270
</span><span class="lnt">271
</span><span class="lnt">272
</span><span class="lnt">273
</span><span class="lnt">274
</span><span class="lnt">275
</span><span class="lnt">276
</span><span class="lnt">277
</span><span class="lnt">278
</span><span class="lnt">279
</span><span class="lnt">280
</span><span class="lnt">281
</span><span class="lnt">282
</span><span class="lnt">283
</span><span class="lnt">284
</span><span class="lnt">285
</span><span class="lnt">286
</span><span class="lnt">287
</span><span class="lnt">288
</span><span class="lnt">289
</span><span class="lnt">290
</span><span class="lnt">291
</span><span class="lnt">292
</span><span class="lnt">293
</span><span class="lnt">294
</span><span class="lnt">295
</span><span class="lnt">296
</span><span class="lnt">297
</span><span class="lnt">298
</span><span class="lnt">299
</span><span class="lnt">300
</span><span class="lnt">301
</span><span class="lnt">302
</span><span class="lnt">303
</span><span class="lnt">304
</span><span class="lnt">305
</span><span class="lnt">306
</span><span class="lnt">307
</span><span class="lnt">308
</span><span class="lnt">309
</span><span class="lnt">310
</span><span class="lnt">311
</span><span class="lnt">312
</span><span class="lnt">313
</span><span class="lnt">314
</span><span class="lnt">315
</span><span class="lnt">316
</span><span class="lnt">317
</span><span class="lnt">318
</span><span class="lnt">319
</span><span class="lnt">320
</span><span class="lnt">321
</span><span class="lnt">322
</span><span class="lnt">323
</span><span class="lnt">324
</span><span class="lnt">325
</span><span class="lnt">326
</span><span class="lnt">327
</span><span class="lnt">328
</span><span class="lnt">329
</span><span class="lnt">330
</span><span class="lnt">331
</span><span class="lnt">332
</span><span class="lnt">333
</span><span class="lnt">334
</span><span class="lnt">335
</span><span class="lnt">336
</span><span class="lnt">337
</span><span class="lnt">338
</span><span class="lnt">339
</span><span class="lnt">340
</span><span class="lnt">341
</span><span class="lnt">342
</span><span class="lnt">343
</span><span class="lnt">344
</span><span class="lnt">345
</span><span class="lnt">346
</span><span class="lnt">347
</span><span class="lnt">348
</span><span class="lnt">349
</span><span class="lnt">350
</span><span class="lnt">351
</span><span class="lnt">352
</span><span class="lnt">353
</span><span class="lnt">354
</span><span class="lnt">355
</span><span class="lnt">356
</span><span class="lnt">357
</span><span class="lnt">358
</span><span class="lnt">359
</span><span class="lnt">360
</span><span class="lnt">361
</span><span class="lnt">362
</span><span class="lnt">363
</span><span class="lnt">364
</span><span class="lnt">365
</span><span class="lnt">366
</span><span class="lnt">367
</span><span class="lnt">368
</span><span class="lnt">369
</span><span class="lnt">370
</span><span class="lnt">371
</span><span class="lnt">372
</span><span class="lnt">373
</span><span class="lnt">374
</span><span class="lnt">375
</span><span class="lnt">376
</span><span class="lnt">377
</span><span class="lnt">378
</span><span class="lnt">379
</span><span class="lnt">380
</span><span class="lnt">381
</span><span class="lnt">382
</span><span class="lnt">383
</span><span class="lnt">384
</span><span class="lnt">385
</span><span class="lnt">386
</span><span class="lnt">387
</span><span class="lnt">388
</span><span class="lnt">389
</span><span class="lnt">390
</span><span class="lnt">391
</span><span class="lnt">392
</span><span class="lnt">393
</span><span class="lnt">394
</span><span class="lnt">395
</span><span class="lnt">396
</span><span class="lnt">397
</span><span class="lnt">398
</span><span class="lnt">399
</span><span class="lnt">400
</span><span class="lnt">401
</span><span class="lnt">402
</span><span class="lnt">403
</span><span class="lnt">404
</span><span class="lnt">405
</span><span class="lnt">406
</span><span class="lnt">407
</span><span class="lnt">408
</span><span class="lnt">409
</span><span class="lnt">410
</span><span class="lnt">411
</span><span class="lnt">412
</span><span class="lnt">413
</span><span class="lnt">414
</span><span class="lnt">415
</span><span class="lnt">416
</span><span class="lnt">417
</span><span class="lnt">418
</span><span class="lnt">419
</span><span class="lnt">420
</span><span class="lnt">421
</span><span class="lnt">422
</span><span class="lnt">423
</span><span class="lnt">424
</span><span class="lnt">425
</span><span class="lnt">426
</span><span class="lnt">427
</span><span class="lnt">428
</span><span class="lnt">429
</span><span class="lnt">430
</span><span class="lnt">431
</span><span class="lnt">432
</span><span class="lnt">433
</span><span class="lnt">434
</span><span class="lnt">435
</span><span class="lnt">436
</span><span class="lnt">437
</span><span class="lnt">438
</span><span class="lnt">439
</span><span class="lnt">440
</span><span class="lnt">441
</span><span class="lnt">442
</span><span class="lnt">443
</span><span class="lnt">444
</span><span class="lnt">445
</span><span class="lnt">446
</span><span class="lnt">447
</span><span class="lnt">448
</span><span class="lnt">449
</span><span class="lnt">450
</span><span class="lnt">451
</span><span class="lnt">452
</span><span class="lnt">453
</span><span class="lnt">454
</span><span class="lnt">455
</span><span class="lnt">456
</span><span class="lnt">457
</span><span class="lnt">458
</span><span class="lnt">459
</span><span class="lnt">460
</span><span class="lnt">461
</span><span class="lnt">462
</span><span class="lnt">463
</span><span class="lnt">464
</span><span class="lnt">465
</span><span class="lnt">466
</span><span class="lnt">467
</span><span class="lnt">468
</span><span class="lnt">469
</span><span class="lnt">470
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">address: 0x40aae8
</span></span><span class="line"><span class="cl">size: <span class="m">152856</span>
</span></span><span class="line"><span class="cl">avail: <span class="m">45288</span>
</span></span><span class="line"><span class="cl">pool_start: 0x40aae8
</span></span><span class="line"><span class="cl">pool_end: 0x42fff0
</span></span><span class="line"><span class="cl">state,block_addr,user_addr,caller,blocksize,wanted_size
</span></span><span class="line"><span class="cl">U,0x40aae8,0x40abe8,0x1b695,4112,4096
</span></span><span class="line"><span class="cl">U,0x40baf8,0x40bbf8,0x1b6b5,40,20
</span></span><span class="line"><span class="cl">U,0x40bb20,0x40bc20,0x1b695,528,512
</span></span><span class="line"><span class="cl">U,0x40bd30,0x40be30,0x1b6b5,40,20
</span></span><span class="line"><span class="cl">U,0x40bd58,0x40be58,0x1b695,4112,4096
</span></span><span class="line"><span class="cl">U,0x40cd68,0x40ce68,0x1b6b5,40,20
</span></span><span class="line"><span class="cl">U,0x40cd90,0x40ce90,0x1b695,528,512
</span></span><span class="line"><span class="cl">U,0x40cfa0,0x40d0a0,0x1b6b5,40,20
</span></span><span class="line"><span class="cl">U,0x40cfc8,0x40d0c8,0x7eab8,96,80
</span></span><span class="line"><span class="cl">U,0x40d028,0x40d128,0x7e8ac,96,80
</span></span><span class="line"><span class="cl">U,0x40d088,0x40d188,0x28319,112,92
</span></span><span class="line"><span class="cl">U,0x40d0f8,0x40d1f8,0x28441,96,80
</span></span><span class="line"><span class="cl">U,0x40d158,0x40d258,0x7eab8,96,80
</span></span><span class="line"><span class="cl">U,0x40d1b8,0x40d2b8,0x7eab8,96,80
</span></span><span class="line"><span class="cl">U,0x40d218,0x40d318,0x28319,112,92
</span></span><span class="line"><span class="cl">U,0x40d288,0x40d388,0x28441,96,80
</span></span><span class="line"><span class="cl">U,0x40d2e8,0x40d3e8,0x7eab8,96,80
</span></span><span class="line"><span class="cl">U,0x40d348,0x40d448,0x7eab8,96,80
</span></span><span class="line"><span class="cl">U,0x40d3a8,0x40d4a8,0x28319,112,92
</span></span><span class="line"><span class="cl">U,0x40d418,0x40d518,0x28441,96,80
</span></span><span class="line"><span class="cl">U,0x40d478,0x40d578,0x7eab8,96,80
</span></span><span class="line"><span class="cl">U,0x40d4d8,0x40d5d8,0x7eab8,96,80
</span></span><span class="line"><span class="cl">U,0x40d538,0x40d638,0x803f4,112,92
</span></span><span class="line"><span class="cl">U,0x40d5a8,0x40d6a8,0xa4be5,56,36
</span></span><span class="line"><span class="cl">U,0x40d5e0,0x40d6e0,0x9fb53,48,28
</span></span><span class="line"><span class="cl">U,0x40d610,0x40d710,0xb22f3,760,744
</span></span><span class="line"><span class="cl">U,0x40d908,0x40da08,0x7f51c,1040,1024
</span></span><span class="line"><span class="cl">U,0x40dd18,0x40de18,0x7f51c,112,92
</span></span><span class="line"><span class="cl">U,0x40dd88,0x40de88,0x7fe1c,288,272
</span></span><span class="line"><span class="cl">U,0x40dea8,0x40dfa8,0x7fefc,3088,3072
</span></span><span class="line"><span class="cl">U,0x40eab8,0x40ebb8,0x7fefc,112,92
</span></span><span class="line"><span class="cl">U,0x40eb28,0x40ec28,0x15769,32,16
</span></span><span class="line"><span class="cl">U,0x40eb48,0x40ec48,0x15789,128,108
</span></span><span class="line"><span class="cl">U,0x40ebc8,0x40ecc8,0x157a9,136,114
</span></span><span class="line"><span class="cl">U,0x40ec50,0x40ed50,0x80808,120,100
</span></span><span class="line"><span class="cl">U,0x40ecc8,0x40edc8,0x803f4,1040,1024
</span></span><span class="line"><span class="cl">U,0x40f0d8,0x40f1d8,0x803f4,112,92
</span></span><span class="line"><span class="cl">U,0x40f148,0x40f248,0x7e8ac,96,80
</span></span><span class="line"><span class="cl">U,0x40f1a8,0x40f2a8,0x803f4,4112,4096
</span></span><span class="line"><span class="cl">U,0x4101b8,0x4102b8,0x803f4,112,92
</span></span><span class="line"><span class="cl">U,0x410228,0x410328,0x28441,96,80
</span></span><span class="line"><span class="cl">U,0x410288,0x410388,0x1405f,64,40
</span></span><span class="line"><span class="cl">U,0x4102c8,0x4103c8,0xa01ef,40,22
</span></span><span class="line"><span class="cl">U,0x4102f0,0x4103f0,0x80c7c,72,44
</span></span><span class="line"><span class="cl">U,0x410338,0x410438,0x83c1b,24,8
</span></span><span class="line"><span class="cl">U,0x410350,0x410450,0x83c1b,40,4
</span></span><span class="line"><span class="cl">U,0x410378,0x410478,0xa1b0d,64,32
</span></span><span class="line"><span class="cl">U,0x4103b8,0x4104b8,0x34f21,1040,1024
</span></span><span class="line"><span class="cl">U,0x4107c8,0x4108c8,0x9f79d,40,9
</span></span><span class="line"><span class="cl">U,0x4107f0,0x4108f0,0x9a079,192,172
</span></span><span class="line"><span class="cl">U,0x4108b0,0x4109b0,0x9bf95,40,22
</span></span><span class="line"><span class="cl">U,0x4108d8,0x4109d8,0x99f8f,224,208
</span></span><span class="line"><span class="cl">U,0x4109b8,0x410ab8,0x9c46f,64,48
</span></span><span class="line"><span class="cl">U,0x4109f8,0x410af8,0x9dfef,40,22
</span></span><span class="line"><span class="cl">U,0x410a20,0x410b20,0x6e705,32,9
</span></span><span class="line"><span class="cl">U,0x410a40,0x410b40,0xa01ef,56,22
</span></span><span class="line"><span class="cl">U,0x410a78,0x410b78,0x7eab8,96,80
</span></span><span class="line"><span class="cl">U,0x410ad8,0x410bd8,0x7eab8,96,80
</span></span><span class="line"><span class="cl">U,0x410b38,0x410c38,0x28319,224,208
</span></span><span class="line"><span class="cl">U,0x410c18,0x410d18,0x7eab8,96,80
</span></span><span class="line"><span class="cl">U,0x410c78,0x410d78,0x285a9,2064,2048
</span></span><span class="line"><span class="cl">U,0x411488,0x411588,0x285a9,112,92
</span></span><span class="line"><span class="cl">U,0x4114f8,0x4115f8,0x80808,1120,1104
</span></span><span class="line"><span class="cl">U,0x411958,0x411a58,0x803f4,4112,4096
</span></span><span class="line"><span class="cl">U,0x412968,0x412a68,0x803f4,112,92
</span></span><span class="line"><span class="cl">U,0x4129d8,0x412ad8,0x9d659,72,52
</span></span><span class="line"><span class="cl">U,0x412a20,0x412b20,0x7e8ac,96,80
</span></span><span class="line"><span class="cl">U,0x412a80,0x412b80,0x80808,1632,1616
</span></span><span class="line"><span class="cl">U,0x4130e0,0x4131e0,0x803f4,2064,2048
</span></span><span class="line"><span class="cl">U,0x4138f0,0x4139f0,0x803f4,112,92
</span></span><span class="line"><span class="cl">U,0x413960,0x413a60,0x80808,256,240
</span></span><span class="line"><span class="cl">U,0x413a60,0x413b60,0x803f4,1168,1152
</span></span><span class="line"><span class="cl">U,0x413ef0,0x413ff0,0xa46c5,952,936
</span></span><span class="line"><span class="cl">U,0x4142a8,0x4143a8,0xb1ff7,56,4
</span></span><span class="line"><span class="cl">U,0x4142e0,0x4143e0,0x80808,176,160
</span></span><span class="line"><span class="cl">U,0x414390,0x414490,0x803f4,4112,4096
</span></span><span class="line"><span class="cl">U,0x4153a0,0x4154a0,0x803f4,112,92
</span></span><span class="line"><span class="cl">U,0x415410,0x415510,0x7e8ac,96,80
</span></span><span class="line"><span class="cl">U,0x415470,0x415570,0x803f4,112,92
</span></span><span class="line"><span class="cl">U,0x4154e0,0x4155e0,0x80808,1296,1280
</span></span><span class="line"><span class="cl">U,0x4159f0,0x415af0,0x803f4,112,92
</span></span><span class="line"><span class="cl">U,0x415a60,0x415b60,0x7eab8,96,80
</span></span><span class="line"><span class="cl">U,0x415ac0,0x415bc0,0x7e8ac,96,80
</span></span><span class="line"><span class="cl">U,0x415b20,0x415c20,0x803f4,136,92
</span></span><span class="line"><span class="cl">U,0x415ba8,0x415ca8,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x415be0,0x415ce0,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x415c18,0x415d18,0x13ed5,24,5
</span></span><span class="line"><span class="cl">U,0x415c30,0x415d30,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x415c68,0x415d68,0x13ed5,24,8
</span></span><span class="line"><span class="cl">U,0x415c80,0x415d80,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x415cb8,0x415db8,0x13ed5,24,7
</span></span><span class="line"><span class="cl">U,0x415cd0,0x415dd0,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x415d08,0x415e08,0x13ed5,24,2
</span></span><span class="line"><span class="cl">U,0x415d20,0x415e20,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x415d58,0x415e58,0x13ed5,24,7
</span></span><span class="line"><span class="cl">U,0x415d70,0x415e70,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x415da8,0x415ea8,0x13ed5,32,12
</span></span><span class="line"><span class="cl">U,0x415dc8,0x415ec8,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x415e00,0x415f00,0x13ed5,24,8
</span></span><span class="line"><span class="cl">U,0x415e18,0x415f18,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x415e50,0x415f50,0x13ed5,32,11
</span></span><span class="line"><span class="cl">U,0x415e70,0x415f70,0x13ed5,32,12
</span></span><span class="line"><span class="cl">U,0x415e90,0x415f90,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x415ec8,0x415fc8,0x13ed5,32,13
</span></span><span class="line"><span class="cl">U,0x415ee8,0x415fe8,0x13ed5,56,33
</span></span><span class="line"><span class="cl">U,0x415f20,0x416020,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x415f58,0x416058,0x13ed5,32,11
</span></span><span class="line"><span class="cl">U,0x415f78,0x416078,0x13ed5,24,8
</span></span><span class="line"><span class="cl">U,0x415f90,0x416090,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x415fc8,0x4160c8,0x13ed5,24,7
</span></span><span class="line"><span class="cl">U,0x415fe0,0x4160e0,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x416018,0x416118,0x13ed5,24,4
</span></span><span class="line"><span class="cl">U,0x416030,0x416130,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x416068,0x416168,0x13ed5,24,2
</span></span><span class="line"><span class="cl">U,0x416080,0x416180,0x13ed5,32,12
</span></span><span class="line"><span class="cl">U,0x4160a0,0x4161a0,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x4160d8,0x4161d8,0x13ed5,24,2
</span></span><span class="line"><span class="cl">U,0x4160f0,0x4161f0,0x13ed5,32,13
</span></span><span class="line"><span class="cl">U,0x416110,0x416210,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x416148,0x416248,0x13ed5,24,4
</span></span><span class="line"><span class="cl">U,0x416160,0x416260,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x416198,0x416298,0x13ed5,24,2
</span></span><span class="line"><span class="cl">U,0x4161b0,0x4162b0,0x13ed5,32,12
</span></span><span class="line"><span class="cl">U,0x4161d0,0x4162d0,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x416208,0x416308,0x13ed5,24,2
</span></span><span class="line"><span class="cl">U,0x416220,0x416320,0x13ed5,32,13
</span></span><span class="line"><span class="cl">U,0x416240,0x416340,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x416278,0x416378,0x13ed5,24,4
</span></span><span class="line"><span class="cl">U,0x416290,0x416390,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x4162c8,0x4163c8,0x13ed5,24,2
</span></span><span class="line"><span class="cl">U,0x4162e0,0x4163e0,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x416318,0x416418,0x13ed5,24,8
</span></span><span class="line"><span class="cl">U,0x416330,0x416430,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x416368,0x416468,0x13ed5,32,11
</span></span><span class="line"><span class="cl">U,0x416388,0x416488,0x13ed5,32,12
</span></span><span class="line"><span class="cl">U,0x4163a8,0x4164a8,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x4163e0,0x4164e0,0x13ed5,32,13
</span></span><span class="line"><span class="cl">U,0x416400,0x416500,0x13ed5,56,33
</span></span><span class="line"><span class="cl">U,0x416438,0x416538,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x416470,0x416570,0x13ed5,32,11
</span></span><span class="line"><span class="cl">U,0x416490,0x416590,0x13ed5,24,8
</span></span><span class="line"><span class="cl">U,0x4164a8,0x4165a8,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x4164e0,0x4165e0,0x13ed5,24,7
</span></span><span class="line"><span class="cl">U,0x4164f8,0x4165f8,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x416530,0x416630,0x13ed5,32,12
</span></span><span class="line"><span class="cl">U,0x416550,0x416650,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x416588,0x416688,0x13ed5,24,7
</span></span><span class="line"><span class="cl">U,0x4165a0,0x4166a0,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x4165d8,0x4166d8,0x13ed5,24,4
</span></span><span class="line"><span class="cl">U,0x4165f0,0x4166f0,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x416628,0x416728,0x13ed5,24,2
</span></span><span class="line"><span class="cl">U,0x416640,0x416740,0x13ed5,40,19
</span></span><span class="line"><span class="cl">U,0x416668,0x416768,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x4166a0,0x4167a0,0x13ed5,24,2
</span></span><span class="line"><span class="cl">U,0x4166b8,0x4167b8,0x13ed5,32,12
</span></span><span class="line"><span class="cl">U,0x4166d8,0x4167d8,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x416710,0x416810,0x13ed5,24,4
</span></span><span class="line"><span class="cl">U,0x416728,0x416828,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x416760,0x416860,0x13ed5,24,2
</span></span><span class="line"><span class="cl">U,0x416778,0x416878,0x13ed5,40,19
</span></span><span class="line"><span class="cl">U,0x4167a0,0x4168a0,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x4167d8,0x4168d8,0x13ed5,24,2
</span></span><span class="line"><span class="cl">U,0x4167f0,0x4168f0,0x13ed5,32,12
</span></span><span class="line"><span class="cl">U,0x416810,0x416910,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x416848,0x416948,0x13ed5,24,4
</span></span><span class="line"><span class="cl">U,0x416860,0x416960,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x416898,0x416998,0x13ed5,24,2
</span></span><span class="line"><span class="cl">U,0x4168b0,0x4169b0,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x4168e8,0x4169e8,0x13ed5,24,8
</span></span><span class="line"><span class="cl">U,0x416900,0x416a00,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x416938,0x416a38,0x13ed5,32,11
</span></span><span class="line"><span class="cl">U,0x416958,0x416a58,0x13ed5,32,12
</span></span><span class="line"><span class="cl">U,0x416978,0x416a78,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x4169b0,0x416ab0,0x13ed5,32,13
</span></span><span class="line"><span class="cl">U,0x4169d0,0x416ad0,0x13ed5,56,33
</span></span><span class="line"><span class="cl">U,0x416a08,0x416b08,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x416a40,0x416b40,0x13ed5,32,11
</span></span><span class="line"><span class="cl">U,0x416a60,0x416b60,0x13ed5,24,8
</span></span><span class="line"><span class="cl">U,0x416a78,0x416b78,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x416ab0,0x416bb0,0x13ed5,24,7
</span></span><span class="line"><span class="cl">U,0x416ac8,0x416bc8,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x416b00,0x416c00,0x13ed5,32,12
</span></span><span class="line"><span class="cl">U,0x416b20,0x416c20,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x416b58,0x416c58,0x13ed5,24,7
</span></span><span class="line"><span class="cl">U,0x416b70,0x416c70,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x416ba8,0x416ca8,0x13ed5,24,4
</span></span><span class="line"><span class="cl">U,0x416bc0,0x416cc0,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x416bf8,0x416cf8,0x13ed5,24,2
</span></span><span class="line"><span class="cl">U,0x416c10,0x416d10,0x13ed5,40,19
</span></span><span class="line"><span class="cl">U,0x416c38,0x416d38,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x416c70,0x416d70,0x13ed5,24,2
</span></span><span class="line"><span class="cl">U,0x416c88,0x416d88,0x13ed5,40,20
</span></span><span class="line"><span class="cl">U,0x416cb0,0x416db0,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x416ce8,0x416de8,0x13ed5,24,4
</span></span><span class="line"><span class="cl">U,0x416d00,0x416e00,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x416d38,0x416e38,0x13ed5,24,2
</span></span><span class="line"><span class="cl">U,0x416d50,0x416e50,0x13ed5,40,19
</span></span><span class="line"><span class="cl">U,0x416d78,0x416e78,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x416db0,0x416eb0,0x13ed5,24,2
</span></span><span class="line"><span class="cl">U,0x416dc8,0x416ec8,0x13ed5,40,20
</span></span><span class="line"><span class="cl">U,0x416df0,0x416ef0,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x416e28,0x416f28,0x13ed5,24,4
</span></span><span class="line"><span class="cl">U,0x416e40,0x416f40,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x416e78,0x416f78,0x13ed5,24,2
</span></span><span class="line"><span class="cl">U,0x416e90,0x416f90,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x416ec8,0x416fc8,0x13ed5,24,8
</span></span><span class="line"><span class="cl">U,0x416ee0,0x416fe0,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x416f18,0x417018,0x13ed5,32,11
</span></span><span class="line"><span class="cl">U,0x416f38,0x417038,0x13ed5,32,12
</span></span><span class="line"><span class="cl">U,0x416f58,0x417058,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x416f90,0x417090,0x13ed5,32,13
</span></span><span class="line"><span class="cl">U,0x416fb0,0x4170b0,0x13ed5,56,33
</span></span><span class="line"><span class="cl">U,0x416fe8,0x4170e8,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x417020,0x417120,0x13ed5,32,11
</span></span><span class="line"><span class="cl">U,0x417040,0x417140,0x13ed5,32,13
</span></span><span class="line"><span class="cl">U,0x417060,0x417160,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x417098,0x417198,0x13ed5,24,7
</span></span><span class="line"><span class="cl">U,0x4170b0,0x4171b0,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x4170e8,0x4171e8,0x13ed5,32,12
</span></span><span class="line"><span class="cl">U,0x417108,0x417208,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x417140,0x417240,0x13ed5,24,7
</span></span><span class="line"><span class="cl">U,0x417158,0x417258,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x417190,0x417290,0x13ed5,24,4
</span></span><span class="line"><span class="cl">U,0x4171a8,0x4172a8,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x4171e0,0x4172e0,0x13ed5,24,2
</span></span><span class="line"><span class="cl">U,0x4171f8,0x4172f8,0x13ed5,40,21
</span></span><span class="line"><span class="cl">U,0x417220,0x417320,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x417258,0x417358,0x13ed5,24,2
</span></span><span class="line"><span class="cl">U,0x417270,0x417370,0x13ed5,40,22
</span></span><span class="line"><span class="cl">U,0x417298,0x417398,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x4172d0,0x4173d0,0x13ed5,24,4
</span></span><span class="line"><span class="cl">U,0x4172e8,0x4173e8,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x417320,0x417420,0x13ed5,24,2
</span></span><span class="line"><span class="cl">U,0x417338,0x417438,0x13ed5,40,21
</span></span><span class="line"><span class="cl">U,0x417360,0x417460,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x417398,0x417498,0x13ed5,24,2
</span></span><span class="line"><span class="cl">U,0x4173b0,0x4174b0,0x13ed5,40,22
</span></span><span class="line"><span class="cl">U,0x4173d8,0x4174d8,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x417410,0x417510,0x13ed5,24,4
</span></span><span class="line"><span class="cl">U,0x417428,0x417528,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x417460,0x417560,0x13ed5,24,2
</span></span><span class="line"><span class="cl">U,0x417478,0x417578,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x4174b0,0x4175b0,0x13ed5,24,8
</span></span><span class="line"><span class="cl">U,0x4174c8,0x4175c8,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x417500,0x417600,0x13ed5,32,11
</span></span><span class="line"><span class="cl">U,0x417520,0x417620,0x13ed5,32,12
</span></span><span class="line"><span class="cl">U,0x417540,0x417640,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x417578,0x417678,0x13ed5,32,13
</span></span><span class="line"><span class="cl">U,0x417598,0x417698,0x13ed5,56,33
</span></span><span class="line"><span class="cl">U,0x4175d0,0x4176d0,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x417608,0x417708,0x13ed5,32,11
</span></span><span class="line"><span class="cl">U,0x417628,0x417728,0x13ed5,32,13
</span></span><span class="line"><span class="cl">U,0x417648,0x417748,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x417680,0x417780,0x13ed5,24,7
</span></span><span class="line"><span class="cl">U,0x417698,0x417798,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x4176d0,0x4177d0,0x13ed5,32,12
</span></span><span class="line"><span class="cl">U,0x4176f0,0x4177f0,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x417728,0x417828,0x13ed5,24,7
</span></span><span class="line"><span class="cl">U,0x417740,0x417840,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x417778,0x417878,0x13ed5,24,4
</span></span><span class="line"><span class="cl">U,0x417790,0x417890,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x4177c8,0x4178c8,0x13ed5,24,2
</span></span><span class="line"><span class="cl">U,0x4177e0,0x4178e0,0x13ed5,40,21
</span></span><span class="line"><span class="cl">U,0x417808,0x417908,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x417840,0x417940,0x13ed5,24,2
</span></span><span class="line"><span class="cl">U,0x417858,0x417958,0x13ed5,40,22
</span></span><span class="line"><span class="cl">U,0x417880,0x417980,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x4178b8,0x4179b8,0x13ed5,24,4
</span></span><span class="line"><span class="cl">U,0x4178d0,0x4179d0,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x417908,0x417a08,0x13ed5,24,2
</span></span><span class="line"><span class="cl">U,0x417920,0x417a20,0x13ed5,40,21
</span></span><span class="line"><span class="cl">U,0x417948,0x417a48,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x417980,0x417a80,0x13ed5,24,2
</span></span><span class="line"><span class="cl">U,0x417998,0x417a98,0x13ed5,40,22
</span></span><span class="line"><span class="cl">U,0x4179c0,0x417ac0,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x4179f8,0x417af8,0x13ed5,24,4
</span></span><span class="line"><span class="cl">U,0x417a10,0x417b10,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x417a48,0x417b48,0x13ed5,24,8
</span></span><span class="line"><span class="cl">U,0x417a60,0x417b60,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x417a98,0x417b98,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x417ad0,0x417bd0,0x13ed5,24,8
</span></span><span class="line"><span class="cl">U,0x417ae8,0x417be8,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x417b20,0x417c20,0x13ed5,32,9
</span></span><span class="line"><span class="cl">U,0x417b40,0x417c40,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x417b78,0x417c78,0x13ed5,32,9
</span></span><span class="line"><span class="cl">U,0x417b98,0x417c98,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x417bd0,0x417cd0,0x13ed5,24,6
</span></span><span class="line"><span class="cl">U,0x417be8,0x417ce8,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x417c20,0x417d20,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x417c58,0x417d58,0x13ed5,24,8
</span></span><span class="line"><span class="cl">U,0x417c70,0x417d70,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x417ca8,0x417da8,0x13ed5,32,9
</span></span><span class="line"><span class="cl">U,0x417cc8,0x417dc8,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x417d00,0x417e00,0x13ed5,32,9
</span></span><span class="line"><span class="cl">U,0x417d20,0x417e20,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x417d58,0x417e58,0x13ed5,24,6
</span></span><span class="line"><span class="cl">U,0x417d70,0x417e70,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x417da8,0x417ea8,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x417de0,0x417ee0,0x13ed5,24,8
</span></span><span class="line"><span class="cl">U,0x417df8,0x417ef8,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x417e30,0x417f30,0x13ed5,32,9
</span></span><span class="line"><span class="cl">U,0x417e50,0x417f50,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x417e88,0x417f88,0x13ed5,32,9
</span></span><span class="line"><span class="cl">U,0x417ea8,0x417fa8,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x417ee0,0x417fe0,0x13ed5,24,6
</span></span><span class="line"><span class="cl">U,0x417ef8,0x417ff8,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x417f30,0x418030,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x417f68,0x418068,0x13ed5,24,8
</span></span><span class="line"><span class="cl">U,0x417f80,0x418080,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x417fb8,0x4180b8,0x13ed5,32,9
</span></span><span class="line"><span class="cl">U,0x417fd8,0x4180d8,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x418010,0x418110,0x13ed5,32,9
</span></span><span class="line"><span class="cl">U,0x418030,0x418130,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x418068,0x418168,0x13ed5,24,6
</span></span><span class="line"><span class="cl">U,0x418080,0x418180,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x4180b8,0x4181b8,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x4180f0,0x4181f0,0x13ed5,24,8
</span></span><span class="line"><span class="cl">U,0x418108,0x418208,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x418140,0x418240,0x13ed5,32,9
</span></span><span class="line"><span class="cl">U,0x418160,0x418260,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x418198,0x418298,0x13ed5,32,9
</span></span><span class="line"><span class="cl">F,0x4181b8,0x4182b8,0x9594d,80,63
</span></span><span class="line"><span class="cl">U,0x418208,0x418308,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x418240,0x418340,0x13ed5,32,10
</span></span><span class="line"><span class="cl">U,0x418260,0x418360,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x418298,0x418398,0x13ed5,24,2
</span></span><span class="line"><span class="cl">U,0x4182b0,0x4183b0,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x4182e8,0x4183e8,0x13ed5,32,9
</span></span><span class="line"><span class="cl">U,0x418308,0x418408,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x418340,0x418440,0x13ed5,24,5
</span></span><span class="line"><span class="cl">U,0x418358,0x418458,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x418390,0x418490,0x13ed5,24,8
</span></span><span class="line"><span class="cl">U,0x4183a8,0x4184a8,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x4183e0,0x4184e0,0x13ed5,24,5
</span></span><span class="line"><span class="cl">U,0x4183f8,0x4184f8,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x418430,0x418530,0x13ed5,24,5
</span></span><span class="line"><span class="cl">U,0x418448,0x418548,0x13ed5,24,1
</span></span><span class="line"><span class="cl">U,0x418460,0x418560,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x418498,0x418598,0x13ed5,24,7
</span></span><span class="line"><span class="cl">U,0x4184b0,0x4185b0,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x4184e8,0x4185e8,0x13ed5,24,2
</span></span><span class="line"><span class="cl">U,0x418500,0x418600,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x418538,0x418638,0x13ed5,32,9
</span></span><span class="line"><span class="cl">U,0x418558,0x418658,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x418590,0x418690,0x13ed5,24,5
</span></span><span class="line"><span class="cl">U,0x4185a8,0x4186a8,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x4185e0,0x4186e0,0x13ed5,24,8
</span></span><span class="line"><span class="cl">U,0x4185f8,0x4186f8,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x418630,0x418730,0x13ed5,24,5
</span></span><span class="line"><span class="cl">U,0x418648,0x418748,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x418680,0x418780,0x13ed5,24,5
</span></span><span class="line"><span class="cl">U,0x418698,0x418798,0x13ed5,24,1
</span></span><span class="line"><span class="cl">U,0x4186b0,0x4187b0,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x4186e8,0x4187e8,0x13ed5,24,7
</span></span><span class="line"><span class="cl">U,0x418700,0x418800,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x418738,0x418838,0x13ed5,24,2
</span></span><span class="line"><span class="cl">U,0x418750,0x418850,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x418788,0x418888,0x13ed5,32,9
</span></span><span class="line"><span class="cl">U,0x4187a8,0x4188a8,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x4187e0,0x4188e0,0x13ed5,24,5
</span></span><span class="line"><span class="cl">U,0x4187f8,0x4188f8,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x418830,0x418930,0x13ed5,24,8
</span></span><span class="line"><span class="cl">U,0x418848,0x418948,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x418880,0x418980,0x13ed5,24,5
</span></span><span class="line"><span class="cl">U,0x418898,0x418998,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x4188d0,0x4189d0,0x13ed5,24,5
</span></span><span class="line"><span class="cl">U,0x4188e8,0x4189e8,0x13ed5,24,1
</span></span><span class="line"><span class="cl">U,0x418900,0x418a00,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x418938,0x418a38,0x13ed5,24,7
</span></span><span class="line"><span class="cl">U,0x418950,0x418a50,0x3dc13,2720,2704
</span></span><span class="line"><span class="cl">U,0x4193f0,0x4194f0,0x803f4,3088,3072
</span></span><span class="line"><span class="cl">U,0x41a000,0x41a100,0x803f4,3088,3072
</span></span><span class="line"><span class="cl">U,0x41ac10,0x41ad10,0x80808,896,880
</span></span><span class="line"><span class="cl">U,0x41af90,0x41b090,0x803f4,1040,1024
</span></span><span class="line"><span class="cl">U,0x41b3a0,0x41b4a0,0x803f4,12304,12288
</span></span><span class="line"><span class="cl">U,0x41e3b0,0x41e4b0,0x803f4,112,92
</span></span><span class="line"><span class="cl">U,0x41e420,0x41e520,0x80808,1296,1280
</span></span><span class="line"><span class="cl">U,0x41e930,0x41ea30,0x803f4,5136,5120
</span></span><span class="line"><span class="cl">U,0x41fd40,0x41fe40,0x803f4,112,92
</span></span><span class="line"><span class="cl">U,0x41fdb0,0x41feb0,0x803f4,4112,4096
</span></span><span class="line"><span class="cl">U,0x420dc0,0x420ec0,0x803f4,112,92
</span></span><span class="line"><span class="cl">F,0x420e30,0x420f30,0x956db,64,36
</span></span><span class="line"><span class="cl">U,0x420e70,0x420f70,0x42d97,40,20
</span></span><span class="line"><span class="cl">U,0x420e98,0x420f98,0x7eab8,96,80
</span></span><span class="line"><span class="cl">U,0x420ef8,0x420ff8,0x42d97,40,20
</span></span><span class="line"><span class="cl">U,0x420f20,0x421020,0x7eab8,96,80
</span></span><span class="line"><span class="cl">U,0x420f80,0x421080,0x42d97,40,20
</span></span><span class="line"><span class="cl">U,0x420fa8,0x4210a8,0x7eab8,96,80
</span></span><span class="line"><span class="cl">U,0x421008,0x421108,0x42d97,40,20
</span></span><span class="line"><span class="cl">U,0x421030,0x421130,0x7eab8,96,80
</span></span><span class="line"><span class="cl">U,0x421090,0x421190,0x42d97,40,20
</span></span><span class="line"><span class="cl">U,0x4210b8,0x4211b8,0x7eab8,96,80
</span></span><span class="line"><span class="cl">U,0x421118,0x421218,0x42d97,40,20
</span></span><span class="line"><span class="cl">U,0x421140,0x421240,0x7eab8,96,80
</span></span><span class="line"><span class="cl">U,0x4211a0,0x4212a0,0x7eab8,96,80
</span></span><span class="line"><span class="cl">U,0x421200,0x421300,0x80c7c,64,44
</span></span><span class="line"><span class="cl">U,0x421240,0x421340,0x7e8ac,96,80
</span></span><span class="line"><span class="cl">U,0x4212a0,0x4213a0,0x7eab8,96,80
</span></span><span class="line"><span class="cl">U,0x421300,0x421400,0x7e8ac,96,80
</span></span><span class="line"><span class="cl">U,0x421360,0x421460,0x7e8ac,96,80
</span></span><span class="line"><span class="cl">U,0x4213c0,0x4214c0,0x7e8ac,96,80
</span></span><span class="line"><span class="cl">U,0x421420,0x421520,0x803f4,1040,1024
</span></span><span class="line"><span class="cl">U,0x421830,0x421930,0x803f4,112,92
</span></span><span class="line"><span class="cl">U,0x4218a0,0x4219a0,0x803f4,1040,1024
</span></span><span class="line"><span class="cl">U,0x421cb0,0x421db0,0x803f4,112,92
</span></span><span class="line"><span class="cl">U,0x421d20,0x421e20,0x7e8ac,96,80
</span></span><span class="line"><span class="cl">U,0x421d80,0x421e80,0x7eab8,96,80
</span></span><span class="line"><span class="cl">U,0x421de0,0x421ee0,0x961bb,24,4
</span></span><span class="line"><span class="cl">U,0x421df8,0x421ef8,0x97b51,376,360
</span></span><span class="line"><span class="cl">U,0x421f70,0x422070,0x6e705,32,11
</span></span><span class="line"><span class="cl">U,0x421f90,0x422090,0x9642b,328,312
</span></span><span class="line"><span class="cl">U,0x4220d8,0x4221d8,0x96435,472,456
</span></span><span class="line"><span class="cl">U,0x4222b0,0x4223b0,0x96455,24,4
</span></span><span class="line"><span class="cl">U,0x4222c8,0x4223c8,0x6e705,32,9
</span></span><span class="line"><span class="cl">U,0x4222e8,0x4223e8,0x97b9d,24,4
</span></span><span class="line"><span class="cl">U,0x422300,0x422400,0x97aa1,288,268
</span></span><span class="line"><span class="cl">U,0x422420,0x422520,0x97e8b,24,4
</span></span><span class="line"><span class="cl">U,0x422438,0x422538,0xa4c29,24,4
</span></span><span class="line"><span class="cl">U,0x422450,0x422550,0x9ec37,88,72
</span></span><span class="line"><span class="cl">U,0x4224a8,0x4225a8,0x95a9f,48,28
</span></span><span class="line"><span class="cl">U,0x4224d8,0x4225d8,0x95a9f,48,28
</span></span><span class="line"><span class="cl">U,0x422508,0x422608,0x9ef85,56,40
</span></span><span class="line"><span class="cl">U,0x422540,0x422640,0x95a9f,48,28
</span></span><span class="line"><span class="cl">F,0x422570,0x422670,0x95943,32,16
</span></span><span class="line"><span class="cl">U,0x422590,0x422690,0xaf3ed,48,12
</span></span><span class="line"><span class="cl">U,0x4225c0,0x4226c0,0x9d865,72,56
</span></span><span class="line"><span class="cl">U,0x422608,0x422708,0x9d88b,1472,1456
</span></span><span class="line"><span class="cl">U,0x422bc8,0x422cc8,0x9d893,64,48
</span></span><span class="line"><span class="cl">U,0x422c08,0x422d08,0x986b3,40,20
</span></span><span class="line"><span class="cl">U,0x422c30,0x422d30,0x986e7,112,96
</span></span><span class="line"><span class="cl">U,0x422ca0,0x422da0,0x96559,104,88
</span></span><span class="line"><span class="cl">U,0x422d08,0x422e08,0xb1e05,360,342
</span></span><span class="line"><span class="cl">U,0x422e70,0x422f70,0x83c1b,48,26
</span></span><span class="line"><span class="cl">F,0x422ea0,0x422fa0,0x9594d,216,130
</span></span><span class="line"><span class="cl">U,0x422f78,0x423078,0x140f3,40,6
</span></span><span class="line"><span class="cl">U,0x422fa0,0x4230a0,0x9fe83,96,80
</span></span><span class="line"><span class="cl">F,0x423000,0x423100,0x8c255,176,130
</span></span><span class="line"><span class="cl">U,0x4230b0,0x4231b0,0x83c1b,24,1
</span></span><span class="line"><span class="cl">U,0x4230c8,0x4231c8,0x83c1b,40,20
</span></span><span class="line"><span class="cl">F,0x4230f0,0x4231f0,0x812b7,40,20
</span></span><span class="line"><span class="cl">U,0x423118,0x423218,0xb25ff,496,476
</span></span><span class="line"><span class="cl">U,0x423308,0x423408,0x9e865,88,72
</span></span><span class="line"><span class="cl">U,0x423360,0x423460,0x95a9f,48,28
</span></span><span class="line"><span class="cl">U,0x423390,0x423490,0x95a9f,48,28
</span></span><span class="line"><span class="cl">U,0x4233c0,0x4234c0,0xa4883,56,40
</span></span><span class="line"><span class="cl">U,0x4233f8,0x4234f8,0xa350b,112,96
</span></span><span class="line"><span class="cl">U,0x423468,0x423568,0xb0193,1048,1028
</span></span><span class="line"><span class="cl">U,0x423880,0x423980,0xaf9f7,40,20
</span></span><span class="line"><span class="cl">U,0x4238a8,0x4239a8,0x9d865,72,56
</span></span><span class="line"><span class="cl">U,0x4238f0,0x4239f0,0x9d88b,1472,1456
</span></span><span class="line"><span class="cl">U,0x423eb0,0x423fb0,0x9d893,64,48
</span></span><span class="line"><span class="cl">U,0x423ef0,0x423ff0,0x9ef85,56,40
</span></span><span class="line"><span class="cl">U,0x423f28,0x424028,0x95a9f,48,28
</span></span><span class="line"><span class="cl">U,0x423f58,0x424058,0x9fa4f,64,48
</span></span><span class="line"><span class="cl">U,0x423f98,0x424098,0x9f79d,32,9
</span></span><span class="line"><span class="cl">U,0x423fb8,0x4240b8,0x6e705,32,9
</span></span><span class="line"><span class="cl">U,0x423fd8,0x4240d8,0xb1fa5,144,128
</span></span><span class="line"><span class="cl">F,0x424068,0x424168,0x9e9a1,3200,512
</span></span><span class="line"><span class="cl">U,0x424ce8,0x424de8,0x803f4,2064,2048
</span></span><span class="line"><span class="cl">U,0x4254f8,0x4255f8,0x803f4,112,92
</span></span><span class="line"><span class="cl">F,0x425568,0x425668,0x95b35,32,16
</span></span><span class="line"><span class="cl">U,0x425588,0x425688,0x803f4,2064,2048
</span></span><span class="line"><span class="cl">U,0x425d98,0x425e98,0x803f4,112,92
</span></span><span class="line"><span class="cl">F,0x425e08,0x425f08,0x14d11,41448,1932
</span></span></code></pre></td></tr></table>
</div>
</div><p>打开 mqtt，然后再关闭 mqtt 之后的 heap info:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">  1
</span><span class="lnt">  2
</span><span class="lnt">  3
</span><span class="lnt">  4
</span><span class="lnt">  5
</span><span class="lnt">  6
</span><span class="lnt">  7
</span><span class="lnt">  8
</span><span class="lnt">  9
</span><span class="lnt"> 10
</span><span class="lnt"> 11
</span><span class="lnt"> 12
</span><span class="lnt"> 13
</span><span class="lnt"> 14
</span><span class="lnt"> 15
</span><span class="lnt"> 16
</span><span class="lnt"> 17
</span><span class="lnt"> 18
</span><span class="lnt"> 19
</span><span class="lnt"> 20
</span><span class="lnt"> 21
</span><span class="lnt"> 22
</span><span class="lnt"> 23
</span><span class="lnt"> 24
</span><span class="lnt"> 25
</span><span class="lnt"> 26
</span><span class="lnt"> 27
</span><span class="lnt"> 28
</span><span class="lnt"> 29
</span><span class="lnt"> 30
</span><span class="lnt"> 31
</span><span class="lnt"> 32
</span><span class="lnt"> 33
</span><span class="lnt"> 34
</span><span class="lnt"> 35
</span><span class="lnt"> 36
</span><span class="lnt"> 37
</span><span class="lnt"> 38
</span><span class="lnt"> 39
</span><span class="lnt"> 40
</span><span class="lnt"> 41
</span><span class="lnt"> 42
</span><span class="lnt"> 43
</span><span class="lnt"> 44
</span><span class="lnt"> 45
</span><span class="lnt"> 46
</span><span class="lnt"> 47
</span><span class="lnt"> 48
</span><span class="lnt"> 49
</span><span class="lnt"> 50
</span><span class="lnt"> 51
</span><span class="lnt"> 52
</span><span class="lnt"> 53
</span><span class="lnt"> 54
</span><span class="lnt"> 55
</span><span class="lnt"> 56
</span><span class="lnt"> 57
</span><span class="lnt"> 58
</span><span class="lnt"> 59
</span><span class="lnt"> 60
</span><span class="lnt"> 61
</span><span class="lnt"> 62
</span><span class="lnt"> 63
</span><span class="lnt"> 64
</span><span class="lnt"> 65
</span><span class="lnt"> 66
</span><span class="lnt"> 67
</span><span class="lnt"> 68
</span><span class="lnt"> 69
</span><span class="lnt"> 70
</span><span class="lnt"> 71
</span><span class="lnt"> 72
</span><span class="lnt"> 73
</span><span class="lnt"> 74
</span><span class="lnt"> 75
</span><span class="lnt"> 76
</span><span class="lnt"> 77
</span><span class="lnt"> 78
</span><span class="lnt"> 79
</span><span class="lnt"> 80
</span><span class="lnt"> 81
</span><span class="lnt"> 82
</span><span class="lnt"> 83
</span><span class="lnt"> 84
</span><span class="lnt"> 85
</span><span class="lnt"> 86
</span><span class="lnt"> 87
</span><span class="lnt"> 88
</span><span class="lnt"> 89
</span><span class="lnt"> 90
</span><span class="lnt"> 91
</span><span class="lnt"> 92
</span><span class="lnt"> 93
</span><span class="lnt"> 94
</span><span class="lnt"> 95
</span><span class="lnt"> 96
</span><span class="lnt"> 97
</span><span class="lnt"> 98
</span><span class="lnt"> 99
</span><span class="lnt">100
</span><span class="lnt">101
</span><span class="lnt">102
</span><span class="lnt">103
</span><span class="lnt">104
</span><span class="lnt">105
</span><span class="lnt">106
</span><span class="lnt">107
</span><span class="lnt">108
</span><span class="lnt">109
</span><span class="lnt">110
</span><span class="lnt">111
</span><span class="lnt">112
</span><span class="lnt">113
</span><span class="lnt">114
</span><span class="lnt">115
</span><span class="lnt">116
</span><span class="lnt">117
</span><span class="lnt">118
</span><span class="lnt">119
</span><span class="lnt">120
</span><span class="lnt">121
</span><span class="lnt">122
</span><span class="lnt">123
</span><span class="lnt">124
</span><span class="lnt">125
</span><span class="lnt">126
</span><span class="lnt">127
</span><span class="lnt">128
</span><span class="lnt">129
</span><span class="lnt">130
</span><span class="lnt">131
</span><span class="lnt">132
</span><span class="lnt">133
</span><span class="lnt">134
</span><span class="lnt">135
</span><span class="lnt">136
</span><span class="lnt">137
</span><span class="lnt">138
</span><span class="lnt">139
</span><span class="lnt">140
</span><span class="lnt">141
</span><span class="lnt">142
</span><span class="lnt">143
</span><span class="lnt">144
</span><span class="lnt">145
</span><span class="lnt">146
</span><span class="lnt">147
</span><span class="lnt">148
</span><span class="lnt">149
</span><span class="lnt">150
</span><span class="lnt">151
</span><span class="lnt">152
</span><span class="lnt">153
</span><span class="lnt">154
</span><span class="lnt">155
</span><span class="lnt">156
</span><span class="lnt">157
</span><span class="lnt">158
</span><span class="lnt">159
</span><span class="lnt">160
</span><span class="lnt">161
</span><span class="lnt">162
</span><span class="lnt">163
</span><span class="lnt">164
</span><span class="lnt">165
</span><span class="lnt">166
</span><span class="lnt">167
</span><span class="lnt">168
</span><span class="lnt">169
</span><span class="lnt">170
</span><span class="lnt">171
</span><span class="lnt">172
</span><span class="lnt">173
</span><span class="lnt">174
</span><span class="lnt">175
</span><span class="lnt">176
</span><span class="lnt">177
</span><span class="lnt">178
</span><span class="lnt">179
</span><span class="lnt">180
</span><span class="lnt">181
</span><span class="lnt">182
</span><span class="lnt">183
</span><span class="lnt">184
</span><span class="lnt">185
</span><span class="lnt">186
</span><span class="lnt">187
</span><span class="lnt">188
</span><span class="lnt">189
</span><span class="lnt">190
</span><span class="lnt">191
</span><span class="lnt">192
</span><span class="lnt">193
</span><span class="lnt">194
</span><span class="lnt">195
</span><span class="lnt">196
</span><span class="lnt">197
</span><span class="lnt">198
</span><span class="lnt">199
</span><span class="lnt">200
</span><span class="lnt">201
</span><span class="lnt">202
</span><span class="lnt">203
</span><span class="lnt">204
</span><span class="lnt">205
</span><span class="lnt">206
</span><span class="lnt">207
</span><span class="lnt">208
</span><span class="lnt">209
</span><span class="lnt">210
</span><span class="lnt">211
</span><span class="lnt">212
</span><span class="lnt">213
</span><span class="lnt">214
</span><span class="lnt">215
</span><span class="lnt">216
</span><span class="lnt">217
</span><span class="lnt">218
</span><span class="lnt">219
</span><span class="lnt">220
</span><span class="lnt">221
</span><span class="lnt">222
</span><span class="lnt">223
</span><span class="lnt">224
</span><span class="lnt">225
</span><span class="lnt">226
</span><span class="lnt">227
</span><span class="lnt">228
</span><span class="lnt">229
</span><span class="lnt">230
</span><span class="lnt">231
</span><span class="lnt">232
</span><span class="lnt">233
</span><span class="lnt">234
</span><span class="lnt">235
</span><span class="lnt">236
</span><span class="lnt">237
</span><span class="lnt">238
</span><span class="lnt">239
</span><span class="lnt">240
</span><span class="lnt">241
</span><span class="lnt">242
</span><span class="lnt">243
</span><span class="lnt">244
</span><span class="lnt">245
</span><span class="lnt">246
</span><span class="lnt">247
</span><span class="lnt">248
</span><span class="lnt">249
</span><span class="lnt">250
</span><span class="lnt">251
</span><span class="lnt">252
</span><span class="lnt">253
</span><span class="lnt">254
</span><span class="lnt">255
</span><span class="lnt">256
</span><span class="lnt">257
</span><span class="lnt">258
</span><span class="lnt">259
</span><span class="lnt">260
</span><span class="lnt">261
</span><span class="lnt">262
</span><span class="lnt">263
</span><span class="lnt">264
</span><span class="lnt">265
</span><span class="lnt">266
</span><span class="lnt">267
</span><span class="lnt">268
</span><span class="lnt">269
</span><span class="lnt">270
</span><span class="lnt">271
</span><span class="lnt">272
</span><span class="lnt">273
</span><span class="lnt">274
</span><span class="lnt">275
</span><span class="lnt">276
</span><span class="lnt">277
</span><span class="lnt">278
</span><span class="lnt">279
</span><span class="lnt">280
</span><span class="lnt">281
</span><span class="lnt">282
</span><span class="lnt">283
</span><span class="lnt">284
</span><span class="lnt">285
</span><span class="lnt">286
</span><span class="lnt">287
</span><span class="lnt">288
</span><span class="lnt">289
</span><span class="lnt">290
</span><span class="lnt">291
</span><span class="lnt">292
</span><span class="lnt">293
</span><span class="lnt">294
</span><span class="lnt">295
</span><span class="lnt">296
</span><span class="lnt">297
</span><span class="lnt">298
</span><span class="lnt">299
</span><span class="lnt">300
</span><span class="lnt">301
</span><span class="lnt">302
</span><span class="lnt">303
</span><span class="lnt">304
</span><span class="lnt">305
</span><span class="lnt">306
</span><span class="lnt">307
</span><span class="lnt">308
</span><span class="lnt">309
</span><span class="lnt">310
</span><span class="lnt">311
</span><span class="lnt">312
</span><span class="lnt">313
</span><span class="lnt">314
</span><span class="lnt">315
</span><span class="lnt">316
</span><span class="lnt">317
</span><span class="lnt">318
</span><span class="lnt">319
</span><span class="lnt">320
</span><span class="lnt">321
</span><span class="lnt">322
</span><span class="lnt">323
</span><span class="lnt">324
</span><span class="lnt">325
</span><span class="lnt">326
</span><span class="lnt">327
</span><span class="lnt">328
</span><span class="lnt">329
</span><span class="lnt">330
</span><span class="lnt">331
</span><span class="lnt">332
</span><span class="lnt">333
</span><span class="lnt">334
</span><span class="lnt">335
</span><span class="lnt">336
</span><span class="lnt">337
</span><span class="lnt">338
</span><span class="lnt">339
</span><span class="lnt">340
</span><span class="lnt">341
</span><span class="lnt">342
</span><span class="lnt">343
</span><span class="lnt">344
</span><span class="lnt">345
</span><span class="lnt">346
</span><span class="lnt">347
</span><span class="lnt">348
</span><span class="lnt">349
</span><span class="lnt">350
</span><span class="lnt">351
</span><span class="lnt">352
</span><span class="lnt">353
</span><span class="lnt">354
</span><span class="lnt">355
</span><span class="lnt">356
</span><span class="lnt">357
</span><span class="lnt">358
</span><span class="lnt">359
</span><span class="lnt">360
</span><span class="lnt">361
</span><span class="lnt">362
</span><span class="lnt">363
</span><span class="lnt">364
</span><span class="lnt">365
</span><span class="lnt">366
</span><span class="lnt">367
</span><span class="lnt">368
</span><span class="lnt">369
</span><span class="lnt">370
</span><span class="lnt">371
</span><span class="lnt">372
</span><span class="lnt">373
</span><span class="lnt">374
</span><span class="lnt">375
</span><span class="lnt">376
</span><span class="lnt">377
</span><span class="lnt">378
</span><span class="lnt">379
</span><span class="lnt">380
</span><span class="lnt">381
</span><span class="lnt">382
</span><span class="lnt">383
</span><span class="lnt">384
</span><span class="lnt">385
</span><span class="lnt">386
</span><span class="lnt">387
</span><span class="lnt">388
</span><span class="lnt">389
</span><span class="lnt">390
</span><span class="lnt">391
</span><span class="lnt">392
</span><span class="lnt">393
</span><span class="lnt">394
</span><span class="lnt">395
</span><span class="lnt">396
</span><span class="lnt">397
</span><span class="lnt">398
</span><span class="lnt">399
</span><span class="lnt">400
</span><span class="lnt">401
</span><span class="lnt">402
</span><span class="lnt">403
</span><span class="lnt">404
</span><span class="lnt">405
</span><span class="lnt">406
</span><span class="lnt">407
</span><span class="lnt">408
</span><span class="lnt">409
</span><span class="lnt">410
</span><span class="lnt">411
</span><span class="lnt">412
</span><span class="lnt">413
</span><span class="lnt">414
</span><span class="lnt">415
</span><span class="lnt">416
</span><span class="lnt">417
</span><span class="lnt">418
</span><span class="lnt">419
</span><span class="lnt">420
</span><span class="lnt">421
</span><span class="lnt">422
</span><span class="lnt">423
</span><span class="lnt">424
</span><span class="lnt">425
</span><span class="lnt">426
</span><span class="lnt">427
</span><span class="lnt">428
</span><span class="lnt">429
</span><span class="lnt">430
</span><span class="lnt">431
</span><span class="lnt">432
</span><span class="lnt">433
</span><span class="lnt">434
</span><span class="lnt">435
</span><span class="lnt">436
</span><span class="lnt">437
</span><span class="lnt">438
</span><span class="lnt">439
</span><span class="lnt">440
</span><span class="lnt">441
</span><span class="lnt">442
</span><span class="lnt">443
</span><span class="lnt">444
</span><span class="lnt">445
</span><span class="lnt">446
</span><span class="lnt">447
</span><span class="lnt">448
</span><span class="lnt">449
</span><span class="lnt">450
</span><span class="lnt">451
</span><span class="lnt">452
</span><span class="lnt">453
</span><span class="lnt">454
</span><span class="lnt">455
</span><span class="lnt">456
</span><span class="lnt">457
</span><span class="lnt">458
</span><span class="lnt">459
</span><span class="lnt">460
</span><span class="lnt">461
</span><span class="lnt">462
</span><span class="lnt">463
</span><span class="lnt">464
</span><span class="lnt">465
</span><span class="lnt">466
</span><span class="lnt">467
</span><span class="lnt">468
</span><span class="lnt">469
</span><span class="lnt">470
</span><span class="lnt">471
</span><span class="lnt">472
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">address: 0x40aae8
</span></span><span class="line"><span class="cl">size: <span class="m">152856</span>
</span></span><span class="line"><span class="cl">avail: <span class="m">43120</span>
</span></span><span class="line"><span class="cl">pool_start: 0x40aae8
</span></span><span class="line"><span class="cl">pool_end: 0x42fff0
</span></span><span class="line"><span class="cl">state,block_addr,user_addr,caller,blocksize,wanted_size
</span></span><span class="line"><span class="cl">U,0x40aae8,0x40abe8,0x1b695,4112,4096
</span></span><span class="line"><span class="cl">U,0x40baf8,0x40bbf8,0x1b6b5,40,20
</span></span><span class="line"><span class="cl">U,0x40bb20,0x40bc20,0x1b695,528,512
</span></span><span class="line"><span class="cl">U,0x40bd30,0x40be30,0x1b6b5,40,20
</span></span><span class="line"><span class="cl">U,0x40bd58,0x40be58,0x1b695,4112,4096
</span></span><span class="line"><span class="cl">U,0x40cd68,0x40ce68,0x1b6b5,40,20
</span></span><span class="line"><span class="cl">U,0x40cd90,0x40ce90,0x1b695,528,512
</span></span><span class="line"><span class="cl">U,0x40cfa0,0x40d0a0,0x1b6b5,40,20
</span></span><span class="line"><span class="cl">U,0x40cfc8,0x40d0c8,0x7eab8,96,80
</span></span><span class="line"><span class="cl">U,0x40d028,0x40d128,0x7e8ac,96,80
</span></span><span class="line"><span class="cl">U,0x40d088,0x40d188,0x28319,112,92
</span></span><span class="line"><span class="cl">U,0x40d0f8,0x40d1f8,0x28441,96,80
</span></span><span class="line"><span class="cl">U,0x40d158,0x40d258,0x7eab8,96,80
</span></span><span class="line"><span class="cl">U,0x40d1b8,0x40d2b8,0x7eab8,96,80
</span></span><span class="line"><span class="cl">U,0x40d218,0x40d318,0x28319,112,92
</span></span><span class="line"><span class="cl">U,0x40d288,0x40d388,0x28441,96,80
</span></span><span class="line"><span class="cl">U,0x40d2e8,0x40d3e8,0x7eab8,96,80
</span></span><span class="line"><span class="cl">U,0x40d348,0x40d448,0x7eab8,96,80
</span></span><span class="line"><span class="cl">U,0x40d3a8,0x40d4a8,0x28319,112,92
</span></span><span class="line"><span class="cl">U,0x40d418,0x40d518,0x28441,96,80
</span></span><span class="line"><span class="cl">U,0x40d478,0x40d578,0x7eab8,96,80
</span></span><span class="line"><span class="cl">U,0x40d4d8,0x40d5d8,0x7eab8,96,80
</span></span><span class="line"><span class="cl">U,0x40d538,0x40d638,0x803f4,112,92
</span></span><span class="line"><span class="cl">U,0x40d5a8,0x40d6a8,0xa4be5,56,36
</span></span><span class="line"><span class="cl">U,0x40d5e0,0x40d6e0,0x9fb53,48,28
</span></span><span class="line"><span class="cl">U,0x40d610,0x40d710,0xb22f3,760,744
</span></span><span class="line"><span class="cl">U,0x40d908,0x40da08,0x7f51c,1040,1024
</span></span><span class="line"><span class="cl">U,0x40dd18,0x40de18,0x7f51c,112,92
</span></span><span class="line"><span class="cl">U,0x40dd88,0x40de88,0x7fe1c,288,272
</span></span><span class="line"><span class="cl">U,0x40dea8,0x40dfa8,0x7fefc,3088,3072
</span></span><span class="line"><span class="cl">U,0x40eab8,0x40ebb8,0x7fefc,112,92
</span></span><span class="line"><span class="cl">U,0x40eb28,0x40ec28,0x15769,32,16
</span></span><span class="line"><span class="cl">U,0x40eb48,0x40ec48,0x15789,128,108
</span></span><span class="line"><span class="cl">U,0x40ebc8,0x40ecc8,0x157a9,136,114
</span></span><span class="line"><span class="cl">U,0x40ec50,0x40ed50,0x80808,120,100
</span></span><span class="line"><span class="cl">U,0x40ecc8,0x40edc8,0x803f4,1040,1024
</span></span><span class="line"><span class="cl">U,0x40f0d8,0x40f1d8,0x803f4,112,92
</span></span><span class="line"><span class="cl">U,0x40f148,0x40f248,0x7e8ac,96,80
</span></span><span class="line"><span class="cl">U,0x40f1a8,0x40f2a8,0x803f4,4112,4096
</span></span><span class="line"><span class="cl">U,0x4101b8,0x4102b8,0x803f4,112,92
</span></span><span class="line"><span class="cl">U,0x410228,0x410328,0x28441,96,80
</span></span><span class="line"><span class="cl">U,0x410288,0x410388,0x1405f,64,40
</span></span><span class="line"><span class="cl">U,0x4102c8,0x4103c8,0xa01ef,40,22
</span></span><span class="line"><span class="cl">U,0x4102f0,0x4103f0,0x80c7c,72,44
</span></span><span class="line"><span class="cl">U,0x410338,0x410438,0x83c1b,24,8
</span></span><span class="line"><span class="cl">U,0x410350,0x410450,0x83c1b,40,4
</span></span><span class="line"><span class="cl">U,0x410378,0x410478,0xa1b0d,64,32
</span></span><span class="line"><span class="cl">U,0x4103b8,0x4104b8,0x34f21,1040,1024
</span></span><span class="line"><span class="cl">U,0x4107c8,0x4108c8,0x9f79d,40,9
</span></span><span class="line"><span class="cl">U,0x4107f0,0x4108f0,0x9a079,192,172
</span></span><span class="line"><span class="cl">U,0x4108b0,0x4109b0,0x9bf95,40,22
</span></span><span class="line"><span class="cl">U,0x4108d8,0x4109d8,0x99f8f,224,208
</span></span><span class="line"><span class="cl">U,0x4109b8,0x410ab8,0x9c46f,64,48
</span></span><span class="line"><span class="cl">U,0x4109f8,0x410af8,0x9dfef,40,22
</span></span><span class="line"><span class="cl">U,0x410a20,0x410b20,0x6e705,32,9
</span></span><span class="line"><span class="cl">U,0x410a40,0x410b40,0xa01ef,56,22
</span></span><span class="line"><span class="cl">U,0x410a78,0x410b78,0x7eab8,96,80
</span></span><span class="line"><span class="cl">U,0x410ad8,0x410bd8,0x7eab8,96,80
</span></span><span class="line"><span class="cl">U,0x410b38,0x410c38,0x28319,224,208
</span></span><span class="line"><span class="cl">U,0x410c18,0x410d18,0x7eab8,96,80
</span></span><span class="line"><span class="cl">U,0x410c78,0x410d78,0x285a9,2064,2048
</span></span><span class="line"><span class="cl">U,0x411488,0x411588,0x285a9,112,92
</span></span><span class="line"><span class="cl">U,0x4114f8,0x4115f8,0x80808,1120,1104
</span></span><span class="line"><span class="cl">U,0x411958,0x411a58,0x803f4,4112,4096
</span></span><span class="line"><span class="cl">U,0x412968,0x412a68,0x803f4,112,92
</span></span><span class="line"><span class="cl">U,0x4129d8,0x412ad8,0x9d659,72,52
</span></span><span class="line"><span class="cl">U,0x412a20,0x412b20,0x7e8ac,96,80
</span></span><span class="line"><span class="cl">U,0x412a80,0x412b80,0x80808,1632,1616
</span></span><span class="line"><span class="cl">U,0x4130e0,0x4131e0,0x803f4,2064,2048
</span></span><span class="line"><span class="cl">U,0x4138f0,0x4139f0,0x803f4,112,92
</span></span><span class="line"><span class="cl">U,0x413960,0x413a60,0x80808,256,240
</span></span><span class="line"><span class="cl">U,0x413a60,0x413b60,0x803f4,1168,1152
</span></span><span class="line"><span class="cl">U,0x413ef0,0x413ff0,0xa46c5,952,936
</span></span><span class="line"><span class="cl">U,0x4142a8,0x4143a8,0xb1ff7,56,4
</span></span><span class="line"><span class="cl">U,0x4142e0,0x4143e0,0x80808,176,160
</span></span><span class="line"><span class="cl">U,0x414390,0x414490,0x803f4,4112,4096
</span></span><span class="line"><span class="cl">U,0x4153a0,0x4154a0,0x803f4,112,92
</span></span><span class="line"><span class="cl">U,0x415410,0x415510,0x7e8ac,96,80
</span></span><span class="line"><span class="cl">U,0x415470,0x415570,0x803f4,112,92
</span></span><span class="line"><span class="cl">U,0x4154e0,0x4155e0,0x80808,1296,1280
</span></span><span class="line"><span class="cl">U,0x4159f0,0x415af0,0x803f4,112,92
</span></span><span class="line"><span class="cl">U,0x415a60,0x415b60,0x7eab8,96,80
</span></span><span class="line"><span class="cl">U,0x415ac0,0x415bc0,0x7e8ac,96,80
</span></span><span class="line"><span class="cl">U,0x415b20,0x415c20,0x803f4,136,92
</span></span><span class="line"><span class="cl">U,0x415ba8,0x415ca8,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x415be0,0x415ce0,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x415c18,0x415d18,0x13ed5,24,5
</span></span><span class="line"><span class="cl">U,0x415c30,0x415d30,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x415c68,0x415d68,0x13ed5,24,8
</span></span><span class="line"><span class="cl">U,0x415c80,0x415d80,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x415cb8,0x415db8,0x13ed5,24,7
</span></span><span class="line"><span class="cl">U,0x415cd0,0x415dd0,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x415d08,0x415e08,0x13ed5,24,2
</span></span><span class="line"><span class="cl">U,0x415d20,0x415e20,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x415d58,0x415e58,0x13ed5,24,7
</span></span><span class="line"><span class="cl">U,0x415d70,0x415e70,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x415da8,0x415ea8,0x13ed5,32,12
</span></span><span class="line"><span class="cl">U,0x415dc8,0x415ec8,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x415e00,0x415f00,0x13ed5,24,8
</span></span><span class="line"><span class="cl">U,0x415e18,0x415f18,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x415e50,0x415f50,0x13ed5,32,11
</span></span><span class="line"><span class="cl">U,0x415e70,0x415f70,0x13ed5,32,12
</span></span><span class="line"><span class="cl">U,0x415e90,0x415f90,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x415ec8,0x415fc8,0x13ed5,32,13
</span></span><span class="line"><span class="cl">U,0x415ee8,0x415fe8,0x13ed5,56,33
</span></span><span class="line"><span class="cl">U,0x415f20,0x416020,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x415f58,0x416058,0x13ed5,32,11
</span></span><span class="line"><span class="cl">U,0x415f78,0x416078,0x13ed5,24,8
</span></span><span class="line"><span class="cl">U,0x415f90,0x416090,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x415fc8,0x4160c8,0x13ed5,24,7
</span></span><span class="line"><span class="cl">U,0x415fe0,0x4160e0,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x416018,0x416118,0x13ed5,24,4
</span></span><span class="line"><span class="cl">U,0x416030,0x416130,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x416068,0x416168,0x13ed5,24,2
</span></span><span class="line"><span class="cl">U,0x416080,0x416180,0x13ed5,32,12
</span></span><span class="line"><span class="cl">U,0x4160a0,0x4161a0,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x4160d8,0x4161d8,0x13ed5,24,2
</span></span><span class="line"><span class="cl">U,0x4160f0,0x4161f0,0x13ed5,32,13
</span></span><span class="line"><span class="cl">U,0x416110,0x416210,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x416148,0x416248,0x13ed5,24,4
</span></span><span class="line"><span class="cl">U,0x416160,0x416260,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x416198,0x416298,0x13ed5,24,2
</span></span><span class="line"><span class="cl">U,0x4161b0,0x4162b0,0x13ed5,32,12
</span></span><span class="line"><span class="cl">U,0x4161d0,0x4162d0,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x416208,0x416308,0x13ed5,24,2
</span></span><span class="line"><span class="cl">U,0x416220,0x416320,0x13ed5,32,13
</span></span><span class="line"><span class="cl">U,0x416240,0x416340,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x416278,0x416378,0x13ed5,24,4
</span></span><span class="line"><span class="cl">U,0x416290,0x416390,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x4162c8,0x4163c8,0x13ed5,24,2
</span></span><span class="line"><span class="cl">U,0x4162e0,0x4163e0,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x416318,0x416418,0x13ed5,24,8
</span></span><span class="line"><span class="cl">U,0x416330,0x416430,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x416368,0x416468,0x13ed5,32,11
</span></span><span class="line"><span class="cl">U,0x416388,0x416488,0x13ed5,32,12
</span></span><span class="line"><span class="cl">U,0x4163a8,0x4164a8,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x4163e0,0x4164e0,0x13ed5,32,13
</span></span><span class="line"><span class="cl">U,0x416400,0x416500,0x13ed5,56,33
</span></span><span class="line"><span class="cl">U,0x416438,0x416538,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x416470,0x416570,0x13ed5,32,11
</span></span><span class="line"><span class="cl">U,0x416490,0x416590,0x13ed5,24,8
</span></span><span class="line"><span class="cl">U,0x4164a8,0x4165a8,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x4164e0,0x4165e0,0x13ed5,24,7
</span></span><span class="line"><span class="cl">U,0x4164f8,0x4165f8,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x416530,0x416630,0x13ed5,32,12
</span></span><span class="line"><span class="cl">U,0x416550,0x416650,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x416588,0x416688,0x13ed5,24,7
</span></span><span class="line"><span class="cl">U,0x4165a0,0x4166a0,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x4165d8,0x4166d8,0x13ed5,24,4
</span></span><span class="line"><span class="cl">U,0x4165f0,0x4166f0,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x416628,0x416728,0x13ed5,24,2
</span></span><span class="line"><span class="cl">U,0x416640,0x416740,0x13ed5,40,19
</span></span><span class="line"><span class="cl">U,0x416668,0x416768,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x4166a0,0x4167a0,0x13ed5,24,2
</span></span><span class="line"><span class="cl">U,0x4166b8,0x4167b8,0x13ed5,32,12
</span></span><span class="line"><span class="cl">U,0x4166d8,0x4167d8,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x416710,0x416810,0x13ed5,24,4
</span></span><span class="line"><span class="cl">U,0x416728,0x416828,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x416760,0x416860,0x13ed5,24,2
</span></span><span class="line"><span class="cl">U,0x416778,0x416878,0x13ed5,40,19
</span></span><span class="line"><span class="cl">U,0x4167a0,0x4168a0,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x4167d8,0x4168d8,0x13ed5,24,2
</span></span><span class="line"><span class="cl">U,0x4167f0,0x4168f0,0x13ed5,32,12
</span></span><span class="line"><span class="cl">U,0x416810,0x416910,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x416848,0x416948,0x13ed5,24,4
</span></span><span class="line"><span class="cl">U,0x416860,0x416960,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x416898,0x416998,0x13ed5,24,2
</span></span><span class="line"><span class="cl">U,0x4168b0,0x4169b0,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x4168e8,0x4169e8,0x13ed5,24,8
</span></span><span class="line"><span class="cl">U,0x416900,0x416a00,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x416938,0x416a38,0x13ed5,32,11
</span></span><span class="line"><span class="cl">U,0x416958,0x416a58,0x13ed5,32,12
</span></span><span class="line"><span class="cl">U,0x416978,0x416a78,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x4169b0,0x416ab0,0x13ed5,32,13
</span></span><span class="line"><span class="cl">U,0x4169d0,0x416ad0,0x13ed5,56,33
</span></span><span class="line"><span class="cl">U,0x416a08,0x416b08,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x416a40,0x416b40,0x13ed5,32,11
</span></span><span class="line"><span class="cl">U,0x416a60,0x416b60,0x13ed5,24,8
</span></span><span class="line"><span class="cl">U,0x416a78,0x416b78,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x416ab0,0x416bb0,0x13ed5,24,7
</span></span><span class="line"><span class="cl">U,0x416ac8,0x416bc8,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x416b00,0x416c00,0x13ed5,32,12
</span></span><span class="line"><span class="cl">U,0x416b20,0x416c20,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x416b58,0x416c58,0x13ed5,24,7
</span></span><span class="line"><span class="cl">U,0x416b70,0x416c70,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x416ba8,0x416ca8,0x13ed5,24,4
</span></span><span class="line"><span class="cl">U,0x416bc0,0x416cc0,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x416bf8,0x416cf8,0x13ed5,24,2
</span></span><span class="line"><span class="cl">U,0x416c10,0x416d10,0x13ed5,40,19
</span></span><span class="line"><span class="cl">U,0x416c38,0x416d38,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x416c70,0x416d70,0x13ed5,24,2
</span></span><span class="line"><span class="cl">U,0x416c88,0x416d88,0x13ed5,40,20
</span></span><span class="line"><span class="cl">U,0x416cb0,0x416db0,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x416ce8,0x416de8,0x13ed5,24,4
</span></span><span class="line"><span class="cl">U,0x416d00,0x416e00,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x416d38,0x416e38,0x13ed5,24,2
</span></span><span class="line"><span class="cl">U,0x416d50,0x416e50,0x13ed5,40,19
</span></span><span class="line"><span class="cl">U,0x416d78,0x416e78,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x416db0,0x416eb0,0x13ed5,24,2
</span></span><span class="line"><span class="cl">U,0x416dc8,0x416ec8,0x13ed5,40,20
</span></span><span class="line"><span class="cl">U,0x416df0,0x416ef0,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x416e28,0x416f28,0x13ed5,24,4
</span></span><span class="line"><span class="cl">U,0x416e40,0x416f40,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x416e78,0x416f78,0x13ed5,24,2
</span></span><span class="line"><span class="cl">U,0x416e90,0x416f90,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x416ec8,0x416fc8,0x13ed5,24,8
</span></span><span class="line"><span class="cl">U,0x416ee0,0x416fe0,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x416f18,0x417018,0x13ed5,32,11
</span></span><span class="line"><span class="cl">U,0x416f38,0x417038,0x13ed5,32,12
</span></span><span class="line"><span class="cl">U,0x416f58,0x417058,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x416f90,0x417090,0x13ed5,32,13
</span></span><span class="line"><span class="cl">U,0x416fb0,0x4170b0,0x13ed5,56,33
</span></span><span class="line"><span class="cl">U,0x416fe8,0x4170e8,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x417020,0x417120,0x13ed5,32,11
</span></span><span class="line"><span class="cl">U,0x417040,0x417140,0x13ed5,32,13
</span></span><span class="line"><span class="cl">U,0x417060,0x417160,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x417098,0x417198,0x13ed5,24,7
</span></span><span class="line"><span class="cl">U,0x4170b0,0x4171b0,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x4170e8,0x4171e8,0x13ed5,32,12
</span></span><span class="line"><span class="cl">U,0x417108,0x417208,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x417140,0x417240,0x13ed5,24,7
</span></span><span class="line"><span class="cl">U,0x417158,0x417258,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x417190,0x417290,0x13ed5,24,4
</span></span><span class="line"><span class="cl">U,0x4171a8,0x4172a8,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x4171e0,0x4172e0,0x13ed5,24,2
</span></span><span class="line"><span class="cl">U,0x4171f8,0x4172f8,0x13ed5,40,21
</span></span><span class="line"><span class="cl">U,0x417220,0x417320,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x417258,0x417358,0x13ed5,24,2
</span></span><span class="line"><span class="cl">U,0x417270,0x417370,0x13ed5,40,22
</span></span><span class="line"><span class="cl">U,0x417298,0x417398,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x4172d0,0x4173d0,0x13ed5,24,4
</span></span><span class="line"><span class="cl">U,0x4172e8,0x4173e8,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x417320,0x417420,0x13ed5,24,2
</span></span><span class="line"><span class="cl">U,0x417338,0x417438,0x13ed5,40,21
</span></span><span class="line"><span class="cl">U,0x417360,0x417460,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x417398,0x417498,0x13ed5,24,2
</span></span><span class="line"><span class="cl">U,0x4173b0,0x4174b0,0x13ed5,40,22
</span></span><span class="line"><span class="cl">U,0x4173d8,0x4174d8,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x417410,0x417510,0x13ed5,24,4
</span></span><span class="line"><span class="cl">U,0x417428,0x417528,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x417460,0x417560,0x13ed5,24,2
</span></span><span class="line"><span class="cl">U,0x417478,0x417578,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x4174b0,0x4175b0,0x13ed5,24,8
</span></span><span class="line"><span class="cl">U,0x4174c8,0x4175c8,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x417500,0x417600,0x13ed5,32,11
</span></span><span class="line"><span class="cl">U,0x417520,0x417620,0x13ed5,32,12
</span></span><span class="line"><span class="cl">U,0x417540,0x417640,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x417578,0x417678,0x13ed5,32,13
</span></span><span class="line"><span class="cl">U,0x417598,0x417698,0x13ed5,56,33
</span></span><span class="line"><span class="cl">U,0x4175d0,0x4176d0,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x417608,0x417708,0x13ed5,32,11
</span></span><span class="line"><span class="cl">U,0x417628,0x417728,0x13ed5,32,13
</span></span><span class="line"><span class="cl">U,0x417648,0x417748,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x417680,0x417780,0x13ed5,24,7
</span></span><span class="line"><span class="cl">U,0x417698,0x417798,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x4176d0,0x4177d0,0x13ed5,32,12
</span></span><span class="line"><span class="cl">U,0x4176f0,0x4177f0,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x417728,0x417828,0x13ed5,24,7
</span></span><span class="line"><span class="cl">U,0x417740,0x417840,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x417778,0x417878,0x13ed5,24,4
</span></span><span class="line"><span class="cl">U,0x417790,0x417890,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x4177c8,0x4178c8,0x13ed5,24,2
</span></span><span class="line"><span class="cl">U,0x4177e0,0x4178e0,0x13ed5,40,21
</span></span><span class="line"><span class="cl">U,0x417808,0x417908,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x417840,0x417940,0x13ed5,24,2
</span></span><span class="line"><span class="cl">U,0x417858,0x417958,0x13ed5,40,22
</span></span><span class="line"><span class="cl">U,0x417880,0x417980,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x4178b8,0x4179b8,0x13ed5,24,4
</span></span><span class="line"><span class="cl">U,0x4178d0,0x4179d0,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x417908,0x417a08,0x13ed5,24,2
</span></span><span class="line"><span class="cl">U,0x417920,0x417a20,0x13ed5,40,21
</span></span><span class="line"><span class="cl">U,0x417948,0x417a48,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x417980,0x417a80,0x13ed5,24,2
</span></span><span class="line"><span class="cl">U,0x417998,0x417a98,0x13ed5,40,22
</span></span><span class="line"><span class="cl">U,0x4179c0,0x417ac0,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x4179f8,0x417af8,0x13ed5,24,4
</span></span><span class="line"><span class="cl">U,0x417a10,0x417b10,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x417a48,0x417b48,0x13ed5,24,8
</span></span><span class="line"><span class="cl">U,0x417a60,0x417b60,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x417a98,0x417b98,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x417ad0,0x417bd0,0x13ed5,24,8
</span></span><span class="line"><span class="cl">U,0x417ae8,0x417be8,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x417b20,0x417c20,0x13ed5,32,9
</span></span><span class="line"><span class="cl">U,0x417b40,0x417c40,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x417b78,0x417c78,0x13ed5,32,9
</span></span><span class="line"><span class="cl">U,0x417b98,0x417c98,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x417bd0,0x417cd0,0x13ed5,24,6
</span></span><span class="line"><span class="cl">U,0x417be8,0x417ce8,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x417c20,0x417d20,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x417c58,0x417d58,0x13ed5,24,8
</span></span><span class="line"><span class="cl">U,0x417c70,0x417d70,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x417ca8,0x417da8,0x13ed5,32,9
</span></span><span class="line"><span class="cl">U,0x417cc8,0x417dc8,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x417d00,0x417e00,0x13ed5,32,9
</span></span><span class="line"><span class="cl">U,0x417d20,0x417e20,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x417d58,0x417e58,0x13ed5,24,6
</span></span><span class="line"><span class="cl">U,0x417d70,0x417e70,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x417da8,0x417ea8,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x417de0,0x417ee0,0x13ed5,24,8
</span></span><span class="line"><span class="cl">U,0x417df8,0x417ef8,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x417e30,0x417f30,0x13ed5,32,9
</span></span><span class="line"><span class="cl">U,0x417e50,0x417f50,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x417e88,0x417f88,0x13ed5,32,9
</span></span><span class="line"><span class="cl">U,0x417ea8,0x417fa8,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x417ee0,0x417fe0,0x13ed5,24,6
</span></span><span class="line"><span class="cl">U,0x417ef8,0x417ff8,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x417f30,0x418030,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x417f68,0x418068,0x13ed5,24,8
</span></span><span class="line"><span class="cl">U,0x417f80,0x418080,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x417fb8,0x4180b8,0x13ed5,32,9
</span></span><span class="line"><span class="cl">U,0x417fd8,0x4180d8,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x418010,0x418110,0x13ed5,32,9
</span></span><span class="line"><span class="cl">U,0x418030,0x418130,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x418068,0x418168,0x13ed5,24,6
</span></span><span class="line"><span class="cl">U,0x418080,0x418180,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x4180b8,0x4181b8,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x4180f0,0x4181f0,0x13ed5,24,8
</span></span><span class="line"><span class="cl">U,0x418108,0x418208,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x418140,0x418240,0x13ed5,32,9
</span></span><span class="line"><span class="cl">U,0x418160,0x418260,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x418198,0x418298,0x13ed5,32,9
</span></span><span class="line"><span class="cl">F,0x4181b8,0x4182b8,0x812b7,80,20
</span></span><span class="line"><span class="cl">U,0x418208,0x418308,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x418240,0x418340,0x13ed5,32,10
</span></span><span class="line"><span class="cl">U,0x418260,0x418360,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x418298,0x418398,0x13ed5,24,2
</span></span><span class="line"><span class="cl">U,0x4182b0,0x4183b0,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x4182e8,0x4183e8,0x13ed5,32,9
</span></span><span class="line"><span class="cl">U,0x418308,0x418408,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x418340,0x418440,0x13ed5,24,5
</span></span><span class="line"><span class="cl">U,0x418358,0x418458,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x418390,0x418490,0x13ed5,24,8
</span></span><span class="line"><span class="cl">U,0x4183a8,0x4184a8,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x4183e0,0x4184e0,0x13ed5,24,5
</span></span><span class="line"><span class="cl">U,0x4183f8,0x4184f8,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x418430,0x418530,0x13ed5,24,5
</span></span><span class="line"><span class="cl">U,0x418448,0x418548,0x13ed5,24,1
</span></span><span class="line"><span class="cl">U,0x418460,0x418560,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x418498,0x418598,0x13ed5,24,7
</span></span><span class="line"><span class="cl">U,0x4184b0,0x4185b0,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x4184e8,0x4185e8,0x13ed5,24,2
</span></span><span class="line"><span class="cl">U,0x418500,0x418600,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x418538,0x418638,0x13ed5,32,9
</span></span><span class="line"><span class="cl">U,0x418558,0x418658,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x418590,0x418690,0x13ed5,24,5
</span></span><span class="line"><span class="cl">U,0x4185a8,0x4186a8,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x4185e0,0x4186e0,0x13ed5,24,8
</span></span><span class="line"><span class="cl">U,0x4185f8,0x4186f8,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x418630,0x418730,0x13ed5,24,5
</span></span><span class="line"><span class="cl">U,0x418648,0x418748,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x418680,0x418780,0x13ed5,24,5
</span></span><span class="line"><span class="cl">U,0x418698,0x418798,0x13ed5,24,1
</span></span><span class="line"><span class="cl">U,0x4186b0,0x4187b0,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x4186e8,0x4187e8,0x13ed5,24,7
</span></span><span class="line"><span class="cl">U,0x418700,0x418800,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x418738,0x418838,0x13ed5,24,2
</span></span><span class="line"><span class="cl">U,0x418750,0x418850,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x418788,0x418888,0x13ed5,32,9
</span></span><span class="line"><span class="cl">U,0x4187a8,0x4188a8,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x4187e0,0x4188e0,0x13ed5,24,5
</span></span><span class="line"><span class="cl">U,0x4187f8,0x4188f8,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x418830,0x418930,0x13ed5,24,8
</span></span><span class="line"><span class="cl">U,0x418848,0x418948,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x418880,0x418980,0x13ed5,24,5
</span></span><span class="line"><span class="cl">U,0x418898,0x418998,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x4188d0,0x4189d0,0x13ed5,24,5
</span></span><span class="line"><span class="cl">U,0x4188e8,0x4189e8,0x13ed5,24,1
</span></span><span class="line"><span class="cl">U,0x418900,0x418a00,0x1405f,56,40
</span></span><span class="line"><span class="cl">U,0x418938,0x418a38,0x13ed5,24,7
</span></span><span class="line"><span class="cl">U,0x418950,0x418a50,0x3dc13,2720,2704
</span></span><span class="line"><span class="cl">U,0x4193f0,0x4194f0,0x803f4,3088,3072
</span></span><span class="line"><span class="cl">U,0x41a000,0x41a100,0x803f4,3088,3072
</span></span><span class="line"><span class="cl">U,0x41ac10,0x41ad10,0x80808,896,880
</span></span><span class="line"><span class="cl">U,0x41af90,0x41b090,0x803f4,1040,1024
</span></span><span class="line"><span class="cl">U,0x41b3a0,0x41b4a0,0x803f4,12304,12288
</span></span><span class="line"><span class="cl">U,0x41e3b0,0x41e4b0,0x803f4,112,92
</span></span><span class="line"><span class="cl">U,0x41e420,0x41e520,0x80808,1296,1280
</span></span><span class="line"><span class="cl">U,0x41e930,0x41ea30,0x803f4,5136,5120
</span></span><span class="line"><span class="cl">U,0x41fd40,0x41fe40,0x803f4,112,92
</span></span><span class="line"><span class="cl">U,0x41fdb0,0x41feb0,0x803f4,4112,4096
</span></span><span class="line"><span class="cl">U,0x420dc0,0x420ec0,0x803f4,112,92
</span></span><span class="line"><span class="cl">F,0x420e30,0x420f30,0x956db,64,36
</span></span><span class="line"><span class="cl">U,0x420e70,0x420f70,0x42d97,40,20
</span></span><span class="line"><span class="cl">U,0x420e98,0x420f98,0x7eab8,96,80
</span></span><span class="line"><span class="cl">U,0x420ef8,0x420ff8,0x42d97,40,20
</span></span><span class="line"><span class="cl">U,0x420f20,0x421020,0x7eab8,96,80
</span></span><span class="line"><span class="cl">U,0x420f80,0x421080,0x42d97,40,20
</span></span><span class="line"><span class="cl">U,0x420fa8,0x4210a8,0x7eab8,96,80
</span></span><span class="line"><span class="cl">U,0x421008,0x421108,0x42d97,40,20
</span></span><span class="line"><span class="cl">U,0x421030,0x421130,0x7eab8,96,80
</span></span><span class="line"><span class="cl">U,0x421090,0x421190,0x42d97,40,20
</span></span><span class="line"><span class="cl">U,0x4210b8,0x4211b8,0x7eab8,96,80
</span></span><span class="line"><span class="cl">U,0x421118,0x421218,0x42d97,40,20
</span></span><span class="line"><span class="cl">U,0x421140,0x421240,0x7eab8,96,80
</span></span><span class="line"><span class="cl">U,0x4211a0,0x4212a0,0x7eab8,96,80
</span></span><span class="line"><span class="cl">U,0x421200,0x421300,0x80c7c,64,44
</span></span><span class="line"><span class="cl">U,0x421240,0x421340,0x7e8ac,96,80
</span></span><span class="line"><span class="cl">U,0x4212a0,0x4213a0,0x7eab8,96,80
</span></span><span class="line"><span class="cl">U,0x421300,0x421400,0x7e8ac,96,80
</span></span><span class="line"><span class="cl">U,0x421360,0x421460,0x7e8ac,96,80
</span></span><span class="line"><span class="cl">U,0x4213c0,0x4214c0,0x7e8ac,96,80
</span></span><span class="line"><span class="cl">U,0x421420,0x421520,0x803f4,1040,1024
</span></span><span class="line"><span class="cl">U,0x421830,0x421930,0x803f4,112,92
</span></span><span class="line"><span class="cl">U,0x4218a0,0x4219a0,0x803f4,1040,1024
</span></span><span class="line"><span class="cl">U,0x421cb0,0x421db0,0x803f4,112,92
</span></span><span class="line"><span class="cl">U,0x421d20,0x421e20,0x7e8ac,96,80
</span></span><span class="line"><span class="cl">U,0x421d80,0x421e80,0x7eab8,96,80
</span></span><span class="line"><span class="cl">U,0x421de0,0x421ee0,0x961bb,24,4
</span></span><span class="line"><span class="cl">U,0x421df8,0x421ef8,0x97b51,376,360
</span></span><span class="line"><span class="cl">U,0x421f70,0x422070,0x6e705,32,11
</span></span><span class="line"><span class="cl">U,0x421f90,0x422090,0x9642b,328,312
</span></span><span class="line"><span class="cl">U,0x4220d8,0x4221d8,0x96435,472,456
</span></span><span class="line"><span class="cl">U,0x4222b0,0x4223b0,0x96455,24,4
</span></span><span class="line"><span class="cl">U,0x4222c8,0x4223c8,0x6e705,32,9
</span></span><span class="line"><span class="cl">U,0x4222e8,0x4223e8,0x97b9d,24,4
</span></span><span class="line"><span class="cl">U,0x422300,0x422400,0x97aa1,288,268
</span></span><span class="line"><span class="cl">U,0x422420,0x422520,0x97e8b,24,4
</span></span><span class="line"><span class="cl">U,0x422438,0x422538,0xa4c29,24,4
</span></span><span class="line"><span class="cl">U,0x422450,0x422550,0x9ec37,88,72
</span></span><span class="line"><span class="cl">U,0x4224a8,0x4225a8,0x95a9f,48,28
</span></span><span class="line"><span class="cl">U,0x4224d8,0x4225d8,0x95a9f,48,28
</span></span><span class="line"><span class="cl">U,0x422508,0x422608,0x9ef85,56,40
</span></span><span class="line"><span class="cl">U,0x422540,0x422640,0x95a9f,48,28
</span></span><span class="line"><span class="cl">F,0x422570,0x422670,0x363c5,32,8
</span></span><span class="line"><span class="cl">U,0x422590,0x422690,0xaf3ed,48,12
</span></span><span class="line"><span class="cl">U,0x4225c0,0x4226c0,0x9d865,72,56
</span></span><span class="line"><span class="cl">U,0x422608,0x422708,0x9d88b,1472,1456
</span></span><span class="line"><span class="cl">U,0x422bc8,0x422cc8,0x9d893,64,48
</span></span><span class="line"><span class="cl">U,0x422c08,0x422d08,0x986b3,40,20
</span></span><span class="line"><span class="cl">U,0x422c30,0x422d30,0x986e7,112,96
</span></span><span class="line"><span class="cl">U,0x422ca0,0x422da0,0x96559,104,88
</span></span><span class="line"><span class="cl">U,0x422d08,0x422e08,0xb1e05,360,342
</span></span><span class="line"><span class="cl">U,0x422e70,0x422f70,0x83c1b,48,26
</span></span><span class="line"><span class="cl">F,0x422ea0,0x422fa0,0x9594d,256,88
</span></span><span class="line"><span class="cl">U,0x422fa0,0x4230a0,0x9fe83,96,80
</span></span><span class="line"><span class="cl">F,0x423000,0x423100,0x7e8ac,176,80
</span></span><span class="line"><span class="cl">U,0x4230b0,0x4231b0,0x83c1b,24,1
</span></span><span class="line"><span class="cl">U,0x4230c8,0x4231c8,0x83c1b,40,20
</span></span><span class="line"><span class="cl">F,0x4230f0,0x4231f0,0x812b7,40,20
</span></span><span class="line"><span class="cl">U,0x423118,0x423218,0xb25ff,496,476
</span></span><span class="line"><span class="cl">U,0x423308,0x423408,0x9e865,88,72
</span></span><span class="line"><span class="cl">U,0x423360,0x423460,0x95a9f,48,28
</span></span><span class="line"><span class="cl">U,0x423390,0x423490,0x95a9f,48,28
</span></span><span class="line"><span class="cl">U,0x4233c0,0x4234c0,0xa4883,56,40
</span></span><span class="line"><span class="cl">U,0x4233f8,0x4234f8,0xa350b,112,96
</span></span><span class="line"><span class="cl">U,0x423468,0x423568,0xb0193,1048,1028
</span></span><span class="line"><span class="cl">U,0x423880,0x423980,0xaf9f7,40,20
</span></span><span class="line"><span class="cl">U,0x4238a8,0x4239a8,0x9d865,72,56
</span></span><span class="line"><span class="cl">U,0x4238f0,0x4239f0,0x9d88b,1472,1456
</span></span><span class="line"><span class="cl">U,0x423eb0,0x423fb0,0x9d893,64,48
</span></span><span class="line"><span class="cl">U,0x423ef0,0x423ff0,0x9ef85,56,40
</span></span><span class="line"><span class="cl">U,0x423f28,0x424028,0x95a9f,48,28
</span></span><span class="line"><span class="cl">U,0x423f58,0x424058,0x9fa4f,64,48
</span></span><span class="line"><span class="cl">U,0x423f98,0x424098,0x9f79d,32,9
</span></span><span class="line"><span class="cl">U,0x423fb8,0x4240b8,0x6e705,32,9
</span></span><span class="line"><span class="cl">U,0x423fd8,0x4240d8,0xb1fa5,144,128
</span></span><span class="line"><span class="cl">F,0x424068,0x424168,0x9e9a1,3200,512
</span></span><span class="line"><span class="cl">U,0x424ce8,0x424de8,0x803f4,2064,2048
</span></span><span class="line"><span class="cl">U,0x4254f8,0x4255f8,0x803f4,112,92
</span></span><span class="line"><span class="cl">F,0x425568,0x425668,0x9e083,32,12
</span></span><span class="line"><span class="cl">U,0x425588,0x425688,0x803f4,2064,2048
</span></span><span class="line"><span class="cl">U,0x425d98,0x425e98,0x803f4,112,92
</span></span><span class="line"><span class="cl">U,0x425e08,0x425f08,0x140f3,32,6
</span></span><span class="line"><span class="cl">U,0x425e28,0x425f28,0x803f4,2064,2048
</span></span><span class="line"><span class="cl">U,0x426638,0x426738,0x803f4,112,92
</span></span><span class="line"><span class="cl">F,0x4266a8,0x4267a8,0x14d11,39240,1932
</span></span></code></pre></td></tr></table>
</div>
</div><p>对比之下，比较明显地增加了几条新 heap 使用信息</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">U,0x425e08,0x425f08,0x140f3,32,6
</span></span><span class="line"><span class="cl">U,0x425e28,0x425f28,0x803f4,2064,2048
</span></span><span class="line"><span class="cl">U,0x426638,0x426738,0x803f4,112,92
</span></span></code></pre></td></tr></table>
</div>
</div><p>再用 address2line 工具定位这几块内存是哪里申请的</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">toolchain/gcc-arm-none-eabi-5_4-2016q3/bin 
</span></span><span class="line"><span class="cl">❯ ./arm-none-eabi-addr2line -e ~/FC41D/beken_freertos_sdk_release-SDK_3.0.21/out/beken7231_bsp.elf -f 0x140f3 0x803f4 0x803f4
</span></span><span class="line"><span class="cl">cJSON_strdup
</span></span><span class="line"><span class="cl">/home/x/FC41D/beken_freertos_sdk_release-SDK_3.0.21/demos/common/json/cJSON.c:67
</span></span><span class="line"><span class="cl">rtos_create_thread
</span></span><span class="line"><span class="cl">/home/x/FC41D/beken_freertos_sdk_release-SDK_3.0.21/beken378/os/FreeRTOSv9.0.0/rtos_pub.c:98
</span></span><span class="line"><span class="cl">rtos_create_thread
</span></span><span class="line"><span class="cl">/home/x/FC41D/beken_freertos_sdk_release-SDK_3.0.21/beken378/os/FreeRTOSv9.0.0/rtos_pub.c:98
</span></span></code></pre></td></tr></table>
</div>
</div><p>/home/x/FC41D/beken_freertos_sdk_release-SDK_3.0.21/beken378/os/FreeRTOSv9.0.0/rtos_pub.c:98 对应的是创建线程的函数 rtos_create_thread</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">ali_iot_close</span><span class="p">(</span><span class="n">custom_func_ch_id_e</span> <span class="n">func_id</span><span class="p">,</span> <span class="kt">void</span> <span class="o">*</span><span class="n">hdl</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kt">ali_iot_mqtt_client_t</span> <span class="o">*</span><span class="n">mqtt_client</span> <span class="o">=</span> <span class="n">hdl</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="p">(</span><span class="n">mqtt_client</span> <span class="o">==</span> <span class="nb">NULL</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="nf">rtos_lock_mutex</span><span class="p">(</span><span class="o">&amp;</span><span class="n">mqtt_client</span><span class="o">-&gt;</span><span class="n">lock</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nf">rtos_delete_thread</span><span class="p">(</span><span class="n">mqtt_client</span><span class="o">-&gt;</span><span class="n">task</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">MQTTDisconnect</span><span class="p">(</span><span class="o">&amp;</span><span class="n">mqtt_client</span><span class="o">-&gt;</span><span class="n">client</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="nf">NetworkDisconnect</span><span class="p">(</span><span class="o">&amp;</span><span class="n">mqtt_client</span><span class="o">-&gt;</span><span class="n">network</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">mqtt_client</span><span class="o">-&gt;</span><span class="nf">ev_cb</span><span class="p">(</span><span class="n">mqtt_client</span><span class="p">,</span> <span class="n">QL_MQTT_CLOSE</span><span class="p">,</span> <span class="p">(</span><span class="n">QL_MQTT_OK</span> <span class="o">&lt;&lt;</span> <span class="mi">16</span><span class="p">)</span><span class="o">|</span><span class="n">QL_MQTT_CLOSE_BY_DISCONNECT</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="p">(</span><span class="kt">void</span> <span class="o">*</span><span class="p">)</span><span class="n">mqtt_client</span><span class="o">-&gt;</span><span class="n">func_id</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span><span class="p">(</span><span class="n">mqtt_client</span><span class="o">-&gt;</span><span class="n">sign_mqtt</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nf">free</span><span class="p">(</span><span class="n">mqtt_client</span><span class="o">-&gt;</span><span class="n">sign_mqtt</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span><span class="p">(</span><span class="n">mqtt_client</span><span class="o">-&gt;</span><span class="n">sub_topic</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nf">free</span><span class="p">(</span><span class="n">mqtt_client</span><span class="o">-&gt;</span><span class="n">sub_topic</span><span class="p">[</span><span class="mi">0</span><span class="p">]);</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span><span class="p">(</span><span class="n">mqtt_client</span><span class="o">-&gt;</span><span class="n">sub_topic</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nf">free</span><span class="p">(</span><span class="n">mqtt_client</span><span class="o">-&gt;</span><span class="n">sub_topic</span><span class="p">[</span><span class="mi">1</span><span class="p">]);</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="nf">rtos_unlock_mutex</span><span class="p">(</span><span class="o">&amp;</span><span class="n">mqtt_client</span><span class="o">-&gt;</span><span class="n">lock</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nf">rtos_deinit_mutex</span><span class="p">(</span><span class="o">&amp;</span><span class="n">mqtt_client</span><span class="o">-&gt;</span><span class="n">lock</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">free</span><span class="p">(</span><span class="n">mqtt_client</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>分析代码之后，找到原因是关闭mqtt的时候，没有正确删除线程导致的内存泄漏。 rtos_delete_thread(mqtt_client-&gt;task); 传参不对，修改为 rtos_delete_thread(&amp;mqtt_client-&gt;task);之后正常。</p>
<h4 id="案例2">案例2</h4>
<p>挂测日志，出现 malloc 失败，主动重启：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span><span class="lnt">38
</span><span class="lnt">39
</span><span class="lnt">40
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">[2024-07-26 10:23:39]  malloc failed !!!!!!!!!
</span></span><span class="line"><span class="cl">[2024-07-26 10:23:39]  
</span></span><span class="line"><span class="cl">[2024-07-26 10:23:39]  address: 0x40aaa0
</span></span><span class="line"><span class="cl">[2024-07-26 10:23:39]  size: 152928
</span></span><span class="line"><span class="cl">[2024-07-26 10:23:39]  avail: 352
</span></span><span class="line"><span class="cl">[2024-07-26 10:23:39]  pool_start: 0x40aaa0
</span></span><span class="line"><span class="cl">[2024-07-26 10:23:39]  pool_end: 0x42fff0
</span></span><span class="line"><span class="cl">[2024-07-26 10:23:39]  state,block_addr,user_addr,caller,blocksize,wanted_size
</span></span><span class="line"><span class="cl">[2024-07-26 10:23:39]  U,0x40aaa0,0x40aab0,0x1b959,4120,4096
</span></span><span class="line"><span class="cl">[2024-07-26 10:23:39]  U,0x40bab8,0x40bac8,0x1b979,40,20
</span></span><span class="line"><span class="cl">[2024-07-26 10:23:39]  U,0x40bae0,0x40baf0,0x1b959,536,512
</span></span><span class="line"><span class="cl">[2024-07-26 10:23:39]  U,0x40bcf8,0x40bd08,0x1b979,40,20
</span></span><span class="line"><span class="cl">[2024-07-26 10:23:39]  U,0x40bd20,0x40bd30,0x1b959,4120,4096
</span></span><span class="line"><span class="cl">[2024-07-26 10:23:39]  U,0x40cd38,0x40cd48,0x1b979,40,20
</span></span><span class="line"><span class="cl">[2024-07-26 10:23:39]  U,0x40cd60,0x40cd70,0x1b959,536,512
</span></span><span class="line"><span class="cl">[2024-07-26 10:23:39]  U,0x40cf78,0x40cf88,0x1b979,40,20
</span></span><span class="line"><span class="cl">[2024-07-26 10:23:39]  U,0x40cfa0,0x40cfb0,0x7e750,104,80
</span></span><span class="line"><span class="cl">[2024-07-26 10:23:39]  U,0x40d008,0x40d018,0x7e544,104,80
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">......
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">[2024-07-26 10:23:41]  U,0x42f368,0x42f378,0x7e750,104,80
</span></span><span class="line"><span class="cl">[2024-07-26 10:23:41]  U,0x42f3d0,0x42f3e0,0x7e750,104,80
</span></span><span class="line"><span class="cl">[2024-07-26 10:23:41]  U,0x42f438,0x42f448,0x7e750,104,80
</span></span><span class="line"><span class="cl">[2024-07-26 10:23:41]  U,0x42f4a0,0x42f4b0,0x7e750,104,80
</span></span><span class="line"><span class="cl">[2024-07-26 10:23:41]  U,0x42f508,0x42f518,0x7e750,104,80
</span></span><span class="line"><span class="cl">[2024-07-26 10:23:41]  U,0x42f570,0x42f580,0x7e750,104,80
</span></span><span class="line"><span class="cl">[2024-07-26 10:23:41]  U,0x42f5d8,0x42f5e8,0x7e750,104,80
</span></span><span class="line"><span class="cl">[2024-07-26 10:23:41]  U,0x42f640,0x42f650,0x7e750,104,80
</span></span><span class="line"><span class="cl">[2024-07-26 10:23:41]  U,0x42f6a8,0x42f6b8,0x7e750,104,80
</span></span><span class="line"><span class="cl">[2024-07-26 10:23:41]  U,0x42f710,0x42f720,0x4ae8b,416,396
</span></span><span class="line"><span class="cl">[2024-07-26 10:23:41]  U,0x42f8b0,0x42f8c0,0x7e750,104,80
</span></span><span class="line"><span class="cl">[2024-07-26 10:23:41]  U,0x42f918,0x42f928,0x7e750,104,80
</span></span><span class="line"><span class="cl">[2024-07-26 10:23:41]  U,0x42f980,0x42f990,0x28721,104,80
</span></span><span class="line"><span class="cl">[2024-07-26 10:23:41]  F,0x42f9e8,0x42f9f8,0x95719,112,88
</span></span><span class="line"><span class="cl">[2024-07-26 10:23:41]  U,0x42fa58,0x42fa68,0x9e76d,536,512
</span></span><span class="line"><span class="cl">[2024-07-26 10:23:41]  U,0x42fc70,0x42fc80,0xacb8d,792,768
</span></span><span class="line"><span class="cl">[2024-07-26 10:23:41]  F,0x42ff88,0x42ff98,(nil),104,0
</span></span><span class="line"><span class="cl">[2024-07-26 10:23:41]  bk_reboot
</span></span><span class="line"><span class="cl">[2024-07-26 10:23:41]  wdt reboot
</span></span></code></pre></td></tr></table>
</div>
</div><p>写脚本，将 log 保存为 csv 文件，并把 caller 地址对应的函数名找出来</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span><span class="lnt">38
</span><span class="lnt">39
</span><span class="lnt">40
</span><span class="lnt">41
</span><span class="lnt">42
</span><span class="lnt">43
</span><span class="lnt">44
</span><span class="lnt">45
</span><span class="lnt">46
</span><span class="lnt">47
</span><span class="lnt">48
</span><span class="lnt">49
</span><span class="lnt">50
</span><span class="lnt">51
</span><span class="lnt">52
</span><span class="lnt">53
</span><span class="lnt">54
</span><span class="lnt">55
</span><span class="lnt">56
</span><span class="lnt">57
</span><span class="lnt">58
</span><span class="lnt">59
</span><span class="lnt">60
</span><span class="lnt">61
</span><span class="lnt">62
</span><span class="lnt">63
</span><span class="lnt">64
</span><span class="lnt">65
</span><span class="lnt">66
</span><span class="lnt">67
</span><span class="lnt">68
</span><span class="lnt">69
</span><span class="lnt">70
</span><span class="lnt">71
</span><span class="lnt">72
</span><span class="lnt">73
</span><span class="lnt">74
</span><span class="lnt">75
</span><span class="lnt">76
</span><span class="lnt">77
</span><span class="lnt">78
</span><span class="lnt">79
</span><span class="lnt">80
</span><span class="lnt">81
</span><span class="lnt">82
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">elftools.elf.elffile</span> <span class="kn">import</span> <span class="n">ELFFile</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">csv</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">find_function_name</span><span class="p">(</span><span class="n">elf_file</span><span class="p">,</span> <span class="n">address</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">symtab</span> <span class="o">=</span> <span class="n">elf_file</span><span class="o">.</span><span class="n">get_section_by_name</span><span class="p">(</span><span class="s1">&#39;.symtab&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="ow">not</span> <span class="n">symtab</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="nb">print</span><span class="p">(</span><span class="s2">&#34;No symbol table found in the ELF file.&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="kc">None</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="n">symbol</span> <span class="ow">in</span> <span class="n">symtab</span><span class="o">.</span><span class="n">iter_symbols</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">        <span class="n">start_addr</span> <span class="o">=</span> <span class="n">symbol</span><span class="o">.</span><span class="n">entry</span><span class="o">.</span><span class="n">st_value</span>
</span></span><span class="line"><span class="cl">        <span class="n">size</span> <span class="o">=</span> <span class="n">symbol</span><span class="o">.</span><span class="n">entry</span><span class="o">.</span><span class="n">st_size</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="n">start_addr</span> <span class="o">&lt;=</span> <span class="n">address</span> <span class="o">&lt;</span> <span class="n">start_addr</span> <span class="o">+</span> <span class="n">size</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="k">return</span> <span class="n">symbol</span><span class="o">.</span><span class="n">name</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;No function found at address 0x</span><span class="si">{</span><span class="n">address</span><span class="si">:</span><span class="s2">x</span><span class="si">}</span><span class="s2"> in the ELF file.&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="kc">None</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">find_function_address</span><span class="p">(</span><span class="n">elf_file</span><span class="p">,</span> <span class="n">function_name</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">symtab</span> <span class="o">=</span> <span class="n">elf_file</span><span class="o">.</span><span class="n">get_section_by_name</span><span class="p">(</span><span class="s1">&#39;.symtab&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="ow">not</span> <span class="n">symtab</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="nb">print</span><span class="p">(</span><span class="s2">&#34;No symbol table found in the ELF file.&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="kc">None</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="n">symbol</span> <span class="ow">in</span> <span class="n">symtab</span><span class="o">.</span><span class="n">iter_symbols</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="n">symbol</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="n">function_name</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="k">return</span> <span class="n">symbol</span><span class="o">.</span><span class="n">entry</span><span class="o">.</span><span class="n">st_value</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;Function &#39;</span><span class="si">{</span><span class="n">function_name</span><span class="si">}</span><span class="s2">&#39; not found in the ELF file.&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="kc">None</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">read_csv</span><span class="p">(</span><span class="n">file_path</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">file_path</span><span class="p">,</span> <span class="n">mode</span><span class="o">=</span><span class="s1">&#39;r&#39;</span><span class="p">,</span> <span class="n">newline</span><span class="o">=</span><span class="s1">&#39;&#39;</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="s1">&#39;utf-8&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">csv_file</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">csv_reader</span> <span class="o">=</span> <span class="n">csv</span><span class="o">.</span><span class="n">reader</span><span class="p">(</span><span class="n">csv_file</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">header</span> <span class="o">=</span> <span class="nb">next</span><span class="p">(</span><span class="n">csv_reader</span><span class="p">)</span>  <span class="c1"># 读取表头</span>
</span></span><span class="line"><span class="cl">        <span class="n">data</span> <span class="o">=</span> <span class="p">[</span><span class="n">row</span> <span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="n">csv_reader</span><span class="p">]</span>  <span class="c1"># 读取数据</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">header</span><span class="p">,</span> <span class="n">data</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">write_csv</span><span class="p">(</span><span class="n">file_path</span><span class="p">,</span> <span class="n">header</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">file_path</span><span class="p">,</span> <span class="n">mode</span><span class="o">=</span><span class="s1">&#39;w&#39;</span><span class="p">,</span> <span class="n">newline</span><span class="o">=</span><span class="s1">&#39;&#39;</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="s1">&#39;utf-8&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">csv_file</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">csv_reader</span> <span class="o">=</span> <span class="n">csv</span><span class="o">.</span><span class="n">writer</span><span class="p">(</span><span class="n">csv_file</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">csv_reader</span><span class="o">.</span><span class="n">writerow</span><span class="p">(</span><span class="n">header</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">csv_reader</span><span class="o">.</span><span class="n">writerows</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">f</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="s2">&#34;malloc failed/beken7231_bsp.elf&#34;</span><span class="p">,</span> <span class="s2">&#34;rb&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">elffile</span> <span class="o">=</span> <span class="n">ELFFile</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">header</span><span class="p">,</span> <span class="n">data</span> <span class="o">=</span> <span class="n">read_csv</span><span class="p">(</span><span class="s2">&#34;malloc failed/heap.csv&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">f</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">header</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">&#34;func_name&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="n">data</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="n">caller</span> <span class="o">=</span> <span class="n">row</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="k">try</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="c1"># 尝试将十六进制字符串转换为整数</span>
</span></span><span class="line"><span class="cl">        <span class="n">caller</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">caller</span><span class="p">,</span> <span class="mi">16</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">fn</span> <span class="o">=</span> <span class="n">find_function_name</span><span class="p">(</span><span class="n">elffile</span><span class="p">,</span> <span class="n">caller</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">fn</span> <span class="o">=</span> <span class="kc">None</span>
</span></span><span class="line"><span class="cl">    <span class="k">except</span> <span class="ne">TypeError</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">fn</span> <span class="o">=</span> <span class="kc">None</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="c1"># print(caller)</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">fn</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">fn</span> <span class="o">=</span> <span class="s2">&#34;&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="c1"># caller = hex(caller)</span>
</span></span><span class="line"><span class="cl">    <span class="n">row</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">fn</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="c1"># print((caller, fn))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 将使用中的内存过滤出来</span>
</span></span><span class="line"><span class="cl"><span class="n">data2</span> <span class="o">=</span><span class="p">[]</span>
</span></span><span class="line"><span class="cl"><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">data</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">i</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="s2">&#34;U&#34;</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">data2</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">write_csv</span><span class="p">(</span><span class="s2">&#34;malloc failed/heap_U.csv&#34;</span><span class="p">,</span> <span class="n">header</span><span class="p">,</span> <span class="n">data2</span><span class="p">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>处理之后的部分数据</p>
<table>
<thead>
<tr>
<th>state</th>
<th>block_addr</th>
<th>user_addr</th>
<th>caller</th>
<th>blocksize</th>
<th>wanted_size</th>
<th>func_name</th>
</tr>
</thead>
<tbody>
<tr>
<td>U</td>
<td>0x40aaa0</td>
<td>0x40aab0</td>
<td>0x1b959</td>
<td>4120</td>
<td>4096</td>
<td>kfifo_alloc</td>
</tr>
<tr>
<td>U</td>
<td>0x40bab8</td>
<td>0x40bac8</td>
<td>0x1b979</td>
<td>40</td>
<td>20</td>
<td>kfifo_alloc</td>
</tr>
<tr>
<td>U</td>
<td>0x40bae0</td>
<td>0x40baf0</td>
<td>0x1b959</td>
<td>536</td>
<td>512</td>
<td>kfifo_alloc</td>
</tr>
<tr>
<td>U</td>
<td>0x40bcf8</td>
<td>0x40bd08</td>
<td>0x1b979</td>
<td>40</td>
<td>20</td>
<td>kfifo_alloc</td>
</tr>
<tr>
<td>U</td>
<td>0x40bd20</td>
<td>0x40bd30</td>
<td>0x1b959</td>
<td>4120</td>
<td>4096</td>
<td>kfifo_alloc</td>
</tr>
<tr>
<td>U</td>
<td>0x40cd38</td>
<td>0x40cd48</td>
<td>0x1b979</td>
<td>40</td>
<td>20</td>
<td>kfifo_alloc</td>
</tr>
<tr>
<td>U</td>
<td>0x40cd60</td>
<td>0x40cd70</td>
<td>0x1b959</td>
<td>536</td>
<td>512</td>
<td>kfifo_alloc</td>
</tr>
<tr>
<td>U</td>
<td>0x40cf78</td>
<td>0x40cf88</td>
<td>0x1b979</td>
<td>40</td>
<td>20</td>
<td>kfifo_alloc</td>
</tr>
<tr>
<td>U</td>
<td>0x40cfa0</td>
<td>0x40cfb0</td>
<td>0x7e750</td>
<td>104</td>
<td>80</td>
<td>xQueueCreateMutex</td>
</tr>
<tr>
<td>U</td>
<td>0x40d008</td>
<td>0x40d018</td>
<td>0x7e544</td>
<td>104</td>
<td>80</td>
<td>xQueueCreateCountingSemaphore</td>
</tr>
<tr>
<td>U</td>
<td>0x40d070</td>
<td>0x40d080</td>
<td>0x28721</td>
<td>104</td>
<td>80</td>
<td>sys_sem_new</td>
</tr>
<tr>
<td>U</td>
<td>0x40d0d8</td>
<td>0x40d0e8</td>
<td>0x140c3</td>
<td>64</td>
<td>40</td>
<td>cJSON_New_Item</td>
</tr>
<tr>
<td>U</td>
<td>0x40d118</td>
<td>0x40d128</td>
<td>0x839e7</td>
<td>56</td>
<td>8</td>
<td>mm_printf_beacon_ie</td>
</tr>
<tr>
<td>U</td>
<td>0x40d150</td>
<td>0x40d160</td>
<td>0x9f569</td>
<td>32</td>
<td>9</td>
<td>dup_binstr</td>
</tr>
<tr>
<td>U</td>
<td>0x40d170</td>
<td>0x40d180</td>
<td>0x9ffbb</td>
<td>40</td>
<td>22</td>
<td>os_memdup</td>
</tr>
<tr>
<td>U</td>
<td>0x40d198</td>
<td>0x40d1a8</td>
<td>0x7111d</td>
<td>40</td>
<td>9</td>
<td>os_strdup</td>
</tr>
<tr>
<td>U</td>
<td>0x40d1c0</td>
<td>0x40d1d0</td>
<td>0x839e7</td>
<td>64</td>
<td>26</td>
<td>mm_printf_beacon_ie</td>
</tr>
<tr>
<td>U</td>
<td>0x40d200</td>
<td>0x40d210</td>
<td>0x35871</td>
<td>1048</td>
<td>1024</td>
<td>dhcp_server_init</td>
</tr>
<tr>
<td>U</td>
<td>0x40d618</td>
<td>0x40d628</td>
<td>0x285f9</td>
<td>112</td>
<td>92</td>
<td>sys_mbox_new</td>
</tr>
<tr>
<td>U</td>
<td>0x40d688</td>
<td>0x40d698</td>
<td>0x99e45</td>
<td>192</td>
<td>172</td>
<td>wpa_init</td>
</tr>
<tr>
<td>U</td>
<td>0x40d748</td>
<td>0x40d758</td>
<td>0x9bd61</td>
<td>40</td>
<td>22</td>
<td>wpa_auth_gen_wpa_ie</td>
</tr>
<tr>
<td>U</td>
<td>0x40d770</td>
<td>0x40d780</td>
<td>0x99d5b</td>
<td>232</td>
<td>208</td>
<td>wpa_group_init</td>
</tr>
<tr>
<td>U</td>
<td>0x40d858</td>
<td>0x40d868</td>
<td>0x9c23b</td>
<td>72</td>
<td>48</td>
<td>pmksa_cache_auth_init</td>
</tr>
<tr>
<td>U</td>
<td>0x40d8a0</td>
<td>0x40d8b0</td>
<td>0x9ddbb</td>
<td>40</td>
<td>22</td>
<td>hostap_set_generic_elem</td>
</tr>
<tr>
<td>U</td>
<td>0x40d8c8</td>
<td>0x40d8d8</td>
<td>0x9ffbb</td>
<td>48</td>
<td>22</td>
<td>os_memdup</td>
</tr>
</tbody>
</table>
<p>统计函数名字出现的频次，进行分组。</p>
<table>
<thead>
<tr>
<th>func_name</th>
<th>计数项:func_name</th>
</tr>
</thead>
<tbody>
<tr>
<td>add_notifier</td>
<td>1</td>
</tr>
<tr>
<td>ali_iot_open</td>
<td>2</td>
</tr>
<tr>
<td>atsvr_msg_main</td>
<td>1</td>
</tr>
<tr>
<td>cfg_param_init</td>
<td>3</td>
</tr>
<tr>
<td>cJSON_New_Item</td>
<td>99</td>
</tr>
<tr>
<td>cJSON_strdup</td>
<td>120</td>
</tr>
<tr>
<td>cli_init</td>
<td>1</td>
</tr>
<tr>
<td>dhcp_server_init</td>
<td>1</td>
</tr>
<tr>
<td>dup_binstr</td>
<td>2</td>
</tr>
<tr>
<td>eloop_register_signal</td>
<td>1</td>
</tr>
<tr>
<td>eloop_register_sock</td>
<td>1</td>
</tr>
<tr>
<td>eloop_register_timeout</td>
<td>1</td>
</tr>
<tr>
<td>fsocket_init</td>
<td>6</td>
</tr>
<tr>
<td>fsocket_send</td>
<td>1</td>
</tr>
<tr>
<td>handle_probe_req</td>
<td>1</td>
</tr>
<tr>
<td>handle_read</td>
<td>1</td>
</tr>
<tr>
<td>hostap_get_hw_feature_data</td>
<td>6</td>
</tr>
<tr>
<td>hostap_init</td>
<td>1</td>
</tr>
<tr>
<td>hostap_send_mlme</td>
<td>1</td>
</tr>
<tr>
<td>hostap_set_generic_elem</td>
<td>1</td>
</tr>
<tr>
<td>hostapd_add_iface</td>
<td>1</td>
</tr>
<tr>
<td>hostapd_alloc_bss_data</td>
<td>1</td>
</tr>
<tr>
<td>hostapd_alloc_iface</td>
<td>1</td>
</tr>
<tr>
<td>hostapd_config_defaults</td>
<td>3</td>
</tr>
<tr>
<td>hostapd_init</td>
<td>1</td>
</tr>
<tr>
<td>hostapd_main_entry</td>
<td>1</td>
</tr>
<tr>
<td>hostapd_prepare_rates</td>
<td>2</td>
</tr>
<tr>
<td>hostapd_setup_wpa_psk</td>
<td>1</td>
</tr>
<tr>
<td>kfifo_alloc</td>
<td>8</td>
</tr>
<tr>
<td>l2_packet_init</td>
<td>2</td>
</tr>
<tr>
<td>mm_printf_beacon_ie</td>
<td>5</td>
</tr>
<tr>
<td>os_memdup</td>
<td>2</td>
</tr>
<tr>
<td>os_realloc_array</td>
<td>1</td>
</tr>
<tr>
<td>os_strdup</td>
<td>4</td>
</tr>
<tr>
<td>parse_string</td>
<td>10</td>
</tr>
<tr>
<td>pmksa_cache_auth_init</td>
<td>1</td>
</tr>
<tr>
<td>pmksa_cache_init</td>
<td>1</td>
</tr>
<tr>
<td>prvCheckForValidListAndQueue</td>
<td>1</td>
</tr>
<tr>
<td>ql_ssl_ctx_init</td>
<td>6</td>
</tr>
<tr>
<td>rtos_create_thread</td>
<td>28</td>
</tr>
<tr>
<td>rtos_init_queue</td>
<td>8</td>
</tr>
<tr>
<td>rtos_init_timer</td>
<td>2</td>
</tr>
<tr>
<td>supplicant_main_entry</td>
<td>1</td>
</tr>
<tr>
<td>sys_mbox_new</td>
<td>4</td>
</tr>
<tr>
<td>sys_sem_new</td>
<td>5</td>
</tr>
<tr>
<td>sys_thread_new</td>
<td>2</td>
</tr>
<tr>
<td>vTaskStartScheduler</td>
<td>2</td>
</tr>
<tr>
<td>wpa_auth_gen_wpa_ie</td>
<td>1</td>
</tr>
<tr>
<td>wpa_bss_update_scan_res</td>
<td>2</td>
</tr>
<tr>
<td>wpa_config_alloc_empty</td>
<td>1</td>
</tr>
<tr>
<td>wpa_config_read</td>
<td>1</td>
</tr>
<tr>
<td>wpa_driver_init</td>
<td>1</td>
</tr>
<tr>
<td>wpa_group_init</td>
<td>1</td>
</tr>
<tr>
<td>wpa_init</td>
<td>1</td>
</tr>
<tr>
<td>wpa_psk_cache_init</td>
<td>1</td>
</tr>
<tr>
<td>wpa_sm_init</td>
<td>1</td>
</tr>
<tr>
<td>wpa_supplicant_add_iface</td>
<td>2</td>
</tr>
<tr>
<td>wpa_supplicant_init</td>
<td>2</td>
</tr>
<tr>
<td>wpa_supplicant_init_wpa</td>
<td>1</td>
</tr>
<tr>
<td>xQueueCreateCountingSemaphore</td>
<td>10</td>
</tr>
<tr>
<td>xQueueCreateMutex</td>
<td>428</td>
</tr>
<tr>
<td>xTimerCreateTimerTask</td>
<td>2</td>
</tr>
</tbody>
</table>
<p>xQueueCreateMutex 出现的次数最多，xQueueCreateMutex 调用一次分配 104 内存，出现 428 次，也就使用了 40 多 k 的内存一直没释放。</p>
<p>排查代码逻辑，在联网失败的时候进入错误处理，有个互斥锁创建了未销毁，导致内存泄漏。
<img loading="lazy" src="https://github.com/hacperme/picx-images-hosting/raw/master/20240729/image.51e1ygv6zq.webp" alt=""  />
</p>
<h4 id="小结">小结</h4>
<p>内存泄漏的判断方法：</p>
<ol>
<li>功能打开关闭之后，对比前后的 heap info 信息，看看有哪些新增加的内存分配信息，按照这个线索去排查。</li>
<li>挂机压测一段时间之后，打印 heap info 信息，按照 caller 出现的次数排序，出现次数较多的前几个 caller，或者内存申请较多的caller，是该怀疑存在内存泄漏的对象。</li>
</ol>
<h3 id="heap-内存写越界案例">heap 内存写越界案例</h3>
<p>free 的时候检测到内存块被破坏</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">mem corrupt,block:0x422ef8, blocksize:24, xWantedSize:4, caller:0x34747
</span></span><span class="line"><span class="cl">dump block:
</span></span><span class="line"><span class="cl">00000000:  <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">18</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span>  ........
</span></span><span class="line"><span class="cl">00000008:  <span class="m">04</span> <span class="m">00</span> <span class="m">00</span> <span class="m">00</span> <span class="m">47</span> <span class="m">47</span> <span class="m">03</span> <span class="m">00</span>  ....GG..
</span></span><span class="line"><span class="cl">00000010:  <span class="m">48</span> <span class="m">54</span> <span class="m">54</span> <span class="m">50</span> 2F <span class="m">31</span> 2E <span class="m">30</span>  HTTP/1.0
</span></span></code></pre></td></tr></table>
</div>
</div><p>调用者申请了4字节内存空间，分配的内存块大小是24字节，减去头部16字节，后面填充了4字节的0xfd,从dump的内存数据来看，填充的数据都被覆盖完了, 通过 caller:0x34747 查找代码位置</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">FC41D/beken_freertos_sdk_release-SDK_3.0.21 on  Iotbranch <span class="o">[</span>!?⇡<span class="o">]</span> 
</span></span><span class="line"><span class="cl">❯ ./toolchain/gcc-arm-none-eabi-5_4-2016q3/bin/arm-none-eabi-addr2line -e Release/Debug/beken7231_bsp.elf  -f 0x34747
</span></span><span class="line"><span class="cl">fs_open_custom
</span></span><span class="line"><span class="cl">/home/x/FC41D/beken_freertos_sdk_release-SDK_3.0.21/beken378/func/lwip_intf/lwip-2.0.2/src/apps/httpd/custom_fsdata.c:239
</span></span></code></pre></td></tr></table>
</div>
</div><p>对应代码：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span><span class="lnt">38
</span><span class="lnt">39
</span><span class="lnt">40
</span><span class="lnt">41
</span><span class="lnt">42
</span><span class="lnt">43
</span><span class="lnt">44
</span><span class="lnt">45
</span><span class="lnt">46
</span><span class="lnt">47
</span><span class="lnt">48
</span><span class="lnt">49
</span><span class="lnt">50
</span><span class="lnt">51
</span><span class="lnt">52
</span><span class="lnt">53
</span><span class="lnt">54
</span><span class="lnt">55
</span><span class="lnt">56
</span><span class="lnt">57
</span><span class="lnt">58
</span><span class="lnt">59
</span><span class="lnt">60
</span><span class="lnt">61
</span><span class="lnt">62
</span><span class="lnt">63
</span><span class="lnt">64
</span><span class="lnt">65
</span><span class="lnt">66
</span><span class="lnt">67
</span><span class="lnt">68
</span><span class="lnt">69
</span><span class="lnt">70
</span><span class="lnt">71
</span><span class="lnt">72
</span><span class="lnt">73
</span><span class="lnt">74
</span><span class="lnt">75
</span><span class="lnt">76
</span><span class="lnt">77
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">fs_open_custom</span><span class="p">(</span><span class="k">struct</span> <span class="n">fs_file</span> <span class="o">*</span><span class="n">file</span><span class="p">,</span> <span class="k">const</span> <span class="kt">char</span> <span class="o">*</span><span class="n">name</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kt">char</span> <span class="o">*</span><span class="n">wifi_data</span><span class="o">=</span><span class="s">&#34;{</span><span class="se">\&#34;</span><span class="s">aps</span><span class="se">\&#34;</span><span class="s">:[{</span><span class="se">\&#34;</span><span class="s">ssid</span><span class="se">\&#34;</span><span class="s">:</span><span class="se">\&#34;</span><span class="s">123</span><span class="se">\&#34;</span><span class="s">},{</span><span class="se">\&#34;</span><span class="s">ssid</span><span class="se">\&#34;</span><span class="s">:</span><span class="se">\&#34;</span><span class="s">test234</span><span class="se">\&#34;</span><span class="s">}]}&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kt">int</span> <span class="n">file_data_len</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">     <span class="cm">/* this example only provides one file */</span>
</span></span><span class="line"><span class="cl">     <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nf">strcmp</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="s">&#34;/wifilist.html&#34;</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">     <span class="p">{</span>
</span></span><span class="line"><span class="cl">         <span class="cm">/* initialize fs_file correctly */</span>
</span></span><span class="line"><span class="cl">         <span class="nf">memset</span><span class="p">(</span><span class="n">file</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="k">struct</span> <span class="n">fs_file</span><span class="p">));</span>
</span></span><span class="line"><span class="cl">         <span class="n">file_data_len</span> <span class="o">=</span> <span class="nf">strlen</span><span class="p">((</span><span class="kt">char</span> <span class="o">*</span><span class="p">)</span><span class="n">CUSTOM_FSDATA_WIFILIST_HTML_HEADER</span><span class="p">)</span> <span class="o">+</span> <span class="nf">strlen</span><span class="p">(</span><span class="n">wifi_data</span><span class="p">)</span> <span class="o">+</span><span class="mi">2</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">         <span class="n">file</span><span class="o">-&gt;</span><span class="n">pextension</span> <span class="o">=</span> <span class="nf">malloc</span><span class="p">(</span><span class="k">sizeof</span><span class="p">(</span><span class="n">file_data_len</span><span class="p">));</span>
</span></span><span class="line"><span class="cl">         <span class="k">if</span> <span class="p">(</span><span class="n">file</span><span class="o">-&gt;</span><span class="n">pextension</span> <span class="o">!=</span> <span class="nb">NULL</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">         <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="nf">memset</span><span class="p">(</span><span class="n">file</span><span class="o">-&gt;</span><span class="n">pextension</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">file_data_len</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">            <span class="n">file_data_len</span> <span class="o">=</span> <span class="nf">snprintf</span><span class="p">(</span><span class="n">file</span><span class="o">-&gt;</span><span class="n">pextension</span><span class="p">,</span> <span class="n">file_data_len</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="s">&#34;%s%s&#34;</span><span class="p">,</span> <span class="p">(</span><span class="kt">char</span> <span class="o">*</span><span class="p">)</span><span class="n">CUSTOM_FSDATA_WIFILIST_HTML_HEADER</span><span class="p">,</span> <span class="n">wifi_data</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        
</span></span><span class="line"><span class="cl">            <span class="n">file</span><span class="o">-&gt;</span><span class="n">data</span> <span class="o">=</span> <span class="p">(</span><span class="k">const</span> <span class="kt">char</span> <span class="o">*</span><span class="p">)</span><span class="n">file</span><span class="o">-&gt;</span><span class="n">pextension</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">            <span class="n">file</span><span class="o">-&gt;</span><span class="n">len</span> <span class="o">=</span> <span class="n">file_data_len</span><span class="p">;</span> <span class="cm">/* don&#39;t send the trailing 0 */</span>
</span></span><span class="line"><span class="cl">            <span class="n">file</span><span class="o">-&gt;</span><span class="n">index</span> <span class="o">=</span> <span class="n">file</span><span class="o">-&gt;</span><span class="n">len</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">            <span class="cm">/* allow persisteng connections */</span>
</span></span><span class="line"><span class="cl">            <span class="n">file</span><span class="o">-&gt;</span><span class="n">flags</span> <span class="o">=</span> <span class="n">FS_FILE_FLAGS_HEADER_INCLUDED</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">            <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">         <span class="p">}</span>
</span></span><span class="line"><span class="cl">     <span class="p">}</span>
</span></span><span class="line"><span class="cl">     <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="nf">strcmp</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="s">&#34;/index.html&#34;</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">     <span class="p">{</span>
</span></span><span class="line"><span class="cl">         <span class="kt">char</span> <span class="o">*</span><span class="n">sta_state_data</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">         <span class="n">uint32</span> <span class="n">uart_band</span> <span class="o">=</span> <span class="mi">9600</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">         <span class="n">uint8</span> <span class="n">ssid</span><span class="p">[</span><span class="mi">33</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span><span class="mi">0</span><span class="p">};</span>
</span></span><span class="line"><span class="cl">         <span class="n">uint8</span> <span class="n">psk</span><span class="p">[</span><span class="mi">64</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span><span class="mi">0</span><span class="p">};</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">         <span class="kt">int</span> <span class="n">apon</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">         <span class="kt">char</span> <span class="o">*</span><span class="n">ap_state_data</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">         <span class="k">if</span> <span class="p">(</span><span class="nf">custom_fsdata_sta_state</span><span class="p">()</span> <span class="o">==</span> <span class="mi">1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">         <span class="p">{</span>
</span></span><span class="line"><span class="cl">             <span class="n">sta_state_data</span> <span class="o">=</span> <span class="n">CUSTOM_FSDATA_STA_CONNECTED</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">         <span class="p">}</span>
</span></span><span class="line"><span class="cl">         <span class="k">else</span>
</span></span><span class="line"><span class="cl">         <span class="p">{</span>
</span></span><span class="line"><span class="cl">             <span class="n">sta_state_data</span> <span class="o">=</span> <span class="n">CUSTOM_FSDATA_STA_DISCONNECTED</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">         <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">         <span class="nf">custom_sw_ap_cfg_get</span><span class="p">(</span><span class="n">apssid</span><span class="p">,</span> <span class="n">appass</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">apon</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">         <span class="k">if</span> <span class="p">(</span><span class="n">apon</span> <span class="o">==</span> <span class="mi">1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">         <span class="p">{</span>
</span></span><span class="line"><span class="cl">             <span class="n">ap_state_data</span> <span class="o">=</span> <span class="s">&#34;Up&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">         <span class="p">}</span>
</span></span><span class="line"><span class="cl">         <span class="k">else</span>
</span></span><span class="line"><span class="cl">         <span class="p">{</span>
</span></span><span class="line"><span class="cl">             <span class="n">ap_state_data</span> <span class="o">=</span> <span class="s">&#34;Down&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">         <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">         <span class="nf">custom_config_uart_braud_get</span><span class="p">(</span><span class="o">&amp;</span><span class="n">uart_band</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">         <span class="nf">custom_sta_cfg_get</span><span class="p">(</span><span class="n">ssid</span><span class="p">,</span> <span class="n">psk</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">         <span class="cm">/* initialize fs_file correctly */</span>
</span></span><span class="line"><span class="cl">         <span class="nf">memset</span><span class="p">(</span><span class="n">file</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="k">struct</span> <span class="n">fs_file</span><span class="p">));</span>
</span></span><span class="line"><span class="cl">         <span class="n">file_data_len</span> <span class="o">=</span> <span class="nf">strlen</span><span class="p">((</span><span class="kt">char</span> <span class="o">*</span><span class="p">)</span><span class="n">CUSTOM_FSDATA_INDEX_HTML_HEADER</span><span class="p">)</span> <span class="o">+</span> <span class="nf">strlen</span><span class="p">((</span><span class="kt">char</span> <span class="o">*</span><span class="p">)</span><span class="n">CUSTOM_FSDATA_INDEX_HTML_FILE_FMT</span><span class="p">)</span> <span class="o">+</span> <span class="mi">10</span> <span class="cm">/* for uart band */</span> <span class="o">+</span> <span class="nf">strlen</span><span class="p">((</span><span class="kt">char</span> <span class="o">*</span><span class="p">)</span><span class="n">ssid</span><span class="p">)</span> <span class="o">+</span> <span class="nf">strlen</span><span class="p">(</span><span class="n">ap_state_data</span><span class="p">)</span> <span class="o">+</span> <span class="nf">strlen</span><span class="p">(</span><span class="n">sta_state_data</span><span class="p">)</span> <span class="o">+</span> <span class="nf">strlen</span><span class="p">((</span><span class="kt">char</span> <span class="o">*</span><span class="p">)</span><span class="n">apssid</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span> <span class="cm">/* \0 */</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">         <span class="n">file</span><span class="o">-&gt;</span><span class="n">pextension</span> <span class="o">=</span> <span class="nf">malloc</span><span class="p">(</span><span class="k">sizeof</span><span class="p">(</span><span class="n">file_data_len</span><span class="p">));</span>
</span></span><span class="line"><span class="cl">         <span class="k">if</span> <span class="p">(</span><span class="n">file</span><span class="o">-&gt;</span><span class="n">pextension</span> <span class="o">!=</span> <span class="nb">NULL</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">         <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="nf">memset</span><span class="p">(</span><span class="n">file</span><span class="o">-&gt;</span><span class="n">pextension</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">file_data_len</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">            <span class="n">file_data_len</span> <span class="o">=</span> <span class="nf">snprintf</span><span class="p">(</span><span class="n">file</span><span class="o">-&gt;</span><span class="n">pextension</span><span class="p">,</span> <span class="n">file_data_len</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="kt">char</span> <span class="o">*</span><span class="p">)</span><span class="n">CUSTOM_FSDATA_INDEX_HTML_FILE_FMT</span><span class="p">,</span> <span class="p">(</span><span class="kt">char</span> <span class="o">*</span><span class="p">)</span><span class="n">CUSTOM_FSDATA_INDEX_HTML_HEADER</span><span class="p">,</span> <span class="p">(</span><span class="kt">char</span> <span class="o">*</span><span class="p">)</span><span class="n">ssid</span><span class="p">,</span> <span class="n">sta_state_data</span><span class="p">,</span> <span class="p">(</span><span class="kt">char</span> <span class="o">*</span><span class="p">)</span><span class="n">apssid</span><span class="p">,</span> <span class="n">ap_state_data</span><span class="p">,</span> <span class="n">uart_band</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        
</span></span><span class="line"><span class="cl">            <span class="n">file</span><span class="o">-&gt;</span><span class="n">data</span> <span class="o">=</span> <span class="p">(</span><span class="k">const</span> <span class="kt">char</span> <span class="o">*</span><span class="p">)</span><span class="n">file</span><span class="o">-&gt;</span><span class="n">pextension</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">            <span class="n">file</span><span class="o">-&gt;</span><span class="n">len</span> <span class="o">=</span> <span class="n">file_data_len</span><span class="p">;</span> <span class="cm">/* don&#39;t send the trailing 0 */</span>
</span></span><span class="line"><span class="cl">            <span class="n">file</span><span class="o">-&gt;</span><span class="n">index</span> <span class="o">=</span> <span class="n">file</span><span class="o">-&gt;</span><span class="n">len</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">            <span class="cm">/* allow persisteng connections */</span>
</span></span><span class="line"><span class="cl">            <span class="n">file</span><span class="o">-&gt;</span><span class="n">flags</span> <span class="o">=</span> <span class="n">FS_FILE_FLAGS_HEADER_INCLUDED</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">            <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">         <span class="p">}</span>
</span></span><span class="line"><span class="cl">     <span class="p">}</span>
</span></span><span class="line"><span class="cl">     <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>file-&gt;pextension = malloc(sizeof(file_data_len)); 传的参数传错了，sizeof(file_data_len) 是4字节，实际需要申请 file_data_len 字节，导致后面内存写越界了。</p>
]]></content:encoded>
    </item>
    <item>
      <title>C 的结构体成员在内存中的存储顺序以及对硬件的描述能力</title>
      <link>https://hacperme.com/posts/notes/20230719_c_struct_memory/</link>
      <pubDate>Wed, 19 Jul 2023 00:05:17 +0800</pubDate>
      <guid>https://hacperme.com/posts/notes/20230719_c_struct_memory/</guid>
      <description>介绍 c 语言是如何通过指针、结构体、联合体、位域等这些语法来描述硬件的。</description>
      <content:encoded><![CDATA[<h2 id="c-语言结构体成员和位域在内存中的存储方式">c 语言结构体成员和位域在内存中的存储方式</h2>
<p>在小端存储的机器上，C编译器对结构体的成员按它们的声明顺序从低到高的地址进行存储，先定义的成员存储在内存的低地址，使用位域的时候也是类似，先定义的成员先占用低比特位。</p>
<h2 id="c-语言怎么描述硬件寄存器">c 语言怎么描述硬件寄存器？</h2>
<p>通常硬件寄存器会映射到一段特定的内存地址，我们可以通过指针来访问和修改寄存器的内容。每个寄存器的功能不一定相同，需要根据硬件手册来具体定义。下面以某个芯片平台的 pwm 控制寄存器为例，说明如何使用 c 语言描述硬件寄存器。</p>
<p><img loading="lazy" src="https://github.com/hacperme/picx_hosting/raw/master/20210507/image-20230719011111212.5buks5rpf3c0.webp" alt=""  />
</p>
<p>这个平台有 4 个 pwm 外设，控制寄存器的基址分别是 0xD401A000，0xD401A400，0xD401A800 ，0xD401AC00，然后每个 pwm 有三个 32 位 的寄存器，分别是 PWM_CRx，PWM_DCR，PWM_PCR。在这三个寄存器里面，不同的 bit 范围之间又控制着不同的功能。在 c 语言里面，可通过联合体、结构体和位域来定义这些寄存器的功能。</p>
<p>三个 pwm 控制寄存器的基地址:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;stdint.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#define  PWM0_BASE (0xD401A000)
</span></span></span><span class="line"><span class="cl"><span class="cp">#define  PWM1_BASE (0xD401A400)
</span></span></span><span class="line"><span class="cl"><span class="cp">#define  PWM2_BASE (0xD401A800)
</span></span></span><span class="line"><span class="cl"><span class="cp">#define  PWM3_BASE (0xD401AC00)
</span></span></span></code></pre></td></tr></table>
</div>
</div><p>每个 pwm 有三个寄存器， PWM_CRx，PWM_DCR，PWM_PCR，与偏移地址对应，4字节递增:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="k">typedef</span> <span class="k">volatile</span> <span class="k">struct</span> 
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kt">uint32_t</span> <span class="n">PWM_CRx</span><span class="p">;</span>   <span class="cm">/*Offset: 0x00*/</span>
</span></span><span class="line"><span class="cl">    <span class="kt">uint32_t</span> <span class="n">PWM_DCR</span> <span class="p">;</span>  <span class="cm">/*Offset: 0x04*/</span>
</span></span><span class="line"><span class="cl">    <span class="kt">uint32_t</span> <span class="n">PWM_PCR</span> <span class="p">;</span>  <span class="cm">/*Offset: 0x08*/</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span><span class="n">PWM_HW_T</span><span class="p">;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>将 pwm 寄存器地址转换为 PWM_HW_T * 类型的指针，方便通过指针对数据进行读写:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="cp">#define HW_PWM0 ((PWM_HW_T *)(PWM0_BASE))
</span></span></span><span class="line"><span class="cl"><span class="cp">#define HW_PWM1 ((PWM_HW_T *)(PWM1_BASE))
</span></span></span><span class="line"><span class="cl"><span class="cp">#define HW_PWM2 ((PWM_HW_T *)(PWM2_BASE))
</span></span></span><span class="line"><span class="cl"><span class="cp">#define HW_PWM3 ((PWM_HW_T *)(PWM3_BASE))
</span></span></span></code></pre></td></tr></table>
</div>
</div><p>每个寄存器的功能定义:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="c1">// PWM_CRx 寄存器定义
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">typedef</span> <span class="k">union</span> 
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kt">uint32_t</span> <span class="n">v</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">struct</span> 
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="kt">uint32_t</span> <span class="nl">PRESCALE</span> <span class="p">:</span> <span class="mi">6</span><span class="p">;</span>  <span class="c1">//[5:0]
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>        <span class="kt">uint32_t</span> <span class="nl">SD</span> <span class="p">:</span> <span class="mi">1</span><span class="p">;</span>        <span class="c1">//[6]
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>        <span class="kt">uint32_t</span> <span class="nl">Reserved</span> <span class="p">:</span><span class="mi">25</span><span class="p">;</span>  <span class="c1">//[31:7]
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="p">}</span><span class="n">d</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span><span class="n">REG_PWM_CRx_T</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// PWM_DCR 寄存器定义
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">typedef</span> <span class="k">union</span> 
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kt">uint32_t</span> <span class="n">v</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">struct</span> 
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="kt">uint32_t</span> <span class="nl">DCYCLE</span> <span class="p">:</span> <span class="mi">10</span><span class="p">;</span>   <span class="c1">//[9:0]
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>        <span class="kt">uint32_t</span> <span class="nl">FD</span> <span class="p">:</span><span class="mi">1</span><span class="p">;</span>         <span class="c1">//[10]
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>        <span class="kt">uint32_t</span> <span class="nl">Reserved</span> <span class="p">:</span><span class="mi">21</span><span class="p">;</span>  <span class="c1">//[31:11]
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="p">}</span><span class="n">d</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span><span class="n">REG_PWM_DCR_T</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// PWM_PCR 寄存器定义
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">typedef</span> <span class="k">union</span> 
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kt">uint32_t</span> <span class="n">v</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">struct</span> 
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="kt">uint32_t</span> <span class="nl">PV</span> <span class="p">:</span> <span class="mi">10</span><span class="p">;</span>     	<span class="c1">//[9:0]
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>        <span class="kt">uint32_t</span> <span class="nl">Reserved</span> <span class="p">:</span><span class="mi">22</span><span class="p">;</span>  <span class="c1">//[31:10]
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="p">}</span><span class="n">d</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span><span class="n">REG_PWM_PCR_T</span><span class="p">;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>操作 pwm 寄存器示例，读和写寄存器都可以通过指针操作实现:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">PWM0_Init</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">PWM_HW_T</span> <span class="o">*</span><span class="n">PWM</span> <span class="o">=</span> <span class="n">HW_PWM0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="n">REG_PWM_CRx_T</span> <span class="n">PWM_CRx</span> <span class="o">=</span> <span class="p">{</span><span class="mi">0</span><span class="p">};</span>
</span></span><span class="line"><span class="cl">    <span class="n">REG_PWM_DCR_T</span> <span class="n">PWM_DCR</span> <span class="o">=</span> <span class="p">{</span><span class="mi">0</span><span class="p">};</span>
</span></span><span class="line"><span class="cl">    <span class="n">REG_PWM_PCR_T</span> <span class="n">PWM_PCR</span> <span class="o">=</span> <span class="p">{</span><span class="mi">0</span><span class="p">};</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">PWM_CRx</span><span class="p">.</span><span class="n">d</span><span class="p">.</span><span class="n">PRESCALE</span> <span class="o">=</span> <span class="mh">0x3F</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="n">PWM_CRx</span><span class="p">.</span><span class="n">d</span><span class="p">.</span><span class="n">SD</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="n">PWM_CRx</span><span class="p">.</span><span class="n">d</span><span class="p">.</span><span class="n">Reserved</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// 写  pwm0 的 PWM_CRx 寄存器
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="n">PWM</span><span class="o">-&gt;</span><span class="n">PWM_CRx</span> <span class="o">=</span> <span class="n">PWM_CRx</span><span class="p">.</span><span class="n">v</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	
</span></span><span class="line"><span class="cl">    <span class="c1">// 读 pwm0 的 PWM_DCR 寄存器
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="n">PWM_DCR</span><span class="p">.</span><span class="n">v</span> <span class="o">=</span> <span class="n">PWM</span><span class="o">-&gt;</span><span class="n">PWM_DCR</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">PWM_PCR</span><span class="p">.</span><span class="n">d</span><span class="p">.</span><span class="n">PV</span> <span class="o">=</span> <span class="mh">0x3FF</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="n">PWM_PCR</span><span class="p">.</span><span class="n">d</span><span class="p">.</span><span class="n">Reserved</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="n">PWM</span><span class="o">-&gt;</span><span class="n">PWM_PCR</span> <span class="o">=</span> <span class="n">PWM_PCR</span><span class="p">.</span><span class="n">v</span><span class="p">;</span> 
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div>]]></content:encoded>
    </item>
    <item>
      <title>使用 gcc 内置接口获取当前函数的返回地址</title>
      <link>https://hacperme.com/posts/notes/20230527_gcc_get_caller_adders/</link>
      <pubDate>Sat, 27 May 2023 09:09:15 +0800</pubDate>
      <guid>https://hacperme.com/posts/notes/20230527_gcc_get_caller_adders/</guid>
      <description>c 代码中获取当前函数的返回地址方法</description>
      <content:encoded><![CDATA[<p>作为调试目的，有时候可能需要获取当前函数的调用者信息，比如在 malloc 申请一块内存的时候，记录 caller 的地址，当发生内存泄漏或者内存破坏时，可以使用 caller 地址大致定位是哪块代码有问题。</p>
<p>我们可以通过 GCC 的内置接口<code>void *</code> <strong>__builtin_return_address</strong> <code>(unsigned int level)</code> 获取当前函数的返回地址，也就是调用者。
参数 level 表示扫描的栈帧层级，0 表示返回当前函数的返回地址，1 便是当前函数的调用者的返回地址，以此类推。</p>
<p>测试代码</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">test_return</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="nf">shell_printf</span><span class="p">(</span><span class="s">&#34;test return</span><span class="se">\r\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="kt">void</span> <span class="o">*</span><span class="n">p</span> <span class="o">=</span>  <span class="nf">__builtin_return_address</span> <span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="nf">shell_printf</span><span class="p">(</span><span class="s">&#34;1 %p</span><span class="se">\r\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">p</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="n">p</span> <span class="o">=</span> <span class="nf">__builtin_extract_return_addr</span> <span class="p">(</span><span class="nf">__builtin_return_address</span> <span class="p">(</span><span class="mi">0</span><span class="p">));</span>
</span></span><span class="line"><span class="cl">	<span class="nf">shell_printf</span><span class="p">(</span><span class="s">&#34;2 %p</span><span class="se">\r\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">p</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">test_return1</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="nf">test_return</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">	<span class="nf">shell_printf</span><span class="p">(</span><span class="s">&#34;test return</span><span class="se">\r\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="cm">/**
</span></span></span><span class="line"><span class="cl"><span class="cm"> * @brief test command
</span></span></span><span class="line"><span class="cl"><span class="cm"> */</span>
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">shell_test_cmd</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="kt">char</span> <span class="o">*</span><span class="n">argv</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="kt">unsigned</span> <span class="kt">int</span> <span class="n">i</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="nf">shell_printf</span><span class="p">(</span><span class="s">&#34;test command:</span><span class="se">\r\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="k">for</span> <span class="p">(</span><span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">argc</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nf">shell_printf</span><span class="p">(</span><span class="s">&#34;paras %d: %s</span><span class="se">\r\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span> <span class="o">&amp;</span><span class="p">(</span><span class="n">argv</span><span class="p">[(</span><span class="kt">int</span><span class="p">)</span><span class="n">argv</span><span class="p">[</span><span class="n">i</span><span class="p">]]));</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">	<span class="nf">test_return1</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">	<span class="kt">void</span> <span class="o">*</span><span class="n">p</span> <span class="o">=</span> <span class="n">test_return1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="nf">shell_printf</span><span class="p">(</span><span class="s">&#34;%p</span><span class="se">\r\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">p</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">nr@root:test
</span></span><span class="line"><span class="cl"><span class="nb">test</span> command:
</span></span><span class="line"><span class="cl">paras 0: <span class="nb">test</span>
</span></span><span class="line"><span class="cl"><span class="nb">test</span> <span class="k">return</span>
</span></span><span class="line"><span class="cl"><span class="m">1</span> 004EADA6
</span></span><span class="line"><span class="cl"><span class="m">2</span> 004EADA6
</span></span><span class="line"><span class="cl"><span class="nb">test</span> <span class="k">return</span>
</span></span><span class="line"><span class="cl">004EAFB0
</span></span></code></pre></td></tr></table>
</div>
</div><p>004EADA6 是 test_return 的返回地址。004EAFB0 是直接打印的函数地址，是 test_return 的入口地址。然后通过 addr2line.exe 验证这两个地址。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">D:<span class="se">\w</span>orkspace<span class="se">\Q</span>T<span class="se">\q</span>t_idf<span class="se">\e</span>xamples<span class="se">\s</span>hell&gt;D:<span class="se">\w</span>orkspace<span class="se">\Q</span>T<span class="se">\q</span>t_idf<span class="se">\t</span>ools<span class="se">\m</span>ingw32<span class="se">\b</span>in<span class="se">\a</span>ddr2line.exe -e D:/workspace/QT/qt_idf/examples/shell/build/build_out/target/shell.exe -f 004EADA6 004EAFB0
</span></span><span class="line"><span class="cl">test_return1
</span></span><span class="line"><span class="cl">D:/workspace/QT/qt_idf/examples/shell/cmds/cmds.c:56
</span></span><span class="line"><span class="cl">test_return1
</span></span><span class="line"><span class="cl">D:/workspace/QT/qt_idf/examples/shell/cmds/cmds.c:54
</span></span></code></pre></td></tr></table>
</div>
</div><p>004EADA6 是 test_return1 中第 56 行代码位置，004EAFB0 是 test_return1 中第 54 行代码位置。
<img loading="lazy" src="https://github.com/hacperme/picx_hosting/raw/master/20210507/image.2lbwjc2df7s0.webp" alt=""  />
</p>
<p>另外，使用 addr2line.exe 还碰到出现 dwarf error: could not find abbrev number 108. 问题，原因是编译的时候没有打开调试信息，在编译配置中增加 -g3 即可解决。</p>
]]></content:encoded>
    </item>
  </channel>
</rss>
