你的C/C++程序为什么无法运行?揭秘Segmentation fault (2)
甚么让你对C/C++如此恐惧?本篇将继续上1篇来讨论段毛病(Segmentation fault)。 追溯段毛病如果你觉得你已理解了段毛病的本源,也知道了如何避免段毛病,那末可以到此为止。否则,下面的内容也许对你有所启发。 malloc我们开始为指针所指向的地址分配内存: 注意, 接下来,我们的主角段毛病的前夕: 上面的图告知我们1些信息:
下1步行将履行黄线勾画出的内容 /*
注意这里的rax在毛病的代码中为0x0
而rdx的值为malloc出的内存地址0x602010
*/
mov QWORD PTR [rax],rdx 那末,当履行上面的代码时,毛病的代码试图将malloc分配出的在堆上的内存地址当作值放在指针 地址:0x0 值:0x602010 那末就出现了上篇所说的, 甚么是段毛病对很多人来说。上面的分析比第1篇要深入1些,或许看得到真相前的每步才能让人踏实。 现在,我们来看看甚么是段毛病。 下图是1个进程地址空间的描写,这是1个旧图,网上到处都是,但可以用来理解VMA: 上面这幅图会告知我们甚么呢?
如果你访问了内核虚拟内存空间(就是比ebp大的空间,1都不行)、代码段、数据段都会引发段毛病。 在上篇的例子中,是由于访问了图中红色圈出的保存区域酿成的段毛病。 补充1下x86_64的VMA-layout: 。 找到代码中的段毛病方法有很多。我也只会1个,毕竟我不写C/C++,更不是这方面的老手。 1.在shell中`ulimit -c unlimited`
2.运行你产生了段毛病的程序 有了coredump,就能够拿gdb来掰掰了 上图有几个信息:
我想,对这样1个简单的c程序,上面的信息足够了. 其它或许后面还想看看mmap、mm的fault处理、页异常处理还有signal的1些东西. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |