6.1如何检查内存?
使用x命令检查内存。X命令的语法为:x/FMT ADDRESS。FMT由格式字符与大小字符构成。这里有很多的选项,请使用“help x”来查看。ADDRESS参数可以为任何的符号名,例如变量或者内存地址。
如果我们有字符串char *s = "Hello World\n",则使用x命令有几种形式:
作为字符串检查该变量:
(gdb) x/s s
0x8048434 <_IO_stdin_used+4>: "Hello World\n"
作为字符检查该变量:
(gdb) x/c s
0x8048434 <_IO_stdin_used+4>: 72 'H'
作为四个字符检查该变量:
(gdb) x/4c s
0x8048434 <_IO_stdin_used+4>: 72 'H' 101 'e' 108 'l' 108 'l'
检查该变量的前32为:
(gdb) x/t s
0x8048434 <_IO_stdin_used+4>: 01101100011011000110010101001000
以16进制方式检查该变量的前24字节:
(gdb) x/3x s
0x8048434 <_IO_stdin_used+4>: 0x6c6c6548 0x6f57206f 0x0a646c72
6.2如何查看寄存器的值?使用info registers命令。该命令的输出依赖于硬件架构。下面是一个intel架构下的部分输出:
(gdb) info registers
eax 0x40123460 1074934880
ecx 0x1 1
edx 0x80483c0 134513600
ebx 0x40124bf4 1074940916
esp 0xbffffa74 0xbffffa74
ebp 0xbffffa8c 0xbffffa8c
esi 0x400165e4 1073833444
...
6.3如何调试一个核文件(core file)?当你的程序意外终止并留下了核文件(core dump file)时,你可以使用gdb来查看程序崩溃时的状态。使用core命令加载core文件。Core命令的参数极为core dump 文件的文件名,通常为“core”,所以整个命令为core core。
prompt > myprogram
Segmentation fault (core dumped)
prompt > gdb myprogram
...
(gdb) core core
...
6.4如何按照指令级别逐步执行程序?有两个命令,nexti和stepi,它们同next 与step命令很相似。参见这些命令的使用方法来使用它们。
6.5如何查看正在执行程序的汇编代码?使用disassemble命令。该命令的参数是内存地址。下面是main函数的反汇编例子,该例子是一个运行在intel架构的计算机上的程序:
(gdb) disassemble main
Dump of assembler code for function main:
0x80483c0
0x80483c1
0x80483c3
0x80483c6
0x80483cd
0x80483d0
0x80483d3
0x80483d5
0x80483d7
0x80483d8
End of assembler dump.