C语言——C语言环境安装(docker),gcc + gdb使用

一、下载centos7镜像

docker pull centos:centos7

二、启动镜像

docker run -d --name study-C-centos7 --privileged=true -p 10022:22 -v D:\docker\study\C:/home/study centos:centos7 /usr/sbin/init

三、对centos进行操作,以便可以通过ssh工具连接

# 更新系统
yum update

# 安装openssh-server
yum install openssh-server -y

# 安装需要用到的软件vim用于编辑文件、passwd用于设置root或其他用户的密码、openssh-clients用于让此容器可以使用ssh命令、net-tools我暂时只是用来查看ip
yum install vim passwd openssh-clients net-tools

# 查看ssh状态
systemctl status sshd

# 启动ssh服务
systemctl start sshd

# ssh服务开机自启
systemctl enable sshd

# 停止ssh服务
systemctl stop sshd

# 移除ssh自启
systemctl disable sshd

四、安装gcc编译器

yum -y install gcc gcc-c++ kernel-devel gdb

五、gcc常用选项

在这里插入图片描述

六、gcc使用示例

gcc -E hello.c -o hello.i #预处理
gcc -S hello.i -o hello.s #编译
gcc -c hello.s -o hello.o #汇编
gcc hello.o -o hello #链接
gcc hello.c -o hello #直接编译链接成可执行目标文件
gcc -c hello.c 或 gcc -c hello.c -o hello.o #编译生成可重定位目标文件

七、gdb使用

# 生成可供调试的文件
gcc -g helloworld.c -o helloworld
# 启动gdb并指定调试文件
gdb helloworld

# 或者启动gdb后指定调试哪个文件
file helloworld

# 1、查看源代码 
list # 简写为(l),默认展示10行,回车翻页
list 行号 # 将显示当前文件以“行号”为中心的前后10行代码,如list 12
list 函数名 # 将显示“函数名”所在函数的源代码,如list main‘
list 不带参数 # 将接着上一次命令,输出下标的内容

# 2、运行源代码,查看运行信息
run # 简写为(r),运行程序,直到结束或者遇到断点,等待下一个命令
where/bt # 当前运行的堆栈列表
bt backtrace # 显示当前调用堆栈
up/down # 改变堆栈显示的深度
set args 参数 # 指定运行时参数
show args # 查看设置好的参数
info program # 查看程序是否在运行,进程号,被暂停的原因

# 3、设置断点
break # 简写为(b),b + 行号,在某行设置断点
info breakpoints # 显示断点信息
b fnl if a>b # 条件断点设置
break func # 在函数func()的入口处设置断点,例如 b func
delete 断点号n # 删除第n个断点
disable 断点号n # 暂停第n个断点
enable 断点号n # 开启第n个断点
clean 行号n # 清除第n行断点
delete breakpoints # 删除所有断点

# 4、单步/跳步执行,使用continue、step、next命令
continue # 简写为(c),继续执行程序,直到结束或者遇到下一个断点
next # 简写为(n),单步执行程序,但是遇到函数会直接执行,不会进入函数内部
step # 简写为(s),单步执行程序,但是遇到函数会进入函数
until # 当你厌倦在一个循环体内单步跟踪时,这个命令可以运行程序,直到循环体结束
until 行号 # 运行到代码某行,不仅仅跳出循环
finish # 运行程序,直到当前函数完成返回,并打印函数返回时的堆栈地址和返回值以及参数信息

# 5、查看变量,使用print、whatis命令
print 表达式 # 简写为(p),其中表达式,可以是任何当前正在被测试程序的有效表达式
print a # 将显示整数a的值
print ++a # 将a自增1之后,显示值
print name # 显示字符串name的值
print gdb_test(22) # 显示函数gdb_test(22)的返回值
display 表达式 # 在单步运行时将非常有用,使用display设置一个表达式后,它将每次单步进行指令后,紧接着输出被设置的表达式及值,如 display a
watch 表达式 # 设置一个监视点,一旦被监视的表达式的值改变,gdb将强行终止正在被调试的程序,如 watch a
whatis # 查询变量或函数
info function # 查询函数
info locals # 查询当前堆栈页的所有变量
call 函数(参数) # 调用程序中可见的函数,并传递参数

# 6、分割窗口
layout # 用于分割窗口,可以一边查看代码,一边测试
layout src # 显示源代码窗口
layout asm # 显示反汇编窗口
layout regs # 显示源代码/反汇编和CPU寄存器窗口
layout split # 显示源代码和反汇编窗口
Ctrl + L # 刷新窗口

# 7、退出gdb
quit # 简写为(q)

断点信息

  • Num # 断点编号
  • Disp # 断点执行一次之后是否有效kep:有效,dis:无效
  • Enb # 当前断点是否有效
  • Address # 内存地址
  • What # 位置
    在这里插入图片描述
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值