GDB使用1:添加一个程序并且运行
本文目的
简单的介绍一下GDB是什么,有什么用,怎么用
前置知识点
- linux基本知识
- C++基本语法基础
- cmake基础(因为这里编译用的是cmake,懒得用make或者gcc了)
GDB工具简介
相关内容参考GDB User Manual
像gdb这样的调试器的目的是让您能够看到另一个程序在执行时“内部”发生了什么,或者另一个软件在崩溃时正在做什么。
本质上是在根据代码在编译的时候加入调试信息,可以让GDB这个进程介入到其他进程并且获取到调试信息。
前提是编译的时候加入了调试信息,也就是debug模式的编译。
debug模式和release模式的区别
- Debug:调试版本:包含调试信息,所以容量比Release大很多,并且不进行任何优化(优化会使调试复杂化,因为源代码和生成的指令间关系会更复杂),便于程序员调试。
- Release:发布版本:不对源代码进行调试,编译时对应用程序的速度进行优化,使得程序在代码大小和运行速度上都是最优的。
- 只有debug模式下才可以使用gdb进行进程的调试
GDB添加一个文件并且进行debug
1. 编写一个程序
这个代码是有问题的,这才值得GBD去调试
//NULL.c
#include<stdlib.h>
#include<stdio.h>
int main(int argc, char *argv[])
{
int * ptr = NULL;
*ptr = 1;
return 0;
}
2. 编译该程序
编译的方式有很多中,gcc,cmake,make都可以。
需要在debug模式下编译
cmake需要debug的时候加入了这样一句话
set(CMAKE_BUILD_TYPE "Debug")
3. 直接运行该程序
会报Segmentation fault
./NULL
Segmenttion fault (core has been dumped)
4. 使用GBD进行调试并且查看调试结果
NULL.c这个文件被我们编译成了名字叫做NULL的目标文件
gdb NULL
GNU gdb (Ubuntu 8.1.1-0ubuntu1) 8.1.1
Reading symbols from NULL...(no debugging symbols found)...done.
(gdb) run
Starting program: /home/monchell/Mon_workspace/project/draft/build/bin/NULL
Program received signal SIGSEGV, Segmentation fault.
0x00005555555546f7 in main ()
会告诉你在mian函数出现了segementation fault 的问题
查看头文件里面的priority_queue定义是这样的,使用了模板(会自动识别元素内容)
template<typename _Tp, typename _Sequence = vector<_Tp>,
typename _Compare = less<typename _Sequence::value_type> >
class priority_queue