浅谈在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 < 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]