GDB学习:4
2016-01-14 10:52
141 查看
在写程序的时候,最容易遇到的一类问题基本上就是段错误的问题,可以借助gdb来解决这类问题,下面是个例子:
下面在看一个段错误的实例:
int main(void) { int man = 0; scanf("%d", man); return 0; }运行输入会出现段错误:
root@wc:~/Codes/Learn/learnGDB# ./segfault 1 段错误 (核心已转储)下面开始调试:
(gdb) start Temporary breakpoint 1 at 0x40051e: file segfault.c, line 11. Starting program: /root/Codes/Learn/learnGDB/segfault Temporary breakpoint 1, main () at segfault.c:11 11 int man = 0; (gdb) n 12 scanf("%d", man); (gdb) n 123 Program 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:1857 1857 vfscanf.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# ./segfault1 1234567890987654321234567890987654323456789098765432345678 Invalid input! input=-1 段错误 (核心已转储)使用gdb调试查看:
(gdb) n 12345678987654321234567898765432123456789876543212345678987654321 13 for (i = 0; input[i] != '\0'; i++) { (gdb) c Continuing. Invalid input! input=-1 Program received signal SIGSEGV, Segmentation fault. 0x0000000000400659 in main () at segfault1.c:25 25 } (gdb) l 20 sum = sum*10 + input[i] - '0'; 21 22 } 23 printf("input=%d\n", sum); 24 return 0; 25 } (gdb) n 12345678987654321234567898765432123456789876543212345678987654321 13 for (i = 0; input[i] != '\0'; i++) { (gdb) c Continuing. Invalid input! input=-1 Program received signal SIGSEGV, Segmentation fault. 0x0000000000400659 in main () at segfault1.c:25 25 } (gdb) l 20 sum = sum*10 + input[i] - '0'; 21 22 } 23 printf("input=%d\n", sum); 24 return 0; 25 }程序显示段错误发生在25行,但是这一行什么都没有,这可以算是一条规律,如果某个函数中发生访问越界,很可能并不立即产生段错误,而在函数返回时却产生段错误。这里实际上还是scanf函数存在问题。
相关文章推荐
- 去除优酷、土豆、酷六、百度、奇艺、CNTV、新浪、乐视、搜狐等视频网站15秒广告的方法
- JS限制文本框输入金额,保留2位小数
- php实现验证码的破解
- PHP中require和include的区别
- SQL_4_函数
- iOS开发 实现字母索引最快捷方法
- ES6--函数
- java 中的JDK封装的数据结构和算法解析(集合类)----链表 List 之 LinkedList
- 理解PHP中会话控制
- linux用户管理命令(useradd、userdel、usermod与finger)
- Android Lolipop 屏蔽隐式Intent检查引发的错误
- 最新最准确各大搜索引擎蜘蛛名称
- Android sdk配置 常见问题及处理方法——馨新欣心
- NSString什么时候用copy,什么时候用strong
- 线程并发测试服务器性能
- DrawerLayout报错的解决
- auto、static、register、extern
- svn cannot be opened because the project file cannot be parsed.
- 在MyEclipse 2014 中使用JUnit-(二)
- zz将 VSTO 插件部署给所有用户