通过GDB学习C语言
作者:网络转载 发布时间:[ 2015/8/25 11:21:20 ] 推荐标签:编程语言 .NET
对于那些具有高级编程语言诸如: 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 语言中变量用来标示一块连续的内存区间。一个变量的内存区间由两个数字决定:
这块内存第一个字节数的数值地址
内存的大小,单位是字节。变量所占内容的大小取决于变量的类型。
C 语言中一个独特的特性是你能够直接访问变量所占的内存。操作符 & 可以计算一个变量的地址,操作符 sizeof 计算变量所占内存的大小。
你可以在 GDB 中测试以上两个概念:
(gdb) print &i
$5 = (int *) 0x7fff5fbff584
(gdb) print sizeof(i)
$6 = 4
字面上看,i 所占内存起始于地址 0x7fff5fbff5b4,占内存 4 个字节。
我前面提到的变量在内存中的大小取决于它的类型,所以操作符 sizeof 能够直接作用于类型:
(gdb) print sizeof(int)
$7 = 4
(gdb) print sizeof(double)
$8 = 8
以上显示意味着,至少在我的计算机上 int 变量占 4 个字节空间,double 变量占 8 个字节。
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11