C++学习笔记(38)

304、gdb 的常用命令

如果程序有问题,不要问别人为什么会这样,而是立即动手调试。 一、安装 gdb

yum -y install gdb

二、gdb 常用命令

如果希望程序可调试,编译时需要加-g 选项,并且,不能使用-O 的优化选项。

gdb 目标程序

命令 简写 命令说明

set args 设置程序运行的参数。

例如:./demo 张三 西施 我是一只傻傻鸟

设置参数的方法是:

set args 张三 西施 我是一只傻傻鸟

break b 设置断点,b 20 表示在第 20 行设置断点,可以设置多个断点。

run r 开始运行程序, 程序运行到断点的位置会停下来,如果没有遇到断点,程序一直

运行下去。

next n 执行当前行语句,如果该语句为函数调用,不会进入函数内部。 VS 的 F10

step s 执行当前行语句,如果该语句为函数调用,则进入函数内部。VS 的 F11

注意了,如果函数是库函数或第三方提供的函数,用 s 也是进不去的,因为没有

源代码,如果是自定义的函数,只要有源码就可以进去。

print p 显示变量或表达式的值,如果 p 后面是表达式,会执行这个表达式。

continue c 继续运行程序,遇到下一个断点停止,如果没有遇到断点,程序将一直运行。

VS 的 F5

set var 设置变量的值。

假设程序中定义了两个变量:

int ii;

char name[21];

set var ii=10 把 ii 的值设置为 10;

set var name="西施"。

quit q 退出 gdb。

注意:在 gdb 中,用上下光标键可以选择执行过的 gdb 命令。 三、示例

#include <iostream>

using namespace std;

void show(const char *name1,const char *name2,const char *message)

{

cout << name1 << "开始表白。\n";

cout << name2 << ":" << message << endl;

}

int main(int argc,char *argv[],char *envp[])

{

if (argc!=4)

{

cout << "表白神器程序的使用方法:./demo 追求者姓名 被追求者姓名 表白内容\n"; return

-1;

}

cout << "表白前的准备工作一。\n";

cout << "表白前的准备工作二。\n";

cout << "表白前的准备工作三。\n";

cout << "表白前的准备工作四。\n";

cout << "表白前的准备工作五。\n";

show(argv[1],argv[2],argv[3]);

cout << "表白完成。\n";

for (int ii=0;ii<10;ii++)

{

string str="这是第"+to_string(ii)+"个超级女生。";

cout << str << endl;

}

return 0;

}

305、gdb 调试 core 文件

如果程序在运行的过程中发生了内存泄漏,会被内核强行终止,提示"段错误(吐核)",内存的状

态将保存在 core 文件中,方便程序员进一步分析。

Linux 缺省不会生成 core 文件,需要修改系统参数。

调试 core 文件的步骤如下:

1)用 ulimit -a 查看当前用户的资源限制参数;

2)用 ulimit -c unlimited 把 core file size 改为 unlimited;

3)运行程序,产生 core 文件;

4)运行 gdb 程序名 core 文件名;

5)在 gdb 中,用 bt 查看函数调用栈。

示例:

#include <cstring>

#include <iostream>

using namespace std;

void bb(const int bh,const string xm)

{

char *ptr=nullptr; *ptr=3;

//strcpy(ptr,xm.c_str());

}

void aa(const int no,const string name)

{

bb(3,"冰冰");

}

int main()

{

aa(8,"西施");

return 0;

}

306、gdb 调试正在运行中的程序

gdb 程序名 -p 进程编号

示例:

#include <unistd.h>

#include <iostream>

using namespace std;

void bb(const int bh,const string xm)

{

for (int ii=0;ii<1000000;ii++)

{

sleep(1);

cout << "ii=" << ii << endl;

}

}

void aa(const int no,const string name)

{

bb(3,"冰冰");

}

int main()

{

aa(8,"西施");

return 0;

}

相关推荐
捕鲸叉1 小时前
创建线程时传递参数给线程
开发语言·c++·算法
A charmer1 小时前
【C++】vector 类深度解析:探索动态数组的奥秘
开发语言·c++·算法
Peter_chq1 小时前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
aloha_7892 小时前
从零记录搭建一个干净的mybatis环境
java·笔记·spring·spring cloud·maven·mybatis·springboot
青花瓷2 小时前
C++__XCode工程中Debug版本库向Release版本库的切换
c++·xcode
dsywws3 小时前
Linux学习笔记之vim入门
linux·笔记·学习
晨曦_子画4 小时前
3种最难学习和最容易学习的 3 种编程语言
学习
幺零九零零4 小时前
【C++】socket套接字编程
linux·服务器·网络·c++
城南vision4 小时前
Docker学习—Docker核心概念总结
java·学习·docker
捕鲸叉4 小时前
MVC(Model-View-Controller)模式概述
开发语言·c++·设计模式