毅沣音响音视频 發表於 2024-3-20 00:00:00

浅谈在linux kernel中打印函数调用的堆栈的方法

<p>
        在Linux内核调试中,经常用到的打印函数调用堆栈的方法非常简单,只需在需要查看堆栈的函数中加入:</p>
<p>
        <strong>dump_stack(); 或 __backtrace(); 即可</strong></p>
<p>
        <span><strong>dump_stack()在~/kernel/ lib/Dump_stack.c中定义</strong></span></p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterxhtml" id="highlighter_566617">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                        <div class="line number6 index5 alt1">
                                                                6</div>
                                                        <div class="line number7 index6 alt2">
                                                                7</div>
                                                        <div class="line number8 index7 alt1">
                                                                8</div>
                                                        <div class="line number9 index8 alt2">
                                                                9</div>
                                                        <div class="line number10 index9 alt1">
                                                                10</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="xhtml plain">void dump_stack(void)</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="xhtml plain">{</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="xhtml spaces"> </code><code class="xhtml plain">printk(KERN_NOTICE</code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="xhtml spaces"> </code><code class="xhtml plain">"This architecture does not implement dump_stack()/n");</code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="xhtml plain">}</code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="xhtml plain">__backtrace()的定义在~/kernel/arch/arm/lib/backtrace.S中</code>
</div>
                                                                <div class="line number7 index6 alt2">
                                                                        <code class="xhtml spaces"> </code>
</div>
                                                                <div class="line number8 index7 alt1">
                                                                        <code class="xhtml plain">ENTRY(__backtrace)</code>
</div>
                                                                <div class="line number9 index8 alt2">
                                                                        <code class="xhtml spaces"> </code><code class="xhtml plain">mov r1, #0x10</code>
</div>
                                                                <div class="line number10 index9 alt1">
                                                                        <code class="xhtml spaces"> </code><code class="xhtml plain">mov r0, fp</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        在linux应用程序调试中,使用的方法是:</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterxhtml" id="highlighter_70468">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="xhtml plain">backtrace</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="xhtml plain">backtrace_symbols</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        可以在函数中加入如下代码:</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterxhtml" id="highlighter_100292">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                        <div class="line number6 index5 alt1">
                                                                6</div>
                                                        <div class="line number7 index6 alt2">
                                                                7</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="xhtml plain">void *bt; </code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="xhtml spaces"> </code><code class="xhtml plain">char **strings; </code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="xhtml spaces"> </code><code class="xhtml plain">size_t sz;</code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="xhtml spaces"> </code><code class="xhtml plain">sz = backtrace(bt, 20); </code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="xhtml spaces"> </code><code class="xhtml plain">strings = backtrace_symbols(bt, sz); </code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="xhtml spaces">    </code><code class="xhtml plain">for(i = 0; i &lt; sz; ++i) </code>
</div>
                                                                <div class="line number7 index6 alt2">
                                                                        <code class="xhtml spaces">        </code><code class="xhtml plain">fprintf(stderr, "%s/n", strings);</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        以上就是小编为大家带来的浅谈在linux kernel中打印函数调用的堆栈的方法全部内容了,希望大家多多支持~</p>
頁: [1]
查看完整版本: 浅谈在linux kernel中打印函数调用的堆栈的方法