gdb基础知识

文档

一.gdb打印demo.cpp运行结果

在CMakeLists.txt中添加 

set(CMAKE_BUILD_TYPE Debug)

然后make以后通过gdb filename进入该文件的gdb调试模式,同时使用shell 就可以像终端一样使用shell命令。

例子:

demo.cpp

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;class MyPrint{
public:void operator()(string test){cout<<test<<endl;}
};
class Myadd{
public:int operator()(int  num1, int num2){return num1+num2;}
};void test06(){MyPrint m;m("hello world");Myadd a;int res = a(10,100);cout<<"==res:"<<res<<endl;cout<<"==Myadd()(10,100):"<<Myadd()(10,100)<<endl;
}
int main()
{test06();
}

CMakeLists.txt 

cmake_minimum_required(VERSION 3.4.1)
project(Infantry)set(CMAKE_BUILD_TYPE Debug)
set(SRC_LIST demo.cpp)
add_executable(demo ${SRC_LIST})

mkdir build

cd build

cmake ..

make

gdb demo

run

shell ls

二.gdb的一些基础命令

1.man gdb

在终端下执行 man gdb查看帮助文档

2.help b

在gdb下执行 help b,,就可以得到break的说明使用

3.list查看代码

show listsize查看展示的行数

set listsize 20

设置展示20行

list 7就是表示从第7行开始展示。

4.set args

对函数传参

demo.cpp

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;class MyPrint{
public:void operator()(string test){cout<<test<<endl;}
};
class Myadd{
public:int operator()(int  num1, int num2){return num1+num2;}
};
//
//ostream& operator<<(ostream& cout, Person& p){//benzhi  operator<<(cout, p) jianhua  cout<<p;
//    cout<<"==p.m_A:"<<p.m_A<<" ==p.m_B"<<p.m_B;
//    return cout;
//}void test06(){MyPrint m;m("hello world");Myadd a;int res = a(10,100);cout<<"==res:"<<res<<endl;cout<<"==Myadd()(10,100):"<<Myadd()(10,100)<<endl;
}
int main(int argc, char** argv)
{if(argc != 2){cout<<"need argv"<<endl;}cout<<"==argv[0]:"<<argv[0]<<endl;cout<<"==argv[1]:"<<argv[1]<<endl;cout<<"==argv[1]:"<<argv[2]<<endl;test06();
}

set args 对main函数传参 

5.continue

可以简写为c,表示继续执行,可以使用在添加断点后继续执行。

例如在41行设定断点后,run执行,在30行执行断点,c继续执行。

6. delete

简写为d.

d取消所有的断点设置

7. b main

通过函数名字方式加断点,b main就是在main函数加断点, run以后就可以 c继续执行。

8.b linenumber if 语句

满足if 条件就断在此处

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;void test06(){int k = 0;for(int i = 0 ;i < 10; i++){cout<<"==i:"<<i<<endl;if(i == 5){k++;}}
}
int main(int argc, char** argv)
{if(argc != 2){cout<<"need argv"<<endl;}cout<<"==argv[0]:"<<argv[0]<<endl;cout<<"==argv[1]:"<<argv[1]<<endl;cout<<"==argv[2]:"<<argv[2]<<endl;test06();
}

可看出添加b 29 if i==5时, 在i==5时就停了下来,按c继续执行完后面。

9. info breakpoints

查看所有的断点情况。

10.next

next简写为n,可以单步运行

11.disable linenumber

取消掉第几行断点

可看出 disable 1以后,就把该断点取消掉了(keep后面是n),跟delete还不一样。

enable linenumber就可以恢复。

12.print

print可以打印当前的值(或者打印函数),可看出执行到当前断点位置后,print变量就可以打印出变量的值。

print也可以用来改变变量的值,见13.display有示例。

13.display 

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;void test06(){int k = 0;for(int i = 0 ;i < 10; i++){cout<<"==i:"<<i<<endl;if(i == 5){k++;}}
}
int main(int argc, char** argv)
{if(argc != 2){cout<<"need argv"<<endl;}cout<<"==argv[0]:"<<argv[0]<<endl;cout<<"==argv[1]:"<<argv[1]<<endl;cout<<"==argv[2]:"<<argv[2]<<endl;test06();
}

display 监测某个变量的值,要注意的是在变量作用域内才能监测

通过b 26设置断点,run以后,在display k,一步一步执行n就可以发现k的值变化了

