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;指定给…

centos 6.5 x64编译有python的vim7.4

wget ftp://ftp.vim.org/pub/vim/extra/vim-7.2-extra.tar.gzwget ftp://ftp.vim.org/pub/vim/extra/vim-7.2-lang.tar.gzwget ftp://ftp.vim.org/pub/vim/unix/vim-7.4.tar.bz2 下载后&#xff0c;解压 tar jxf vim-7.4.tar.bz2tar zxf vim-7.2-extra.tar.gztar zxf vim-7.2-l…

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

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

硬件工程师电路设计必须紧记的十大要点

一、电源是系统的血脉&#xff0c;要舍得成本&#xff0c;这对产品的稳定性和通过各种认证是非常有好处的。1.尽量采用∏型滤波&#xff0c;增加10uH电感&#xff0c;每个芯片电源管脚要接104旁路电容;2.采用压敏电阻或瞬态二极管&#xff0c;抑制浪涌&#xff1b;3.模电和数电…

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;涉及生物医疗、数字货币与区块链、人工智能等技术领域。从字面上来看…

CXF 调用C#.net的WebService

原文链接&#xff1a;http://hi.baidu.com/pengfeiiw/blog/item/3203e29065aa3a8aa977a4d0.html 1.编写C#.net的WebService Service.cs using System;using System.Web;using System.Web.Services;using System.Web.Services.Protocols; [WebService(Namespace "http://l…

新算力下的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…

CSDN之人人code,整数取反

题目描述&#xff1a;要求实现把给定的一个整数取其相反数的功能&#xff0c;举两个例子如下&#xff1a;x 123, return 321 x -123, return -321&#xff1b; 解题思路&#xff1a;对int a进行判断&#xff0c;如果a的大小不等于0&#xff1b;则定义一个变量temp等于temp*10…

算法总结之欧拉函数中国剩余定理

算法总结之欧拉函数&中国剩余定理 1.欧拉函数 概念&#xff1a;在数论&#xff0c;对正整数n&#xff0c;欧拉函数是少于或等于n的数中与n互质的数的数目。 通式&#xff1a;φ(x)x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…..(1-1/pn) 其中p1, p2……pn为x的所有质因数&#xf…

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

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

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

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

不带头结点的单链表的建立

建立该链表利用的是尾插法 // 创建一个单链表&#xff0c;没有头结点&#xff0c; #include <iostream> #include <ctime>using namespace std; //------------------------------------------------ //************************************************ // 结构名…

page.ClientScript.RegisterStartupScript

page.ClientScript.RegisterStartupScript&#xff08;&#xff09;可以添加客户端脚本&#xff0c;有4个参数 type&#xff1a;要注册的启动脚本的类型。key&#xff1a;要注册的启动脚本的键。script&#xff1a;要注册的启动脚本文本。addScriptTags&#xff1a;指示是否添加…

这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…