linux驱动调试--段错误之oops信息分析 http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=29401328&id=4923447 1. 分析coredump打印信息 2. 确定发生错误的函数 看发生错误的地方的函数和pc PC is at segment_test_open+0x14/0x1c [segdrv] 看pc值: pc : [<7f000014>]    lr : [<800d958c>…
在Linux中调试段错误(core dumped) 在作比赛的时候经常遇到段错误, 但是一般都采用的是printf打印信息这种笨方法,而且定位bug比较慢,今天尝试利用gdb工具调试段错误. 段错误(core dumped)一般都是数组索引位置不对,或者是数组越界等问题造成,在Linux环境下编程应该很容易就会遇到. GDB调试的具体流程 查阅资料发现几个讲Core dump的具体方法: How to get a core dump for a segfault on Linux. How to…
Linux环境下经常遇到某个进程挂掉而找不到原因,我们可以通过生成core file文件加上gdb来定位. (1)首先 在makefile中要增加编译调试选项 -g,才可以利用下面的gdb来调试 gcc udp_server.c -o udp_server.elf -g -lpthread  -g选项的作用是在可执行文件中加入源代码的信息,比如可执行文件中第几条机器指令对应源代码的第几行, 但并不是把整个源文件嵌入到可执行文件中,所以在调试时必须保证gdb能找到源文件. (2)如何产生core…
最近在Linux环境下做C语言项目,由于是在一个原有项目基础之上进行二次开发,而且 项目工程庞大复杂,出现了不少问题,其中遇到最多.花费时间最长的问题就是著名的“段错误”(Segmentation Fault).借此机会系统学习了一下,这里对Linux环境下的段错误做个小结,方便以后同类问题的排查与解决. 1. 段错误是什么 一句话来说,段错误是指访问的内存超出了系统给这个程序所设定的内存空间,例如访问了不存在的内存地址.访问了系统保护的内存地址.访问了只读的内存地址等等情况.这里贴一个对于“段…
转载自http://www.cnblogs.com/panfeng412/archive/2011/11/06/2237857.html 最近在Linux环境下做C语言项目,由于是在一个原有项目基础之上进行二次开发,而且项目工程庞大复杂,出现了不少问题,其中遇到最多.花费时间 最长的问题就是著名的“段错误”(Segmentation Fault).借此机会系统学习了一下,这里对Linux环境下的段错误做个小结,方便以后同类问题的排查与解决. 1. 段错误是什么 一句话来说,段错误是指访问的内存超…
本文转自:http://www.cnblogs.com/panfeng412/archive/2011/11/06/segmentation-fault-in-linux.html 1. 段错误是什么 段错误是指访问的内存地址是一个非法地址或者以非法的方式访问一个合法地址(比如,以写方式访问只读地址).如果得到一个段错误,那么就可以判定内存管理出了问题——访问了已经被free的变量,向内存的只读部分写数据. 2. 段错误产生的原因 2.1 访问不存在的内存地址(解引用空指针) #include<…
转自:http://www.cnblogs.com/panfeng412/archive/2011/11/06/2237857.html 最近在Linux环境下做C语言项目,由于是在一个原有项目基础之上进行二次开发,而且项目工程庞大复杂,出现了不少问题,其中遇到最多.花费时间最长的问题就是著名的“段错误”(Segmentation Fault).借此机会系统学习了一下,这里对Linux环境下的段错误做个小结,方便以后同类问题的排查与解决. 1. 段错误是什么 一句话来说,段错误是指访问的内存超出…
源地址:http://www.cnblogs.com/panfeng412/archive/2011/11/06/2237857.html 补充:http://baike.baidu.com/link?url=oJ8Gy8pRAGrXPP-mXSvdTLwKFqdUc3T4uvz3Yy63upN6D07qFv97Wny1I_EV4pYfSwVKnpr73xowghsrg-1p-q Linux环境下段错误的产生原因及调试方法小结 最近在Linux环境下做C语言项目,由于是在一个原有项目基础之上进行…
---恢复内容开始--- 下面先简单介绍下ulimit命令: 1. limit -a 可以查看系统各种资源的限制,如: core文件大小,数据段的大小等. $ ulimit -a core file size (blocks, -c) data seg size (kbytes, -d) unlimited scheduling priority (-e) file size (blocks, -f) unlimited pending signals (-i) max locked memor…
本文转载自:http://blog.chinaunix.net/uid-20671208-id-4940381.html 原文地址:linux驱动调试--修改系统时钟终端来定位僵死问题 作者:枫露清愁 曾经遇到过一个bug是这样的,通过串口终端和开发板交互时,执行一个程序后,整个系统就挂了,也不接受输入了,只能重启,后来发现是死在某段代码里了,当时可是费了一番功夫,今天来说一下怎么调试这种系统僵死的程序. 首先说一下linux的时钟中断.linux的时钟中断也是一种硬件中断,通过计数器产生输出脉…
[转]gdb 调试段错误 转自:blog.csdn.net/yangzhu1982/article/details/6318600 开发嵌入式Linux的时候经常会遇到segmentation fault,也就是段异常错误,一般是使用错误的指针访问内存导致.这种错误可以通过打开内核的异常信息输出,再用gdb对发生段异常的地址进行定位. 1.打开内核的异常信息输出: mips的内核代码关闭了arch/mips/mm/fault.c的do_page_fault():133中的这段代码: #if 0…
Linux开发中常见段错误问题原因分析 1 使用非法的内存地址(指针),包括使用未经初始化及已经释放的指针.不存在的地址.受系统保护的地址,只读的地址等,这一类也是最常见和最好解决的段错误问题,使用GDB print一下即可知道原因. 2 内存读/写越界.包括数组访问越界,或在使用一些写内存的函数时,长度指定不正确或者这些函数本身不能指定长度,典型的函数有strcpy(strncpy),sprintf(snprint)等等. 3 对于C++对象,应该通过相应类的接口来去内存进行操作,禁止通过其返…
在编程调试中,经常出现段错误,此时可用gdb调试.具体方法为注册段错误信号处理函数,在处理函数中启动gdb.具体代码如下: void segv_handler(int no) { ]; ]; FILE *file; snprintf(buf, sizeof(buf), "/proc/%d/cmdline", getpid()); if(!(file = fopen(buf, "r"))) { exit(EXIT_FAILURE); } if(!fgets(buf,…
什么是段错误 下面是来自 Answers.com 的定义: A segmentation fault (often shortened to segfault) is a particular error condition that can occur during the operation of computer software. In short, a segmentation fault occurs when a program attempts to access a memor…
linux驱动调试 linux 目录 /proc 下面可以配置驱动的调试信息,比如给proc目录的自己定制的驱动的一文件设置一个变量,然后驱动程序跟了proc的参数值来配置调试级别.类似于内核调试的级别来配置自己驱动调试级别.可以在dev目录创建一个设备专门用来打印相应的驱动调试信息.…
为了能够快速找到发生段错误的地方,记录以下两种方法. objdump和backtrace的配合使用 :https://www.cnblogs.com/jiangyibo/p/9507555.html 代码:test.c 一.命令addr2line:  addr2line -e '可执行文件名'  'dmesg打印的地址' 编译的时候一定要加“-g”  添加调试信息:gcc -g test.c 生成的可执行文件a.out一运行就会报错:Segmentation fault 调用命令dmesg ,可…
Linux下的段错误(Segmentation fault) 段错误是指:访问了系统分配给程序的内存空间之外起的内存空间,比如: 访问不存在的地址 访问受系统保护的地址 访问了只读内存地址 内存访问越界 要注意的: 使用strcpy, strcat, sprintf, strcmp, strcasecmp等字符串操作函数,将目标字符串读/写爆.应该使用strncpy, strlcpy, strncat, strlcat, snprintf, strncmp, strncasecmp等函数防止读写…
1.当驱动有误时,比如,访问的内存地址是非法的,便会打印一大串的oops出来 1.1以LED驱动为例 将open()函数里的ioremap()屏蔽掉,直接使用物理地址的GPIOF,如下图所示: 1.2然后编译装载26th_segmentfault并执行测试程序后,内核便打印了oops出来,如下图所示: 2.接下来,我们便来分析oops: Unable to handle kernel paging request at //无法处理内核页面请求的虚拟地址56000050 pgd = c38500…
在实际开发过程中,大家可能会遇到段错误的问题,虽然是个老问题,但是其带来的隐患是极大的,只要出现一次,程序立即崩溃中止.如果程序运行在PC中,segment fault的调试相对比较方便,因为可以通过串口.显示器可以查看消息,只要程序运行,通过GDB调试工具即可捕捉产生segment fault的具体原因.但是不知大家有没有想法,当程序运行在嵌入式设备上时,你所面临资源的缺乏,你没有串口打印信息,没有显示器可查看,你不知道程序运行的状态,如果程序的产生segment falut这种bug发生的周…
转自:http://blog.csdn.net/ab198604/article/details/6164517 版权声明:本文为博主原创文章,未经博主允许不得转载. 在实际开发过程中,大家可能会遇到段错误的问题,虽然是个老问题,但是其带来的隐患是极大的,只要出现一次,程序立即崩溃中止.如果程序运行在PC中,segment fault的调试相对比较方便,因为可以通过串口.显示器可以查看消息,只要程序运行,通过GDB调试工具即可捕捉产生segment fault的具体原因.但是不知大家有没有想法,…
#include <stdio.h> void func(){ int *p = NULL; printf("*p:%d\n", *p);//断错误 } int main(void){ func(); return 0; } 1.首先设置开关 设置 core文件的大小为1000K存放数据 [oracle@xweb1 clession]$ ulimit -c0[oracle@xweb1 clession]$ ulimit -c 1000 2. 编译-g调试程序如下 gcc -…
上章链接入口: http://www.cnblogs.com/lifexy/p/8006748.html 在上章里,我们分析了oops的PC值在哪个函数出错的,那如何通过栈信息来查看出错函数的整个调用过程? 本章接着上章,来分析oops的栈信息 1.上章的oops栈信息如下图所示: 9fe0: 代表最初的栈顶SP寄存器位置 9e80:代表函数出错的SP寄存器位置 2.我们先来分析上图的栈信息,又是怎样的过程呢? 2.1内核主要是通过STMDB和LDMIA汇编命令来入栈和出栈 (STMDB和LDM…
上章链接入口: http://www.cnblogs.com/lifexy/p/8006748.html 在上章里,我们分析了oops的PC值在哪个函数出错的 本章便通过栈信息来分析函数调用过程 1.上章的oops栈信息如下图所示: 9fe0: 代表最初的栈顶SP寄存器位置 9e80:代表函数出错的SP寄存器位置 2.我们先来分析上图的栈信息,又是怎样的过程呢? 2.1内核主要是通过STMDB和LDMIA汇编命令来入栈和出栈 (STMDB和LDMIA汇编命令参考: http://www.cnbl…
1.warning: passing argument 2 of 'request_irq' from incompatible pointer type http://blog.sina.com.cn/s/blog_7321be1101012gek.html 今天在些key的driver的时候...写完了编译出现一个warmming如下:warning: passing argument 2 of 'request_irq' from incompatible pointer type 我的r…
当内核或驱动出现僵死bug,导致系统无法正常运行,怎么找到是哪个函数的位置导致的? 答,通过内核的系统时钟,因为它是由定时器中断产生的,每隔一定时间便会触发一次,所以当CPU一直在某个进程中时,我们便在中断函数中打印该进程的信息 1.先来回忆下 在之前的第5章内核中断运行过程:http://www.cnblogs.com/lifexy/p/7506504.html分析过,当内核中断产生时,会做以下几步: 1)pc-4(计算返回地址值),然后将各个寄存器值存到sp栈里 2)获取中断号,获取sp地址…
1. struct task_struct current->comm[16]; /*此进程可执行文件的名字!!可只对此进程执行打印*/…
[https://blog.csdn.net/xj9120/article/details/91380074] 1.bt 2.frame number 3.一般是内存问题 4.kill…
最近在整理Linux调试方面的文档,正好碰到了一个内存泄漏踩栈的问题,借此机会记录一下分析过程. 首先,发现问题之后,赶紧看一下产生coredump文件没有,果不其然,产生了coredump,果断上gdb调试. $ arm-buildroot-linux-gnueabi-gdb ./linecard ~/core_tMscRcv_165 GNU gdb (GDB) 7.10.1 Copyright (C) 2015 Free Software Foundation, Inc. License G…
死锁问题分析 死锁就是多个进程(线程)因为等待别的进程已占有的自己所需要的资源而陷入阻塞的一种状态,死锁状态一旦形成,进程本身是解决不了的,需要外在的推动,才能解决,最重要的是死锁不仅仅影响进程业务,而且还会占用系统资源,影响其他进程.所以内核中设计了内核死锁检测机制,一旦发现死锁进程,就重启OS,快刀斩乱麻解决问题.之所以使用重启招数,还是在于分布式系统中可以容忍单点崩溃,不能容忍单点进程计算异常,否则进行死锁检测重启OS就得不偿失了. 内核提供自旋锁.信号量等锁形式的工具,具体不再赘述. L…
u-boot编译分析 在配置完成后,执行make开始编译.这里打开Makefile. 首先在目标all前有一句话首先检查是否有include/config.mk文件来判断是否成功配置过. ifeq ($(obj)include/config.mk,$(wildcard $(obj)include/config.mk)) 下面分析"make"命令正常执行的过程. include/autoconf.mk生成过程 首先包含头文件autoconf.mk.dep.autoconf.mk.这是与开…