如何打印内核调用堆栈及函数名

3) malloc内存默认值

static void

backtrace函数 backtrace函数系统调用backtrace函数 backtrace函数系统调用


backtrace函数 backtrace函数系统调用


__report_bad_irq(unsigned int irq, struct irq_desc desc,

irqreturn_t action_ret)

{struct irqaction action;

if (action_ret != IRQ_HANDLED && action_ret != IRQ_NONE) {

printk(KERN_ERR "irq nt %d: bogus return value %xn",

irq, action_ret);

} else {

printk(KERN_ERR "irq %d: nobody cared (try booting with "

"the "irqpoll" option)n", irq);

}dump_stack();

action = desc->action;

while (action) {

printk(KERN_ERR "[<%p>]", action->handler);

print_symbol(" (%s)",

(unsigned long)action->handler);

printk("n");

action = action->next;

}}

==========================================================================================

Backtrace:

[] (dump_backtrace+0x0/0x104) from [] (dump_stack+0x18/0x1c)

r7:00000000 r6:00000040 r5:00000000 r4:c02dec10

[] (dump_stack+0x0/0x1c) from [] (__report_bad_irq+0x38/0x94

)[] (__report_bad_irq+0x0/0x94) from [] (note_interrupt+0x16c

/0x1e0)guard[=SIZE_BYTES] Enables both a front guard and a rear guard on all allocations.

r4:c[] (note_interrupt+0x0/0x1e0) from [] (handle_edge_irq+0x13002dec10

/0x150)

8+0x94/0xa4)

Linux下realloc()函数内存分配问题

libc在初始化时会调用MallocInitImp这样会检测内存覆盖等检测l判断属性来加载debug so,调用InitMallocFunctions替换掉Libc原生的内存分配和释放函数。

内存鞋漏了,有可能是你relloc失败,但是你没有判断,

irq 64: nobody cared (try booting with the "irqpoll" option)

返回NULL:当没有足够的空间可供扩展的时候。此时,原内存空间的大小维持不变。

如何从目标代码、DDB backtrace找到崩溃的原因

返回NULL:当需要扩展的大小(第二个参数)为0并且个参数不为NULL时。此时原内存变成“free(游离)1) 内存边界检查”的了。

今天复习了一次…… ,你需要源代码编译出来的包含调试符号的目标代码。 第二,backtrace中的内容要尽可能完整。 一般来说,DDB backtrace中会包含函数的名字,然而,它并不能提供更多的信息,例如变量名称,对应的源代码行等等。DDB被设计为尽可能简单,以避免在调试内核时引发崩溃,从而导致不得不丢开内核,开始调试调试器的尴尬局面。 另一个不能忽略的影响,便是C/C++编译器的优化功能可能引发的代码混淆。许多时候,编译器给出的代码可能并不那么直截了当,有几种比较常见的优化: - 循环展开。有时循环会被自动展开,以减少处理器的分支预测带来的消耗。 - 内联展开。内联函数可能会在调用处展开。尽管函数调用很“便宜”,但有时编译器会通过将函数内联展开以期避免不必要得快取缓存刷洗效应。 - 寄存器的使用。编译器会尽可能利用寄存器,以避免(昂贵的)内存作。 这些都会使汇编代码的样式与C元程序产生非常大的异。 因此,在无法动态调试的时候,特别是当只能拿到DDB Backtrace的时候,需要一些方法来迅速完成问题的定位。下面我来介绍一些我本人的实际经验,希望能够抛砖引玉: 1. 通过objdump拿到汇编代码。 方法是objdump -D,这个不必多说。 2. 找到代码的位置(DDB的backtrace会告诉你 函数名+偏移 的地址)。 当使用objdump处理.o文件时,我们可以找到函数的入口地址,并计算出加上偏移量之后对应的地址。 3. 寻找汇编代码中前后的特征值。 如果你对编译器和代码都足够熟悉,以至于可以徒手把C程序编译成汇编代码的话,当然会不需要这样做。没有这种功力的话,我们可以用一些小技巧,例如寻找特征值。 总体而言,内核中所发生的无头命案多以内存访问越界(Kernel Trap 12)告终。这类问题最常见的引发条件,则是触动无效指针(Invalid pointer defrencing)。例如下列代码:%%%if (vp->vp_state & F_DONE) { / do soming /}如果vp包含一无效值,则会引致崩溃。 现在我们有了两项特征:,我们通常可以在崩溃的附近找到->;第二,这类问题本身多出现于判断,或周围存在判断。上面的例子中,&会最终被翻译为一test[bl]指令。 发现崩溃果然是这样一个点,printk(KERN_ERR "handlers:n");于是,查找代码中包含->和&的if语句(从objdump发现它下面有一je,因此一定是判断性的语句。 找到上述语句段后,应继续观察前后的语句。 确定位置之后,就比较容易人为制造或重现问题了。 接下来的问题就是KASSERT和printf。当然,想要更迅速准确地找到问题,还需要非常多的实践练习才可以。

Android malloc_debug介绍

[] (handle_edge_irq+0x0/0x150) from [] (s3c_irq_demux_extint

android 的libc中有malloc_debug的hook调用,我们可以使用malloc_debug中的hook函数对内存分配进行跟踪加测。

比如在完成注册后,调用FinishInstallHooks,initialize,将finalize注册到process退出时。

malloc_debug主要包含的功能如下:

2) 支持内存边界,可以在申请的内存头部和尾部添加guard,内存越界检查,use after free,内存崩溃检查等。

3) 调用栈跟踪和打印,跟踪内存分配的同时保存内存分配的调用栈,方便内存泄漏检查。

1) 开启malloc_debug

adb shell setprop libc.debug.malloc.program

除了内存分配和释放,常见如下:

front_guard[=SIZE_BYTES]Enables a all buffer placed before the allocated data.

rear_guard[=SIZE_BYTES] Enables a all buffer placed after the allocated data.

主要原理是在分配内存的头部和尾部添加一段数据,作为边界,头部初始化为0xaa,尾部初始化为0xbb。

2)调用栈功能

backtrace[=MAX_FRAMES]

backtrace_dump_on_exitbacktrace_enable_on_signal[=MAX_FRAMES]

backtrace_dump_prefix

backtrace_full

设置保存的调用栈个数,在信号量或者退出时打印调用栈

fill_on_alloc[=MAX_FILLED_BYTES] size will be set to 0xeb.

fill_on_free[=MAX_FILLED_BYTES] When an allocation is freed, fill it with 0xef.

fill[=MAX_FILLED_BYTES] This enables both the fill_on_alloc option and the fill_on_free option.

expand_alloc[=EXPAND_BYTES] Add an extra amount to allocate for ry allocation.

1) 内存泄漏检测

在shell命令下执行 #setprop libc.debug.malloc.options "backtrace leak_track verbose"

这样开启后在进程退出时会打印leak信息,在发送kill -47时会打印当前内存申请

2) 内存崩溃检查

在shell命令中添加guard #setprop libc.debug.malloc.options "backtrace leak_track verbose guard"

3) verify_pointers 开启可以检测use after free和double free等作