博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
段错误以及调试方式
阅读量:6841 次
发布时间:2019-06-26

本文共 1174 字,大约阅读时间需要 3 分钟。

dummy_function(void){    unsigned char * ptr=0x00;    *ptr=0x00;}int main(){    dummy_function();    return 0;} 作为一名熟练的c/c++程序员,以上代码的bug应该是很清楚的,因为它尝试操作地址为0的内存区域,而这个地址区域通常是不可访问的禁区,当然会出错了。

 

方法1 :利用gdb逐步查找段错误这种方法也是被大众所熟知并广泛采用的方法,首先我们需要一个带有调试信息的可执行程序,所以我们加上"-g -rdynamic“的参数进行编译,然后调用gdb调试运行这个新编译的程序。
这个版本的gdb没有提示出错误,以前的那个版本提示除了错误。 不仅提示出第几行有错误,而且还提示出了了是因为进程是由于收到了SIGSEGV信号而结束的。通过进一步的查阅资料文档(man 7 signal), 我们知道SIGSEGV默认handler的动作是打印”段错误“的出错信息,并产生core文件,由此我们又产生了方法二。
方法2:分析core文件
但是奇怪了我的系统上并没有生成core文件,linux系统默认禁止生成core文件,我们用下面的命令测试了一下果真如此。 我们将core文件的大小限制为1000, 这个好像每次都要设置不然输不出来,估计要修改那个文件,不管了,知道就行了。
经过我们上面的设置之后终于生成了core文件。

哇,好厉害,还是一步定位到了错误所在地,佩服linux系统的此类设计,

方法3:段错误时启动调试(试过没成功)

1    #include
2 #include
3 void dump(int signo) 4 { 5 //此处省略。。。。 system("gdb"); 6 7 } 8 dummy_function(void) 9 { 10 unsigned char * ptr=0x00; 11 *ptr=0x00; 12 sleep(10); 13 } 14 int main() 15 { 16 signal(SIGSEGV,&dump); 17 dummy_function(); 18 return 0; 19 }大概思路就是这样的,然后进入调试界面后输入”bt"

方法4:利用backtrace和objdump进行分析。

转载地址:http://klbul.baihongyu.com/

你可能感兴趣的文章
关于前端请求发送时间时而长时而短问题(stalled a lot)
查看>>
Python 工匠:编写条件分支代码的技巧
查看>>
记一次前端面试经历
查看>>
带你探索JUnit 5.4
查看>>
<暗时间> 时间, 不在于你拥有多少, 而在于你怎样使用
查看>>
单例 - iOS
查看>>
戛纳电影节百花齐放,中国明星衣着品味紧跟时尚前沿
查看>>
mysql 存储emoji表情
查看>>
10年测试总监经验分享,你与优秀工程师的距离!
查看>>
2019年在哪里找好的高层次人才扶持政策?
查看>>
解决代码报红:Cannot resolve symbol 'xxx'
查看>>
第71节:Java中HTTP和Servlet
查看>>
Linux开源CommunityBridge平台 提供资金、安全以及人员三项关键
查看>>
Python爬虫入门教程 5-100 27270图片爬取
查看>>
Day1:html和css
查看>>
开源如何在云上存活?
查看>>
Android 网络基础之 HTTP
查看>>
ES6实现继承
查看>>
有擎企业系统v1.0.0 积木式搭建网站,页面构建更灵活
查看>>
小葵花妈妈课堂开课了:《Handler Looper Message 浅析》
查看>>