C语言——gdb调试

一、gdb基础

前提:在gcc编译时,要输入-g选项;

步骤:

1.gdb进入GDB调试模式
2.file 可执行文件名 
3.pwd显示当前目录
4.l列出源码(前提是编译时选择了-g选项)
5.b 行号:设置断点;
  tb 行号 :设置临时性断点,与断点不同,临时断点只在第一次执行时起作用
6.r:开始执行
单步执行:n(TIPs1:可以按回车重复上一次操作,在单步调试时这个feature很有用)。
单步进入:s
继续执行:c(走到下一个断点处)
7.bt:查看当前函数运行的堆栈
8.info 参数:查看相关的信息:例如:info break,info watchpoints
9.watch 变量名:查看变量值
10.finish :退出当前函数
11.quit:退出调试
12.delete breakpoints 2:删除第二个断点
13.disable/enable breakpoints 3 :禁用/启用第三个断点
14.frame:显示当前栈及其变量

core dump:Coredump叫做核心转储,它是进程运行时在突然崩溃的那一刻的一个内存快照。操作系统在程序发生异常而异常在进程内部又没有被捕获的情况下,会把进程此刻内存、寄存器状态、运行堆栈等信息转储保存在一个文件里。

二、开启core dump模式:

1.在shell命令行设置:ulimit -c unlimited

2.自定义core文件的命名格式:echo ./core_%e_%t_%p > /proc/sys/kernel/core_pattern

3.进入core文件调试:gdb 程序名 core文件名 

三、文章分享

以下内容为转载:
 

/**********************************************************************************
gcc -g  main.c                      //在目标文件加入源代码的信息
gdb a.out       

(gdb) start                         //开始调试
(gdb) n                             //一条一条执行
(gdb) step/s                        //执行下一条,如果函数进入函数
(gdb) backtrace/bt                  //查看函数调用栈帧
(gdb) info/i locals                 //查看当前栈帧局部变量
(gdb) frame/f                       //选择栈帧,再查看局部变量
(gdb) print/p                       //打印变量的值
(gdb) finish                        //运行到当前函数返回
(gdb) set var sum=0                 //修改变量值
(gdb) list/l 行号或函数名             //列出源码
(gdb) display/undisplay sum         //每次停下显示变量的值/取消跟踪
(gdb) break/b  行号或函数名           //设置断点
(gdb) continue/c                    //连续运行
(gdb) info/i breakpoints            //查看已经设置的断点
(gdb) delete breakpoints 2          //删除某个断点
(gdb) disable/enable breakpoints 3  //禁用/启用某个断点
(gdb) break 9 if sum != 0           //满足条件才激活断点
(gdb) run/r                         //重新从程序开头连续执行
(gdb) watch input[4]                //设置观察点
(gdb) info/i watchpoints            //查看设置的观察点
(gdb) x/7b input                    //打印存储器内容,b--每个字节一组,7--7组
(gdb) disassemble                   //反汇编当前函数或指定函数
(gdb) si                            // 一条指令一条指令调试 而 s 是一行一行代码
(gdb) info registers                // 显示所有寄存器的当前值
(gdb) x/20 $esp                    //查看内存中开始的20个数
*********************************************************************************/

还有两篇实操文:

https://www.cnblogs.com/life2refuel/p/5396538.html

core dump使用:

https://blog.csdn.net/sunxiaopengsun/article/details/72974548

 

 

你可能感兴趣的:(linux,c)