通过通过GDB学习学习C语言的讲解语言的讲解
今天小编就为大家分享一篇关于通过GDB学习C语言的讲解,小编觉得内容挺不错的,现在分享给大家,具有很
好的参考价值,需要的朋友一起跟随小编来看看吧
对于那些具有高级编程语言诸如: Ruby、Scheme、Haskell 等背景的人来说,学习 C 语言是具有挑战性的。除了纠结于 C
语言中像手动内存管理和指针等底层特性外,你必须在没有 REPL ( Read-Eval-Print Loop ) 的条件下完成工作。一旦你已经
习惯于在 REPL 环境下进行探索性的编程,必须进行“编写-编译-运行”这样循环实在有点令人生厌。
最近我发现其实可以用 GDB 来作为 C 语言的伪 REPL。我一直尝试使用 GDB 作为学习 C 语言的工具,而不仅仅是用来调试
C 程序,事实上这非常有趣。
这篇文章我的目的就是向你展示 GDB 是一个非常好的学习 C 语言工具。下面我将会向你介绍一些我最喜欢的 GDB 命令,然
后我会向你阐述怎样使用 GDB 来理解 C 语言中一个出了名的复杂问题:数组和指针的区别。
GDB 简介简介
从创建一个简单的 C 程序开始,minimal.c:
int main()
{
int i = 1337;
return 0;
}
注意这个程序并没有做任何事情,也没有一条输出指令。拥抱使用 GDB 学习 C 语言的美丽新世界吧!
使用 -g 参数进行编译,这样会生成一些有助于 debug,gdb 可以利用的信息,编译后用 GDB 运行起来:
$ gcc -g minimal.c -o minimal
$ gdb minimal
你现在应该能看到明显的 GDB 提示行。我之前告诉你这是一个 REPL,下面我们就来试试:
(gdb) print 1 + 2
$1 = 3
多么神奇! print 是 GDB 的内置命令,他能够打印出一个 C 语言命令的返回值。如果你不确定一个 GDB 命令是做什么,尝
试在 GDB 提示下运行命令 help。
然后是一个更有趣的例子:
(gbd) print (int) 2147483648
$2 = -2147483648
这里我先忽略为什么 2147483648 == -2147483648;我想要说明的是即使是算术运算在 C 语言中也是有很多坑的,GDB 能
够理解运行 C 语言中的算术运算。
现在让我们在主函数中设置一个断点然后运行程序:
(gdb) break main
(gdb) run
现在程序在第 3 行处暂停,正好在 i 进行初始化之前。有趣的是,尽管 i 还没有被初始化,我们依然能够使用 print 命令看到
它的值。
(gdb) print i
$3 = 32767
在C语言中,一个未被初始化的局部变量的值是没有定义的,所以你用 GDB 打印出的值可能与这里的不一样。
我们可以用 next 命令来执行当前断点这一行:
(gdb) next
(gdb) print i
$4 = 1337
使用使用x 命令检查内存命令检查内存
在C语言中变量用来标示一块连续的内存区间。一个变量的内存区间由两个数字决定:
这块内存第一个字节数的数值地址
内存的大小,单位是字节。变量所占内容的大小取决于变量的类型。