print k = 10

通过print改变k的值

而delete display或者disable display就是取消监测。

14.jump

jump linenubmer 直接跳到某行

15.gdb查找segmentation fault

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;class Student{
public:Student(int _age, string _name):age_(_age), name_(_name){}int getAge(){return age_;}string getName(){return name_;}private:int age_;string name_;
};void test06(){int k = 0;for(int i = 0 ;i < 10; i++){cout<<"==i:"<<i<<endl;if(i == 5){k++;}}
}
int main()
{cout<<"===gdb error test==="<<endl;Student *s1 = new Student(10, "Tom");Student *s2 = new Student(15, "Jack");s1 = NULL;int age1 = s1->getAge();string name1 = s1->getName();int age2 = s2->getAge();string name2 = s2->getName();cout<<"name1 is: "<<name1<<endl;cout<<"age1 is: "<<age1<<endl;cout<<"name2 is: "<<name2<<endl;cout<<"age2 is: "<<age2<<endl;
}

backtrace 简写bt,查询到错误代码编号

在frame 0

frame 1

然后就找到是不是s1这个指针的问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/493083.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

重磅!罗振宇跨年演讲:扎心5问

来源&#xff1a;亿欧网摘要&#xff1a;我们不断追问“这个世界到底是什么样子的&#xff1f;”今年罗振宇在“2018时间的朋友跨年演讲”中给出的解题思路是&#xff1a;小趋势。2018年12月31日晚&#xff0c;“2018时间的朋友跨年演讲”在深圳春茧体育馆拉开帷幕。从4000人的…

C++ opencv的一些基础知识

一&#xff0e;基础知识 1.cv::mat type返回数字对应的类型 C1, C2, C3, C4 指的是通道(Channel)数&#xff0c;比如3通道的float 32&#xff1a; cv::Mat M5 cv::Mat::zeros(2, 3, CV_32FC(3)); 2.at方法数据类型 知道通道数和每个通道数据类型的情况下&#xff0c;指定给…

难以想象!未来十年,颠覆性技术将带来这些社会变革……

作者&#xff1a;张一清来源&#xff1a;财新《中国改革》摘要&#xff1a;技术飞速进步改变生活&#xff0c;人类是否准备好迎接它们给生活、制度和文化带来的挑战&#xff1f;现代社会&#xff0c;技术的更新速度永远比你想得更快。当感叹技术的飞速进步&#xff0c;当憧憬技…

C++模板的一些基础知识

一.函数模板 可看出就是将函数返回类型和形参类型去掉。 1.代码1 #include <iostream> #include <vector> #include <string> #include <algorithm> #include <map> #include <fstream> using namespace std;template<typename T>…

芯片热!价格战!争落地!2018年人工智能发展回忆录

来源&#xff1a;网易智能摘要&#xff1a;2018年是非同寻常的一年&#xff0c;对于人工智能行业而言更是如此。在这一年&#xff0c;几乎所有科技公司宣布全面拥抱AI&#xff0c;在这一年&#xff0c;巨头深入布局&#xff0c;挤压着创业者的想象空间&#xff0c;在这一年&…

如何附加数据库

转载于:https://www.cnblogs.com/tanqianqian/p/5975072.html

a16z基金:顶级风投眼中的2019技术趋势

来源&#xff1a;资本实验室位于硅谷的顶级风险投资公司——安德森霍洛维兹基金&#xff08;Andreessen Horowitz&#xff0c;简称a16z&#xff09;在近期提出了他们将在2019年遵循的五大技术趋势&#xff0c;涉及生物医疗、数字货币与区块链、人工智能等技术领域。从字面上来看…

新算力下的2019 AI

来源&#xff1a;乐晴智库精选▌AI步入下半场IT每十年一阶段形成六大阶段每一轮科技革命都会带来新的赢家基础设施—通用平台—应用层的发展路径每一轮科技革命均印证基础设施先行的发展路径基础设施与通用平台易形成寡头垄断应用层的发展愈来愈依托于生态云计算厂商的资本开支…

leetcode动态规划(python与c++)

1 . 斐波那契数 class Solution:def fib(self, n: int) -> int:# if n0:# return 0# elif n1:# return 1# else:# return self.fib(n-1)self.fib(n-2)a 0b 1for i in range(n):a,b b,abreturn a class Solution { public:int fib(int n) {int a 0, b 1;fo…

