C温故补缺(四):GDB
gdb
gdb是由GNU软件社区提供的C Debug工具
Pre
在调试前,需要先编译.c程序,且要加上-g使输出文件变得可调式
gcc test.c -g -o test
用gdb test来调试程序,用quit退出调试模式
几个指令
设置参数和显示参数,相当于main()的参数
set args 10 20
show args
查看源代码
list #显示所有
list n #从第n行显示
list fun #从指定函数显示
list 文件名:n #指定文件
list 文件名:fun
设置显示的行数
show listsize
set listsize n
断点
#设置断点
break 行号
break 函数
break 文件名:行号
break 文件名:函数
#查看断点
info break
#删除断点
del/delete
#失能/使能断点
disable 断点编号
enable 断点编号
#设置条件断点(一般用于循环)
break 10 if i==5
调试指令
start #程序开始调试,并停止在第一行
run #调试至断电
continue #继续运行至下一个断点
next #单步跳过
step #单步调试
finish #单步跳出
print #查看变量
ptype #查看变量类型
set var name=value #设置变量值
until #跳出循环
bt #查看函数调用栈
多进程调试
开关监控fork子进程
set detach-on-fork on
set detach-on-fork off
设置监控进程模式
set follow-fork-mode parent //默认情况
set follow-fork-mode child //跟踪子进程
info inferiors //查看调试的进程
inferior id //切换当前调试的进程
detach inferiors id //使进程脱离GDB调试
例子
PS C:\DATA\C&C++> gcc -g test.c -o test
PS C:\DATA\C&C++> gdb test
(gdb) list
1 #include <stdio.h>
2 void fun(){
3 static int i=0;
4 i++;
5 printf("%d ",i);
6 }
7
8 int main(){
9 int j=0;
10 while(j<3){
(gdb) break 9
Breakpoint 1 at 0x40158f: file test.c, line 9.
(gdb) run
Starting program: C:\DATA\C&C++\test.exe
[New Thread 14832.0x252c]
[New Thread 14832.0x4614]
Thread 1 hit Breakpoint 1, main () at test.c:9
9 int j=0;
(gdb) next
10 while(j<3){
(gdb) step
11 fun();
(gdb) step
fun () at test.c:4
4 i++;
(gdb) print i
$1 = 0
(gdb) step
5 printf("%d ",i);
(gdb) step
1 6 }
(gdb) continue
Continuing.
2 3 [Inferior 1 (process 14832) exited normally]
(gdb) quit
PS C:\DATA\C&C++>
查看函数栈帧反汇编代码
用disas 函数名来查看函数栈帧的反汇编代码
如:
(gdb) disas main
Dump of assembler code for function main:
0x000000000040157c <+0>: push %rbp
0x000000000040157d <+1>: push %rbx
0x000000000040157e <+2>: sub $0x38,%rsp
0x0000000000401582 <+6>: lea 0x80(%rsp),%rbp
0x000000000040158a <+14>: callq 0x401660 <__main>
---Type <return> to continue, or q <return> to quit---
0x000000000040158f <+19>: callq 0x401550 <f>
0x0000000000401594 <+24>: mov %eax,%ebx
0x0000000000401596 <+26>: callq 0x401566 <n>
=> 0x000000000040159b <+31>: add %ebx,%eax
0x000000000040159d <+33>: mov %eax,-0x54(%rbp)
0x00000000004015a0 <+36>: mov $0x0,%eax
---Type <return> to continue, or q <return> to quit---
0x00000000004015a5 <+41>: add $0x38,%rsp
0x00000000004015a9 <+45>: pop %rbx
0x00000000004015aa <+46>: pop %rbp
0x00000000004015ab <+47>: retq
End of assembler dump.
补充:
查看寄存器用:info register rip/rsp...,或info registers所有寄存器
查看内存:examine,简写成x,x /<n/f/u>
n是查看内存个数,即该内存后多少字节,也可以是负数,表示前面
f是显示的格式
f:浮点数
i:地址
x/d/o/t:16,10,8,2进制显示
c/s:字符,字符串
u:显示的内存字节长度,用b/h/w/g表示1/2/4/8字节
C温故补缺(四):GDB的更多相关文章
- Nginx学习之十四-GDB调试Nginx初试
本文的测试环境: Win7+虚拟机VMWareVMware-workstation-full-7.1.4-385536+Ubuntu12.04 Nginx-1.4.0 要想有效的研究Nginx源码,必 ...
- gdb常用
调试信息条件:-g或-gdbgcc -g -o test test.cgcc -ggdb3 -o test test.cggdb3告诉gcc,使用gdb的扩展产生调试符号.其中“3”表示使用的是第三 ...
- C语言的乱七八糟
Note For C Linux下C编程基础(gcc/gdb/make使用) 一.vi学习 二.初探emacs 三.gcc编译器 3.1 gcc所支持后缀名解释 后缀名 解释 后缀名 解释 .c C原 ...
- Linux Debugging(四): 使用GDB来理解C++ 对象的内存布局(多重继承,虚继承)
前一段时间再次拜读<Inside the C++ Object Model> 深入探索C++对象模型,有了进一步的理解,因此我也写了四篇博文算是读书笔记: Program Transfor ...
- gdb 调试(查看运行时数据) 四
在使用GDB调试程序时,触发断点后,可以使用print命令(简写为p),或是同义命令inspect来查看当前程序的运行数据.print命令的格式是: print <expr> pri ...
- 用GDB调试程序(四)
查看栈信息————— 当程序被停住了,你需要做的第一件事就是查看程序是在哪里停住的.当你的程序调用了一个函数,函数的地址,函数参数,函数内的局部变量都会被压入“栈”(Stack)中.你可以用GDB命令 ...
- Linux命令(十四)gdb调试
1. gdb调试 fun.c #include <stdio.h> #include "head.h" int sum(int a, int b) { printf(& ...
- 【spring源码分析】IOC容器初始化——查漏补缺(四)
前言:在前几篇查漏补缺中,其实我们已经涉及到bean生命周期了,本篇内容进行详细分析. 首先看bean实例化过程: 分析: bean实例化开始后 注入对象属性后(前面IOC初始化十几篇文章). 检查激 ...
- 潭州课堂25班:Ph201805201 django 项目 第四十六课 查错 补缺 (课堂笔记
从讲项目开始,查找错误,完善笔记,尽可能 翻译没一句代码(以后台为主), 本项目亮点,也是重点 Django ORM中对数据查询的优化(only.defer.select_related) redis ...
- Kafka 温故(四):Kafka的安装
Step 1: 下载Kafka > tar -xzf kafka_2.9.2-0.8.1.1.tgz> cd kafka_2.9.2-0.8.1.1 Step 2: 启动服务Kafka用到 ...
随机推荐
- Batch Norm 与 Layer Norm 比较
一.结论 Batch Norm一般用于CV领域,而Layer Norm一般用于NLP领域 Batch Norm需要计算全局平均,而Layer Norm不需要计算全局平均 二.Batch Norm Ba ...
- 创建多个节点的集群 - Elastic Stack 8.0
文章转载自:https://mp.weixin.qq.com/s/k6u9Q2nebW9qgZMghQwJng 详述如何安装3个节点的 Elasticsearch 集群.我将使用 Docker 来进行 ...
- 配置 jenkins 权限管理
安装插件 更改认证方式 创建用户 创建角色并授权 给用户指定角色 新用户登录
- CentOS系统一键部署jdk,maven,tomcat,mysql
#!/bin/bash ####使用方法############### # chmod a+x JdTomK-Auto.sh # source JdTomK-Auto.sh ############# ...
- 使用port-forward访问集群中的应用程序,以Redis 为例
为Redis创建Deployment和Service 创建 Redis Deployment,YAML文件如下: apiVersion: apps/v1 kind: Deployment metada ...
- Dockerfile 和 docker-compose.yml的区别
明确概念 Dockerfile 是拿来构建自定义镜像的,并没有直接生成容器.只是可以在运行镜像时运行容器而已. 做容器编排以部署环境,是使用 docker-compose.yml 文件进行的,里面可能 ...
- 详解JS中 call 方法的实现
摘要:本文将全面的,详细解析call方法的实现原理 本文分享自华为云社区<关于 JavaScript 中 call 方法的实现,附带详细解析!>,作者:CoderBin. 本文将全面的,详 ...
- [基础]VS Code 基础操作 命令符
一.五种运行方式 1.点击IIS Express运行 实际上它开的是一个IIS Express服务器,就是说有一个小的代理服务器帮咱们运行,运行后就会启动一个IIS Express小型服务器,启动之后 ...
- 我公司是属于生产制造业,最近考虑实施ERP,生产制造业的ERP那家比较好?
直接告诉你用哪家ERP,那我就太不负责任了,不同企业的规模选用不同的系统,匹配很重要!比如你大型企业,业务管理都比较标准规范,变化性也不大,不差钱预算没问题(千万元起步),你可以考虑下头部厂商.但如果 ...
- 如何使用 Yolov4 训练人脸口罩检测模型
前言 疫情当下,出入医院等公共场所都被要求佩戴口罩.这篇博客将会介绍如何使用 Yolov4,训练一个人脸口罩检测模型(使用 Yolov4 的原因是目前只复现到了 v4 ),代码地址为 https:// ...