Linux之GDB学习

GDB是一款优秀的调试工具,懂的人自然懂,一直以来用它都没有好好整理过使用方法,我用的也是皮毛,目前先整理一下皮毛,日后再更新

使用方法

编译C++

从编译的角度上来说,需要在编译的时候加上-g参数,生成调试信息,否则GDB无法对该程序进行Debug

$ gcc -g main.cc

启动GDB

$ gdb /your/program即可

设置命令行参数

set args 给args变量赋值

(gdb) set args -a -b$ gdb /your/program -a -b

查看当前的参数使用(gdb) show args

python程序的调试也可以使用$ gdb python main.py

装载程序

file FILE 装载指定的可执行文件进行调试

如果只是打开了gdb程序没有初始化装载程序,可以通过file命令装载可执行文件

cd directory 改变当前工作目录

pwd 显示当前工作目录

装载可执行文件的时候也有工作目录的说法,可以通过cd命令切换

浏览程序

list linenum 显示当前源文件的指定行数

list function 显示当前源文件的指定函数

list filename 显示指定的源文件

list filename:linenum 显示指定的源文件的指定行数,函数同理

list 显示下一个listsize大小的源代码,可以通过set/show命令修改大小,默认10行

list - 显示最后一次list的前面listsize的源代码

浏览源代码对于定位core dump发生的原因,定位设断点的位置都特别有帮助

设置断点

breakpoints:

break linenum 在当前源文件的指定行数设置断点

break function 在当前源文件的指定函数设置断点

break filename:linenum 在指定源文件的指定行数设置断点,函数同理

break something if condition 条件断点,符合条件的时候断点才会触发

watchpoints:

watch expr 当应用程序写expr,修改其值时触发

rwatch expr 当应用程序读expr的值时触发

awatch expr 当应用程序读取或写入expr的值时触发

catchpoints:

catct event 在发生某种事件的时候触发

tcatch event 同上,但只停一次,生效后自动删除

事件一般类型为:throw、catch、exec、fork、load、syscall等

断点是调试的中间过程的记录,在循环的地方多使用条件断点,可以减少很多的人工操作

断点管理:

info breakpoint 查看断点

delete breakpoint num 删除断点

disable breakpoint num 禁用断点

enable breakpoint num 启用断点

删除或禁用一些断点有利于程序的快速执行,比如一个断点已经测试几次都没运行崩溃,说明这个断点没问题,可以不要了

运行程序

run 运行装载的可执行程序

step 运行下一行代码,遇到函数时进入函数

next 运行下一行代码,遇到函数时运行整个函数

continue 断点触发后,继续执行

call function 调用和执行特定的函数

一般情况下,我也只使用这些,目前也够用了,call命令可以多次测试一个函数在不同参数下的运行情况

查看变量

print variable 打印一个变量

whatis variable 打印一个变量的类型

ptype variable 打印一个struct或class的定义

backtrace 打印程序中的当前位置和表示如何到达当前位置的栈跟踪

set variable 可以修改一个变量的值,但一般情况下不建议人为地去修改这些变量的值

backtrace是一个好命令,遇到core dump的时候使用很方便

万能的命令

help COMMAND 显示指定命令的帮助信息

缩写映射表

b -> break
c -> continue
d -> delete
i -> info
l -> list
n -> next
p -> print
r -> run
s -> step
u -> until
bt -> backtrace
aw -> awatch
rw -> rwatch
wa -> watch

初期使用GDB的时候不建议记忆和使用缩写,后期你自然就会因为懒得写多两个字母而自然而然地使用缩写了

