linux下追踪函数调用堆栈 一般察看函数运行时堆栈的方法是使用GDB之类的外部调试器,但是,有些时候为了分析程序的BUG,(主要针对长时间运行程序的分析),在程序出错时打印出函数的调用堆栈是非常有用的。 在头文件"execinfo.h"中声明了三个函数用于获取当前线程的函数调用堆栈 Function: int backtrace(void **buffer,int size) 该函数用与获取当前线程的调用堆栈,获取的信息将会被存放在buffer中,它是一个指针列表。参数 size 用来指...
by soqsoq - Linux文档专区 - 2010-01-13 16:35:49 阅读(1911) 回复(0)
通过 tftp uimage, bootm 启动arm 单板linux, 发现随着 uimage 增大超过2M 启动时间突然变长, 初步定位, 怀疑是在解压时 zlib_inflate 函数费时较长 但具体多长未知, 试图通过添加 计时 来获取详细时间长度 直接在 zlib_inflate 使用 get_jiffies_64 ( #include <linux/jiffies.h> )报错 求助, 如何对 单板linux的启动进行精确计时? 如何对 解压部分进行计时?
前言 对于每个C 语言开发者来说中,内存错误(内存泄漏,内存越界,野指针,空指针等)恐怕是再熟悉不过了。这些错误通常严重级别很高,隐藏很深而且会产生随机错误,即便在很多调试工具的帮助下,为了找到重现的路径,也需要花费大量的时间。对于uClinux来说,情况就更糟糕了,那些在x86上能够导致程序退出的错误,在uClinux中大多数情况下并不会退出而只是产生奇怪的运行结果. 我们知道,这类错误尽管可以在编码时尽量减少却无...
堆栈寻址的命令LDMFA/STMFA、LDMEA/STMEA、LDMFD/STMFD、LDMED/STMED。 LDM和STM表示多寄存器寻址,即一次可以传送多个寄存器值。 LDM:一次装载多个,这里用来出栈。 STM:一次存储多个,这里用来入栈。 F/E表示指针指向的位置 F:full满堆栈,表示堆栈指针指向最后一个入栈的有效数据项。 E:empty空堆栈,表示堆栈指针指向下一个要放入的空地址。 A/D表示堆栈的生长方式 A:堆栈向高地址生长,即递增堆栈。 D:堆栈向低地址生长...
MACRO $HandlerLabel HANDLER $HandleLabel $HandlerLabel sub sp, sp, #4 stmfd sp!, {r0} ldr r0,=$HandleLabel ldr r0,[r0] str r0,[sp,#4] ldmfd sp!,{r0,pc} MEND 这是一个BSP启动段的汇编代码,实现了一个宏定义,我看不懂的是sub sp,sp,#4 这一句,为什么刚开始要sub一下啊,还有sp!指的是加4还是减4啊,一般的压栈好像是减4的,请大家帮助!谢谢
RAM (DRAM) * * 0xC200 0000 +------------------------------------+ * | boot loader (size: 1M) | * 0xC1F0 0000 +------------------------------------+ * | heap area (size: 1M) | * 0xC1E0 0000 +------------------------------------+ * | mmu table (size: 16k) | * 0xC1DF C000 +------------------------------------+...
本帖最后由 yshihyu 于 2013-08-07 00:07 编辑
[code]#include
书上有 ldr sp, =0x34000000 这条语句,是在转跳到C语言程序之前先设置堆栈的,设置sp指向SDRAM的顶部,但是64M的SDRAM的地址空间是 0x30000000-0x33FFFFFF啊,所以那个sp指针的设置对不对啊?我觉得0x33FFFFFF才是SDRAM的顶部地址啊,所以sp应该等于0x33FFFFFF啊,谁能帮我解释下,
下面这段代码是从entry-armv.s中的摘抄的,其中vector_\name后进入的是中断的通用代码 [code] .macro vector_stub, name, mode, correction=0 .align 5 vector_\name: .if \correction sub lr, lr, #\correction .endif @ @ Save r0, lr_ (parent PC) and spsr_ @ (parent CPSR) @ stmia sp, {r0,...
在uboot的start.s中有这样一个宏定义: MACRO $HandlerLabel HANDLER $HandleLabel $HandlerLabel sub sp,sp,#4 ;decrement sp(to store jump address) stmfd sp!,{r0} ldr r0,=$HandleLabel ;load the address of HandleXXX to r0 ldr r0,[r0] str r0,[sp,#4] ;store the contents(ISR) of HandleXXX to stack ldmfd sp!,{r0,pc} ...
zu 作为硬件平台,arm和x86是比较有代表性的两个了。而在bootloader或操作系统编程方面,堆栈/参数传递/返回值是系统编程常常关注的一些内 容,对比他们的差异对理解操作系统会有所帮助 1 返回值:1) X86采用eax作为返回值。 return i; 23: c7 45 08 1e 00 00 00 movl $0x1e,0x8(%ebp) 2a: 8b 45 08 mov 0x8(%ebp),%eax 2d: 89 c0 mov %eax,%eax 2) arm使用r...