一,编译C程序,启动GDB
1.1.须在生成目标文件时加"-g"参数,如图中makefile的line15;可执行文件名xxx.
1.2.切换到可执行文件所在目录,shell中输入:gdb ./xxx
makefile文件中,若只在line5中加"-g"参数,启动gdb的时候,就会提示:(No debugging symbols found in ./xxx)
1
2 objects = everyday.o test.o sort.o
3
4 xxx: $(objects)
5 gcc -Wall -o xxx $(objects) -lm
6
7 #everyday.o: everyday.c
8 # gcc -c everyday.c
9
10 #test.o: test.c
11 # gcc -c test.c
12
13 %.o : %.c
14 # gcc --save-temps -c $<
15 gcc -c -g $<
16
17 $(objects): test.h
18
19 .PHONY: clean
20 clean:
21 rm xxx $(objects)
1.3.如图显示,证明成功进入:
二,调试命令
2.1. 打断点
b 7 //在main函数所在的文件的第7行加入断点;
2.2.查看变量值,变量地址,变量长度
按照以往调试如下程序,可能需要打印一堆printf来看变量的size等种信息:
int main(int argc, char *argv[])
{
int a[3][2] = {(0, 1), (2, 3), (4, 5)};
int *p;
p = a[0];
return 0;
}
可用gdb命令来查看变量的各种信息:
(gdb) p a
$3 = {{1, 3}, {5, 0}, {0, 0}}
(gdb) p &a
$4 = (int (*)[3][2]) 0x7fffffffe310
(gdb) p a + 1
$5 = (int (*)[2]) 0x7fffffffe318
(gdb) p sizeof(a)
$6 = 24
(gdb) ptype /o a
type = int [3][2]
其中:p sizeof(a),可查看变量a所占用的空间,gdb查看变量size, 变量长度,没找到其他方式,尝试了下,这样可行。
2.3.
list num;
show registers //查看寄存器
2.4.查看某内存地址存储的值:
其中/4xb中的4表示,从当前地址往后4个单位长度;x表示以十六进制格式;b表示每个单位长度位单字节;
(gdb) x /4xb 0x7fffffffe32c
0x7fffffffe32c: 0x04 0x03 0x02 0x01
查看(examine, 简写x)内存地址中的值标准语法: x / <n/f/u> address;
n表示显示的长度,一个正整数,从address开始的往后几个单位长度(单位由u指定);
f表示显示的格式,x-十六进制, d-十进制, u-无符号十六进制, o-八进制, t-二进制, c-字符格式;
u表示每个单位长度,b-单字节, h-双字节, w-四字节, g-八字节;