Linux之GDB学习的更多相关文章

  1. Linux系统新手学习的11点建议

    随着Linux应用的扩展许多朋友开始接触Linux,根据学习Windwos的经验往往有一些茫然的感觉:不知从何处开始学起.这里介绍学习Linux的一些建议. 一.从基础开始:常常有些朋友在Linux论 ...

  2. Linux操作系统入门学习总结(2015.10)

    用了差不多45天的时间把Linux操作系统入门的资料学习了下.主要阅读了以下几本书: 鸟哥的私房菜:Linux基础学习篇(第三版) "Running Linux" <LINU ...

  3. (转)Linux基础知识学习

    Linux基础知识学习 原文:http://blog.csdn.net/ye_wei_yang/article/details/52777499 一.Linux的磁盘分区及目录 Linux的配置是通过 ...

  4. 针对于linux初学者的学习(摘自网络端)

    一. 选择适合自己的Linux发行版谈到linux的发行版本,太多了,可能谁也不能给出一个准确的数字,但是有一点是可以肯定的,linux正在变得越来越流行, 面对这么多的Linux 发行版,打算从其他 ...

  5. Linux 系统编程 学习:03-进程间通信1:Unix IPC(2)信号

    Linux 系统编程 学习:03-进程间通信1:Unix IPC(2)信号 背景 上一讲我们介绍了Unix IPC中的2种管道. 回顾一下上一讲的介绍,IPC的方式通常有: Unix IPC包括:管道 ...

  6. 3.1.5 LTP(Linux Test Project)学习(五)-LTP代码学习

    3.1.5 LTP(Linux Test Project)学习(五)-LTP代码学习 Hello小崔 ​ 华为技术有限公司 Linux内核开发 2 人赞同了该文章 LTP代码学习方法主要介绍两个步骤, ...

  7. 20135231 —— Linux 基础入门学习

    20135231 何佳 学习计时:共12小时 读书:5 代码:2 作业:2 博客:3 一.学习目标 1. 能够独立安装Linux操作系统 2. 能够熟练使用Linux系统的基本命令 3. 熟练使用Li ...

  8. gdb学习

    gdb学习 [参考资料] http://www.cnblogs.com/jiu0821/p/4483804.html 程序的运行状态有"运行"."暂停".&qu ...

  9. Linux进程间通信IPC学习笔记之同步二(SVR4 信号量)

    Linux进程间通信IPC学习笔记之同步二(SVR4 信号量)

随机推荐

  1. 23种设计模式+J2EE设计模式学习笔记-初识设计模式

    设计模式简介: 设计模式是一套被反复使用的.多数人知晓的.经过分类编目的.代码设计经验的总结.(个人理解:设计模式是不关乎业务,逻辑实现,针对普遍问题的一种解决方案). 设计模式的类型: 传统23种设 ...

  2. Java集合之LinkedHashMap源码分析

    概述 HashMap是无序的, 即put的顺序与遍历顺序不保证一样. LinkedHashMap是HashMap的一个子类, 它通过重写父类的相关方法, 实现自己的功能. 它保留插入的顺序. 如果需要 ...

  3. 洛谷P2178 [NOI2015]品酒大会(后缀自动机 线段树)

    题意 题目链接 Sol 说一个后缀自动机+线段树的无脑做法 首先建出SAM,然后对parent树进行dp,维护最大次大值,最小次小值 显然一个串能更新答案的区间是\([len_{fa_{x}} + 1 ...

  4. 【读书笔记】iOS-访问网络

    iOS平台是按照一直有网络连接的思路来设计的,开发者利用这一特点创造了很多优秀的第三方应用.大多数的iOS应用都需要联网,甚至有些应用严重依赖网络,没有网络就无法正常工作. "在访问网络失败 ...

  5. Java抽象类和接口的比较

    一个软件设计的好坏,我想很大程度上取决于它的整体架构,而这个整体架构其实就是你对整个宏观商业业务的抽象框架,当代表业务逻辑的高层抽象层结构 合理时,你底层的具体实现需要考虑的就仅仅是一些算法和一些具体 ...

  6. java代码代替xml实现图片

    1.使用StateListDrawable替换selector public static StateListDrawable getSelector(Drawable normalDrawable, ...

  7. 【Java入门提高篇】Day26 Java容器类详解(八)HashSet源码分析

    前面花了好几篇的篇幅把HashMap里里外外说了个遍,大家可能对于源码分析篇已经讳莫如深了.别慌别慌,这一篇来说说集合框架里最偷懒的一个家伙——HashSet,为什么说它是最偷懒的呢,先留个悬念,看完 ...

  8. 简述 Spring Cloud 是什么1

    很多同学都了解了Spring ,了解了 Spring Boot, 但对于 Spring Cloud 是什么还是比较懵逼的. 本文带你简单的了解下,什么是Spring Cloud. Spring Clo ...

  9. [20180503]珅与分隔符.txt

    [20180503]珅与分隔符.txt --//今天再次遇到分隔符问题,以前也遇到过做一次,链接.http://blog.itpub.net/267265/viewspace-763696/--//这 ...

  10. 洗礼灵魂,修炼python(23)--自定义函数(4)—闭包进阶问题—>报错UnboundLocalError: local variable 'x' referenced before assignment

    闭包(lexical closure) 什么是闭包前面已经说过了,但是由于遗留问题,所以单独作为一个章节详解讲解下 不多说,看例子: def funx(x): def funy(y): return ...