段错误调试(core )

mac2026-04-07  5

参考链接-段错误的几种调试方式

文章目录

段错误概念什么是段错误段错误产生原因 段错误的调试使用core文件

段错误概念

什么是段错误

段错误具体体现运行程序之后: 常常遇到这种情况,What???,啥原因也不说,你至少告诉我错哪了,我改还不行嘛!!!好像女人生气的感觉,反正你错了,至于错在哪,你自己好好想想,然后从出生开始想,到底哪里得罪眼前的女人(开发一个庞大的系统从main开始看)。

一句话解释段错误:访问了你不该访问的内存(好像是废话,=> 你做了不该做的事)

段错误产生原因

访问不存在的地址,null 或者 超出给定程序的内存 int main() { int* p = NULL; *p = 0; return 0; } 访问了禁止访问的内存(32bit机上,虚拟地址,0-4k是受保护地址,3G-4G是内核空间) int main() { int* p = (int*)1024; *p = 0; return 0; } 修改了只读区域 int main() { const char *ptr = "test"; char* x = const_cast<char*>(ptr); *(x+1) = 'i'; return 0; } 栈溢出 int main() { main(); return 0; } 注意:指针越界

1. 堆上(new, molloc开辟的),只要还在合法的范围了是不会有任何错误。 2.  栈上(函数内,局部数组),会出现段错误。


段错误的调试

使用core文件

段错误会出发SIGSEGV信号,SIGSEGV信号会产生错误信息生成core文件,默认情况下linux系统不会生成core文件的,可以通过ulimit -c 查看一下系统core文件的大小限制(默认为0),通过ulimit -c 1024修改core文件的大小限制,这样当程序core dump的时候可以产生core文件了,或者我们直接在执行程序之前ulimit -c unlimited指定core文件大小没有限制。

执行ulimit -c unlimited取消core文件大小限制编译程序Debug模式执行程序,生成core文件使用gdb调试,gdb a.out core

注意在调试的过程中大部分都是进入库函数,可以用up命令进行跳出,最后定位发生段错误的地方,一般gdb调试使用的常用命令:

f:(补充:frame相当于函数调用的栈的一层)打印当前层栈的信息,栈的层编号,当前的函数名,函数参数值,函数所在文件及行号,函数执行到的语句up down :表示向栈的上面/下面移动n层,可以不打n,表示向上移动一层。info f : 打印当前层栈详细的信息,调用函数的地址,被调用函数的地址等info local :打印出当前函数中所有局部变量及其值info args: 打印出当前函数的参数名及其值p <表达式>: 输出表达式的值

详细命令参考

最新回复(0)