网站备案 影响吗,丹徒网站建设报价,怎么做领券网站,河南网站搭建文档
一.gdb打印demo.cpp运行结果
在CMakeLists.txt中添加
set(CMAKE_BUILD_TYPE Debug)
然后make以后通过gdb filename进入该文件的gdb调试模式,同时使用shell 就可以像终端一样使用shell命令。
例子:
demo.cpp
#include iostream
#include vector
#i…文档
一.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){couttestendl;}
};
class Myadd{
public:int operator()(int num1, int num2){return num1num2;}
};void test06(){MyPrint m;m(hello world);Myadd a;int res a(10,100);coutres:resendl;coutMyadd()(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){couttestendl;}
};
class Myadd{
public:int operator()(int num1, int num2){return num1num2;}
};
//
//ostream operator(ostream cout, Person p){//benzhi operator(cout, p) jianhua coutp;
// coutp.m_A:p.m_A p.m_Bp.m_B;
// return cout;
//}void test06(){MyPrint m;m(hello world);Myadd a;int res a(10,100);coutres:resendl;coutMyadd()(10,100):Myadd()(10,100)endl;
}
int main(int argc, char** argv)
{if(argc ! 2){coutneed argvendl;}coutargv[0]:argv[0]endl;coutargv[1]:argv[1]endl;coutargv[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){couti:iendl;if(i 5){k;}}
}
int main(int argc, char** argv)
{if(argc ! 2){coutneed argvendl;}coutargv[0]:argv[0]endl;coutargv[1]:argv[1]endl;coutargv[2]:argv[2]endl;test06();
} 可看出添加b 29 if i5时 在i5时就停了下来按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){couti:iendl;if(i 5){k;}}
}
int main(int argc, char** argv)
{if(argc ! 2){coutneed argvendl;}coutargv[0]:argv[0]endl;coutargv[1]:argv[1]endl;coutargv[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){couti:iendl;if(i 5){k;}}
}
int main()
{coutgdb error testendl;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();coutname1 is: name1endl;coutage1 is: age1endl;coutname2 is: name2endl;coutage2 is: age2endl;
} backtrace 简写bt,查询到错误代码编号 在frame 0
frame 1 然后就找到是不是s1这个指针的问题。