前言
GDB (GNU 项目调试器)可以让您了解程序在执行时“内部” 究竟在干些什么,以及在程序发生崩溃的瞬间正在做什么。
GDB 做以下 4 件主要的事情来帮助您捕获程序中的 bug
◼ 在程序启动之前指定一些可以影响程序行为的变量或条件
◼ 在某个指定的地方或条件下暂停程序
◼ 在程序停止时检查已经发生了 什么
◼ 在程序执行过程中修改程序中的变量或条件,这样就可以体验修复一个bug 的成果,并继续了解其他 bug
一、GDB调试前准备
编译器的程序优化选项一般有五个级别,从 O0 ~ O4 注意第一个 O0 ,是字母 O 加上数字 0 O0 表示不优化,从 O1 ~ O4 优化级别越来越高, O4 最高。这样做的目的是为了调试的时候,符号文件显示的调试变量等能与源代码完全对应起来。优化越高符号文件提供的信息越少。
二、GDB调试原理
一般要调试某个程序,为了能清晰地看到调试的每一行代码、调用的堆栈信息、变量名和函数名等信息,需要调试程序含有调试符号信息
。使用 gcc 编译程序时,如果加上-g
选项即可在编译后的程序中保留调试符号信息
。
三、GDB环境搭建
一般情况下linux 系统自带gdb,如果不存在可以自行安装,可以通过源码安装和yum install gdb 傻瓜式安装。
检查是否存在
[root@localhost ~]# gdb --v GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-120.el7 Copyright (C) 2013 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "x86_64-redhat-linux-gnu". For bug reporting instructions, please see: <http://www.gnu.org/software/gdb/bugs/>.
四、GDB 调试的方式
GDB调试 主要 有三种方式:
- gdb filename
- gdb attach pid 附加进程附加进程
- gdb filename corename 调试调试 core 文件文件
五、GDB调试命令
1.退出命令
gdb输入命令:输入quit(q)或者 Ctrl-d 来退出
2.常用命令
命令 | 缩写 | 含义 |
run | r | 运行一个程序 |
continue | c | 让暂停的程序继续运行 |
next | n | 运行到下一行 |
step | s | 如果有调用函数,进入调用的函数内部,相当于 step into |
until | u | until number 运行到指定行停下来 |
finish | fi | 结束当前调用函数,到上一层函数调用处 |
return | return | 结束当前调用函数并返回指定值,到上一层函数调用处 |
jump | j | 将当前程序执行流跳转到指定行或地址 |
p | 打印变量或寄存器值 | |
backtrace | bt | 查看当前线程的调用堆栈 |
frame | f | 切换到当前调用线程的指定堆栈,具体堆栈通过堆栈序号指定 |
thread | thread | 切换到指定线程 |
break | b | 添加断点 |
tbreak | tb | 添加临时断点 |
delete | del | 删除断点 |
enable | enable | 启用某个断点 |
disable | disable | 禁用某个断点 |
watch | watch | 监视某一个变量或内存地址的值是否发生变化 |
list | l | 显示源码 info info 查看断点 / 线程等信息 |
ptype | ptype | 查看变量类型 |
disassemble | dis | 查看汇编代码 |
set args | 设置程序启动命令行参数 | |
show args | 查看设置的命令行参数 |
tui | 是一个命令行的界面,能同时把代码显示出来 | |
detach | 分离程序和gdb调试程序 |
3.条件断点命令
设置条件断点的命令:break [location] if condition
使用 condition N condition. N是一个 breakpoint number.
4.多线程
多线程下禁止线程切换: set scheduler-locking on
参考
总结
以上就是今天要讲的内容,本文仅仅简单介绍了gdb的使用方法。此系类文章计划介绍gdb的基本原理和简单实用,cgdb使用,符号表等。