gcc -g test.c -o test
set disassembly-flavor intel
gdb的使用
break main 设置断点
run 运行
next 单步运行
p 显示变量
info b 显示断点信息
info register 显示寄存器信息
disass 显示汇编
print a 显示变量
print &a 显示这个变量在内存的地址
print sizeof(a) 显示这个变量占用内存的大小
用ptype命令查看类型
Ptype也许是我最喜欢的命令了。它告诉你一个C表达式的类型:
(gdb) ptype i
type = int
(gdb) ptype &i
type = int *
(gdb) ptype main
type = int (void)
这意味着,至少在你的机器上,int变量占用4个字节的空间,double占用8个。
使用GDB中的x命令,将会使它变成一个直接测试内存的强大的工具。X命令测量内存开始与一个特定的地址。它配备了一些格式化命令,提供精确的控制来实现你想检查多少字节,以及如何你想将它们打印出来。如果有疑问,在GDB prompt中执行help x。
&操作可以得到一个变量的地址,所以这意味着我们可以用x来执行&i并且来观察i值的原始字节。
(gdb) x/4xb &i
0x7fff5fbff584: 0x39 0x05 0x00 0x00
这个标志表示我想以4 个16进制数,一次一个字节的格式来显示。我已经选择查看4个字节,因为i的内存大小就是4个字节。输出信息中逐字节显示i的原始地址。
一个需要紧记于心的细节是如果在intel机器上的逐字节测试,其字节是按“little-endian”排序的。
一种更能清楚认识到这个特性的方法是赋予i一个更有趣的值,然后重新测试它的内存块:
(gdb) set var i = 0x12345678
(gdb) x/4xb &i
0x7fff5fbff584: 0x78 0x56 0x34 0x12