《韦东山-实现coredump查看任意线程执行状态.pptx》由会员分享,可在线阅读,更多相关《韦东山-实现coredump查看任意线程执行状态.pptx(15页珍藏版)》请在三个皮匠报告上搜索。
1、实现coredump查看任意线程执行状态 韦东山,内容:coredump命令视频演示coredump概念与作用在RTT实现coredump的原理代码速览移植、使用方法,Timer的作用,coredump命令视频演示,Timer的作用,coredump概念与作用,1.概念,Coredump(核心转储)的起源于Unix操作系统,在Linux等类UNIX系统中应用广泛。随着RTOS的兴起,在各类RTOS中也有应用。它的含义为:程序因致命错误(如段错误、除零等)崩溃时,操作系统将进程的内存镜像、寄存器状态及堆栈信息保存为文件,便于事后调试。,2.作用,a.程序崩溃时,根据coredump信息查看发生崩
2、溃时的状态 比如:出错位置、各个寄存器的值、局部变量的值、全局变量的值、函数调用链b.即使程序没有崩溃,也可以查看各个进程、线程的运行状态 比如:查看某个线程卡在哪里,查看哪个线程陷入了死循环,Timer的作用,在RTT实现coredump的原理,1.当前线程信息保存在哪里?,假设时间能停止,线程A在某个时刻,它的各类信息保存在哪里?a.各个变量:保存在内存里,或者保存在寄存器里b.函数调用关系:保存在栈里,栈也是内存c.当前运行到了哪里:在CPU的PC寄存器里,Timer的作用,在RTT实现coredump的原理,2.其他线程信息保存在哪里?,从线程A切换到现场B,线程A的“现场”如何保存?
3、a.全局变量:仍然在数据段了,在内存里,无需保存b.局部变量:已经在栈里,无需保存c.寄存器:压入栈中每个线程都有一个rt-thread结构体,里面记录有这个线程的栈,根据rt-thread结构体,就可以复现线程的状态,Timer的作用,在RTT实现coredump的原理,3.coredump信息获取的方法,怎样尽可能多地得到程序的信息?分为3步:对于当前线程:a.使用汇编打印它的当前所有寄存器b.打印它的栈内存 对于其他线程:a.找到它的rt-thread结构体,进而找到栈b.打印栈里面保存的寄存器值c.打印栈里其他内容 打印程序数据段内容,Timer的作用,在RTT实现coredump的原
4、理,4.使用coredump信息进行调试的方法,打印出来的coredump信息,可以使用人工去分析,但是效率太低;我们可以把它转换为core格式的文件,然后使用gdb工具来分析,过程如下:,百问网制作了2个工具:1.mcu_coredump.exe,它可以把“符合一定格式的串口数据”,制作为core文件2.100ask_CoreDebugger:它可以接收串口数据,调用mcu_coredum.exe转换为core文件,再调用gdb来分析,Timer的作用,代码速览,在上图里,源头为:开发板上打印coredump信息,Timer的作用,代码速览,1.coredump命令的实现:,2.coredump函数命令的实现:,Timer的作用,代码速览,3.DumpCore函数的实现:总体代码,Timer的作用,代码速览,4.DumpCore函数的实现:打印其他线程,Timer的作用,代码速览,5.无论是打印寄存器,还是打印栈,核心都是:打印内存,Timer的作用,代码速览,6.打印效果,Timer的作用,移植方法,把下列源码加入工程即可(支持cortex M3/M4架构),