互联网50年类脑架构技术演化图

作者&#xff1a;刘锋 计算机博士 互联网进化论作者摘要&#xff1a;不断的有著名科学家或企业家提出互联网已死&#xff0c;将被新技术取代&#xff0c;最近绘制了一幅互联网50年的技术演化图&#xff0c;试图说明互联网从1969年四台计算机的网状结构发展成2019类脑结构的过程…

小孔成像中四个坐标系转换

一.小孔成像基础知识: 1.1透镜成像原理 如图所示&#xff1a; 其中 u 为物距&#xff0c; f 为焦距&#xff0c;v 为相距。三者满足关系式&#xff1a; 相机的镜头是一组透镜&#xff0c;当平行于主光轴的光线穿过透镜时&#xff0c;会聚到一点上&#xff0c;这个点叫做焦点&…

这10项机器人领域的核心技术,你了解多少

来源&#xff1a;机器人创新生态NO 1&#xff0e;人机对话智能交互技术这项技术能让人类做到真正与机器智能的对话交流&#xff0c;机器人不仅能理解用户的问题并给出精准答案&#xff0c;还能在信息不全的情况下主动引导完成会话。当前这一块做得比较成熟的谷歌与Facebook。NO…

leetcode哈希表(python与c++)

1.整数转罗马数字 python: class Solution:def intToRoman(self, num: int) -> str:dict_ {1000:M, 900:CM, 500:D, 400:CD, 100:C, 90:XC, 50:L, 40:XL, 10:X, 9:IX, 5:V, 4:IV, 1:I}res for key in dict_:count num // keyres count * dict_[key]num % keyreturn res…

Yann LeCun、吴恩达的新年AI预测:强调“少样本学习”,AI恐慌在减少

来源&#xff1a;大数据文摘新年伊始&#xff0c;海外媒体VentureBeat电话访谈了包括吴恩达、Yann Lecun在内的四位人工智能领域领军者&#xff0c;询问了他们对于过去一年人工智能领域发展的看法&#xff0c;以及他们认为新一年人工智能和机器学习可能产生的突破。不约而同&am…

1.C#WinForm基础制作简单计算器

利用c#语言编写简单计算器&#xff1a; 核心知识点&#xff1a; MessageBox.Show(Convert.ToString(comboBox1.SelectedIndex));//下拉序号MessageBox.Show(Convert.ToString(comboBox1.SelectedItem));//下拉内容MessageBox.Show(Convert.ToString(comboBox1.SelectedText));/…

seaborn的一些画图

一.数据查看 数据集地址,用红白酒为例&#xff0e; import pandas as pd import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D import matplotlib as mpl import numpy as np import seaborn as snswhite_wine pd.read_csv(winequality-white.csv, se…

后摩尔定律时代的芯片新选择!

来源&#xff1a;gizmodo摘要&#xff1a;很长一段时间以来&#xff0c;摩尔定律和它的最终结局一直就像房间里的大象&#xff0c;不容忽视。英特尔联合创始人戈登摩尔在1965年的一篇论文中预测&#xff0c;芯片中的晶体管数量每年将翻一番。更多的晶体管意味着更快的速度&…

MSE和Cross-entropy梯度更新比较

一.平方损失(MSE) Loss函数: 梯度: 由于x,y是已知的&#xff0c;故可以忽略掉 梯度更新: sigmoid函数: 可以看出 导数在z取大部分值&#xff0c;都是很小的&#xff0c;这样会使梯度更新慢&#xff0e; y为1或0是&#xff0c;当a1,w的梯度为0,a0,w的梯度为0&#xff0c;故就…

麦卡锡问答:什么是人工智能?

来源&#xff1a;科学网一、基本问题问&#xff1a;什么是人工智能&#xff1f;答&#xff1a;人工智能是研制智能机器尤其是智能计算机程序的科学与工程。它与使用计算机理解人类智能类似&#xff0c;但人工智能并不将它自己局限于生物意义上的方法。问&#xff1a;是的&#…

操作系统--多进程管理CPU

一.cpu管理直观做法 最只管想法cpu循环取址执行&#xff0c;所以只需要设好pc初值即可 存在问题:io会占用时间长&#xff0c;导致cpu利用率低. 所以需要不停切换&#xff0c;执行多个程序&#xff0c;也就是并发&#xff0e; 但是在切换的时候&#xff0c;除了记录返回地址&a…