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. 字节跳动 DanceCC 工具链系列之Xcode LLDB耗时监控统计方案

    作者:李卓立 仲凯宁 背景介绍 在<字节跳动 DanceCC 工具链系列之Swift 调试性能的优化方案>[1]一文中,我们介绍了如何使用自定义的工具链,来针对性优化调试器的性能,解决大型 ...

  2. (数据科学学习手札141)利用Learn Git Branching轻松学习git常用操作

    1 简介 大家好我是费老师,Git作为世界上最流行的版本控制系统,可以说是每一位与程序打交道的朋友最值得学习的软件之一.除了管理自己的项目,如果你对参与开源项目感兴趣,那么Git更是联结Github. ...

  3. 《Java基础——数组的定义与使用》

    Java基础--数组的定义与使用       一. 一维数组: 格式一: 数组类型 数组变量[]=new 数据类型[长度]; //需要后续赋值,且后续赋值时只能为单个元素赋值. 或 数组类型 数组变量 ...

  4. 解决RHEL7.3系统找不到yum命令,无法使用YUM源的问题

    前言 RHEL的YUM源需要注册用户才能更新使用,由于CentOS和RHEL基本没有区别,并且CentOS已经被REHL收购.所以将RHEL的YUM源替换为CentOS即可. [root@NISEC- ...

  5. 第六章:Django 综合篇 - 3:使用MySQL数据库

    在实际生产环境,Django是不可能使用SQLite这种轻量级的基于文件的数据库作为生产数据库.一般较多的会选择MySQL. 下面介绍一下如何在Django中使用MySQL数据库. 一.安装MySQL ...

  6. 从Spring Cloud微服务视角理解Kubernetes

  7. day42-反射01

    Java反射01 1.反射(reflection)机制 1.1反射机制问题 一个需求引出反射 请看下面问题: 根据配置文件 re.properties 指定信息,创建Cat对象并调用方法hi clas ...

  8. Mysql三种日志(binlog,redolog,undolog)的作用和区别

    Mysql有三种很重要的日志也是面试经常涉及到的考点,分别是 binlog .redo log和undo log, 这里面binlog 是server层实现的日志,而redo log 和undo lo ...

  9. 华为云ubunbu部署.NetCore3.1项目(DDD商城)

    提前项目打包发布,文件传输工具Filezilla,注意是选择sftp协议,将publish文件传到/home文件夹下 第一步  .NetCoreSDK安装 微软官方的文档https://docs.mi ...

  10. 分布式存储系统之Ceph集群MDS扩展

    前文我们了解了cephfs使用相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/16758866.html:今天我们来聊一聊MDS组件扩展相关话题: 我们 ...