GDB学习:4
来源:互联网 发布:java注释规范整理 编辑:程序博客网 时间:2024/05/29 17:36
在写程序的时候,最容易遇到的一类问题基本上就是段错误的问题,可以借助gdb来解决这类问题,下面是个例子:
int main(void){ int man = 0; scanf("%d", man); return 0;}运行输入会出现段错误:
root@wc:~/Codes/Learn/learnGDB# ./segfault 1段错误 (核心已转储)下面开始调试:
(gdb) startTemporary breakpoint 1 at 0x40051e: file segfault.c, line 11.Starting program: /root/Codes/Learn/learnGDB/segfault Temporary breakpoint 1, main () at segfault.c:1111 int man = 0;(gdb) n12 scanf("%d", man);(gdb) n123Program received signal SIGSEGV, Segmentation fault.0x00007ffff7a6c742 in _IO_vfscanf_internal (s=<optimized out>, format=<optimized out>, argptr=argptr@entry=0x7fffffffdf28, errp=errp@entry=0x0) at vfscanf.c:18571857vfscanf.c: 没有那个文件或目录.从上面可以看出,段错误的原因是scanf函数调用产生了一些问题,回到源文件查看会发现scanf的里面少加了一个&符号,所以导致了段错误。
下面在看一个段错误的实例:
#include<stdio.h>int main(void){ int sum = 0, i = 0; char input[5];scanf("%s", input); for (i = 0; input[i] != '\0'; i++) { if (input[i] < '0' || input[i] > '9') { printf("Invalid input!\n"); sum = -1; break; } sum = sum*10 + input[i] - '0'; } printf("input=%d\n", sum); return 0;}这个程序输入一个较长的字符串的时候就会出现段错误:
root@wc:~/Codes/Learn/learnGDB# ./segfault11234567890987654321234567890987654323456789098765432345678Invalid input!input=-1段错误 (核心已转储)使用gdb调试查看:
(gdb) n1234567898765432123456789876543212345678987654321234567898765432113 for (i = 0; input[i] != '\0'; i++) {(gdb) cContinuing.Invalid input!input=-1Program received signal SIGSEGV, Segmentation fault.0x0000000000400659 in main () at segfault1.c:2525}(gdb) l20 sum = sum*10 + input[i] - '0';2122 }23 printf("input=%d\n", sum);24 return 0;25}(gdb) n1234567898765432123456789876543212345678987654321234567898765432113 for (i = 0; input[i] != '\0'; i++) {(gdb) cContinuing.Invalid input!input=-1Program received signal SIGSEGV, Segmentation fault.0x0000000000400659 in main () at segfault1.c:2525}(gdb) l20 sum = sum*10 + input[i] - '0';2122 }23 printf("input=%d\n", sum);24 return 0;25}程序显示段错误发生在25行,但是这一行什么都没有,这可以算是一条规律,如果某个函数中发生访问越界,很可能并不立即产生段错误,而在函数返回时却产生段错误。这里实际上还是scanf函数存在问题。
0 0
- GDB学习:4
- gdb学习
- GDB学习
- gdb学习
- 学习GDB
- GDB学习
- gdb学习
- GDB学习
- gdb学习
- GDB学习
- GDB学习
- gdb学习
- 学习GDB
- [GDB-7] gdb 的学习
- 学习--GDB调试
- 开始学习gdb
- gdb 学习资料
- GDB/ARMulator 学习笔记
- CodeForces 461C Appleman and a Sheet of Paper
- OpenCV入门指南】第十二篇 在Windows平台下分享OpenCV程序
- python基础之编写第一个python脚本
- centos 解压缩命令
- Eclipse中Java项目的红色感叹号和黄色盾牌感叹号
- GDB学习:4
- laravel打印sql
- iOS开发—HTTP协议总结一
- java notify wait
- 类 System
- Logcat出错:Could not create the view: For input string:
- 【OpenCV入门指南】第十三篇 人脸检测
- 【Android解决方案】GridView第一次选中不调用onItemSelected()的解决办法
- Java图形化界面设计——容器(JFrame)