用gdb调试C程序

一,编译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-八字节;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值