对于一个程序而言,语法错误由编译器(比如GCC)负责,而逻辑错误则由开发人员负责。项目研发过程中,不可避免地会出现或多或少的问题,有些比较简单的可以目测,有些复杂一点的,就需要使用特殊的工具——调试器(比如GDB)来协助了。
下面是一段从零开始介绍GBD调试器的用法,以及如何快速定位段错误的视频。建议在WIFI环境下观看。
视频大小:50.8M
视频时长:17分22秒
没有WiFi?讨厌广告?没耳机?不够清晰?高清免广告原版视频请点击左下方“阅读原文”。或者,阅读以下文字也可以学习哟!
1,将待调试的代码使用 -g 来编译,举例:
gcc debugme.c -o debugme -g
2,使用 gdb 启动待调试代码:
gdb ./debugme
3,命令 list(或简写第一个字母l)来浏览待调试源码
4,命令 breakpoint(或简写第一个字母b)来设置断点,举例:
b 20 #在第20行设置一个断点
b func #在函数func起始处设置一个断点
b 50 if i==100 #当且仅当变量i等于100时,第50行的断点生效
5,命令 run(或简写第一个字母r)启动待调试程序,举例:
r
r abcd 1234
6,命令 step(或简写第一个字母s)让程序单步运行(会进入函数内部)
7,命令 next(或简写第一个字母n)让程序单步运行(不进入函数内部)
8,命令print、display可以显示跟踪变量的值的变化,举例:
print i
display i
9,命令backtrace full(或者简写bt full)查看当前程序栈内存信息
10,命令continue(或简写第一个字母c)来让程序继续运行,直到遇到下一个断点或者程序退出为止。
程序运行时的诸多逻辑错误中,段错误(segmentation fault)是最为常见也最难应付的错误,在编辑代码时多加小心防范于未然当然是最好了,但在出错之后,如何利用gdb快速定位也是一个不错的亡羊补牢的实用技巧。
A) 执行以下命令解除系统对core文件的限制:
ulimit -c unlimited
B) 执行一次带有段错误的程序,让他崩溃并生成core文件,举例:
gec@ubuntu:~/test$ ./debugme Segmentation fault (core dumped) gec@ubuntu:~/test$ ls core debugme debugme.c
C) 启用 gdb,让其直接检查core文件,直接定位出错位置,举例:
gec@ubuntu:~/test$ gdb ./debugme core GNU gdb (Ubuntu 7.11.1-0ubuntu1~16.04) 7.11.1 …… …… #0 0x0804845c in index_to_the_moon (ary=0xbff176ec) at debugme.c:9 9 ary[i] = i;
look,直接定位到第 9 行了。
当然这一招不是一定能奏效的,拼的是人品。如果人品不行,那只能单步调试了。
以上内容的高清免广告版本视频,请点击左下方的阅读原文,到粤嵌创客训练营观看。谢谢同学支持!