1——段错误是什么?
一旦一个程序发生了越界访问,cpu 就会产生相应的保护,于是 (段错误)segmentation fault 就出现了。
所以段错误通常是指访问了不可访问的内存。
2——产生段错误常见的原因
1、访问不存在的内存地址
2、访问系统保护的内存地址
3、访问只读的内存地址
4、对空指针进行操作
5、堆栈溢出
6、内存越界
3——排查段错误出现在哪里的方法
第一步:输入dmesg
然后就会出现你程序段错误出现的相关描述
IP后面出现的地址就是你段错误出现的地址。
第二步:然后调用命令"addr2line -e 程序名 地址"就会打印出发生错误的文件和行号,如下图:
感觉这个方法超有用的有木有!!
补充:
o_O:Linux dmesg(英文全称:display message)命令用于显示开机信息。
kernel 会将开机信息存储在 ring buffer 中。您若是开机时来不及查看信息,可利用 dmesg 来查看。开机信息亦保存在 /var/log 目录中,名称为 dmesg 的文件里。
o_O:addr2line命令来自于英文词组”address to line“的缩写,其功能是将函数地址解析成文件名或行号的工具。给出一个可执行文件中的地址或一个可重定位对象中的偏移部分的地址,使用调试信息来找出与之相关的文件名和行号。
语法格式:addr2line [参数] [地址]
常用参数:
-a | 在函数名、文件和行号信息之前,显示地址,以十六进制形式 |
-b | 指定目标文件的格式为bfdname |
-e | 指定需要转换地址的可执行文件名 |
-j | 给出的地址代表指定section偏移,而非绝对地址 |
-C | 将低级别的符号名解码为用户级别的名字 |
-f | 在显示文件名、行号的同时显示函数名信息 |
-p | 每一个地址的信息占一行 |
有用: