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的更多相关文章

  1. Nginx学习之十四-GDB调试Nginx初试

    本文的测试环境: Win7+虚拟机VMWareVMware-workstation-full-7.1.4-385536+Ubuntu12.04 Nginx-1.4.0 要想有效的研究Nginx源码,必 ...

  2. gdb常用

    调试信息条件:-g或-gdbgcc -g -o test  test.cgcc -ggdb3 -o test test.cggdb3告诉gcc,使用gdb的扩展产生调试符号.其中“3”表示使用的是第三 ...

  3. C语言的乱七八糟

    Note For C Linux下C编程基础(gcc/gdb/make使用) 一.vi学习 二.初探emacs 三.gcc编译器 3.1 gcc所支持后缀名解释 后缀名 解释 后缀名 解释 .c C原 ...

  4. Linux Debugging(四): 使用GDB来理解C++ 对象的内存布局(多重继承,虚继承)

    前一段时间再次拜读<Inside the C++ Object Model> 深入探索C++对象模型,有了进一步的理解,因此我也写了四篇博文算是读书笔记: Program Transfor ...

  5. gdb 调试(查看运行时数据) 四

    在使用GDB调试程序时,触发断点后,可以使用print命令(简写为p),或是同义命令inspect来查看当前程序的运行数据.print命令的格式是: print <expr>    pri ...

  6. 用GDB调试程序(四)

    查看栈信息————— 当程序被停住了,你需要做的第一件事就是查看程序是在哪里停住的.当你的程序调用了一个函数,函数的地址,函数参数,函数内的局部变量都会被压入“栈”(Stack)中.你可以用GDB命令 ...

  7. Linux命令(十四)gdb调试

    1. gdb调试 fun.c #include <stdio.h> #include "head.h" int sum(int a, int b) { printf(& ...

  8. 【spring源码分析】IOC容器初始化——查漏补缺(四)

    前言:在前几篇查漏补缺中,其实我们已经涉及到bean生命周期了,本篇内容进行详细分析. 首先看bean实例化过程: 分析: bean实例化开始后 注入对象属性后(前面IOC初始化十几篇文章). 检查激 ...

  9. 潭州课堂25班:Ph201805201 django 项目 第四十六课 查错 补缺 (课堂笔记

    从讲项目开始,查找错误,完善笔记,尽可能 翻译没一句代码(以后台为主), 本项目亮点,也是重点 Django ORM中对数据查询的优化(only.defer.select_related) redis ...

  10. 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用到 ...

随机推荐

  1. VMware Component Manager服务无法启动

    近日,给一台Windows 2016上的vCenter打补丁,系统重启后,发现vmware的很多服务无法启动了.这是一台老版本的vcenter,虽然已经2021年了,但是它还管理着一些很老的ESX,比 ...

  2. WSUS下载速度和BITS服务

    近日,新装了一台WSUS服务器.选择好需要同步的补丁类型和语言版本后开始等待同步.通过过程异常缓慢,速度一直上不去.同步了一整天才30G,同步3T数据需要100天.这样肯定没办法用,所以要想办法提高下 ...

  3. paddleocr安装与图片识别快速开始

    本文首发我的个人博客:paddleocr安装教程快速开始 1. 安装Python环境 wget https://mirrors.huaweicloud.com/python/3.8.5/Python- ...

  4. Linux下从零开始创建lvm虚拟磁盘阵列+脚本化解决方案

    逻辑卷管理器(英语:Logical Volume Manager,缩写为LVM),又译为逻辑卷宗管理器.逻辑扇区管理器.逻辑磁盘管理器,是Linux核心所提供的逻辑卷管理(Logical volume ...

  5. MySQL8 二进制日志

    启用二进制日志 # cat /etc/my.cnf [mysqld] server_id=100 log_bin=/var/log/mysql/binlogs/server1 # mkdir -p / ...

  6. 使用Metricbeat监控zookeeper遇到的问题

    1.metricbeat中启动自动加载模块 metricbeat.config.modules: path: ${path.config}/modules.d/*.yml reload.enabled ...

  7. 开启tcp_timestamps和tcp_tw_recycle造成NAT转发连接不上

    文章转载自:https://segmentfault.com/a/1190000022264813

  8. 记录Gerrit2.8.4环境迁移、安装、配置以及问题解决

    转载自:https://cloud.tencent.com/developer/article/1010629 说到gerrit,没听说的同学可能会感到比较陌生,那么先来copy一段关于gerrit的 ...

  9. 自定义映射resultMap

    resultMap处理字段和属性的映射关系 如果字段名与实体类中的属性名不一致,该如何处理映射关系? 第一种方法:为查询的字段设置别名,和属性名保持一致 下面是实体类中的属性名: private In ...

  10. 文件管理工具“三剑客” #Everything #SpaceSniffer #Clover

    前言: 本文收集了我日常使用的三个文件管理工具: 文件搜索神器--Everything 磁盘文件占用分析工具--SpaceSniffer 文件资源管理器--Clover 下面我从工具解决的痛点和使用技 ...