嵌入式开发coredump 使用(适用于无法直接跑gdb(比如内存不够,一跑就挂),或跑了gdb就没有错误了)


原理: 由于系统关键 / 核心进程,产生严重的无法恢复的错误,为了避免系统相关资源受到更大损害,操作系统都会强行停止运行,并将当前内存中的各种结构 , 核心进程出错位置及其代码状态,保存下来,以便以后分析。最常见的原因是指令走飞,或者缓冲区溢出,或者内存访问越界。走飞就是说代码流有问题,导致执行到某一步指令混乱,跳转到一些不属于它的指令位置去执行一些莫名其妙的东西(没人知道那些地方本来是代码还是数据,而且是不是正确的代码开始位置),或者调用到不属于此进程的内存空间。写过 C 程序及汇编程序的人士,对这些现象应当是很清楚的。

. 启用内核转储
1.1 查看内核转储是否有效
在终端中输入以下命令,查看内核转储是否有效。
#ulimit -c
0
-c 表示内核转储文件的大小限制,现在显示为零,表示不能用。
可以改为1G
#ulimit -c 1073741824
也可以改为无限制
#ulimit -c unlimited
 然后直接运行程序,如果程序参数段错误,
后面会有(core dumped),表示内核转存储成功。在当前目录会生成 core 文件
看,很大,所以一般在挂载目录下运行程序。
生成了core文件,可以直接用gdb进行分析,
注意格式, ./gdb edvr core 中间的表示运行的程序
现在可以直接用bt查看栈了

查看当前栈层更详细信息

查看当前函数中所有局部变量及其值

info args
打印出当前函数的参数名及其值。

info locals
打印出当前函数中所有局部变量及其值。

info catch
打印出当前的函数中的异常处理信息。

像上面提示No symbol table info available ,注意查看 编译的时候是否 加了-g,是否被striped

猜你喜欢

转载自blog.csdn.net/u012459903/article/details/80212071