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;

}

相关推荐
CSDN_PBB3 小时前
[STM32 - 野火] - - - 固件库学习笔记 - - - 十五.设置FLASH的读写保护及解除
笔记·stm32·学习
悄悄敲敲敲3 小时前
C++:dfs习题四则
c++·算法·深度优先
安於宿命5 小时前
【Linux】进程间通信——进程池
linux·c++
鸡啄米的时光机7 小时前
vscode的一些实用操作
vscode·学习
Kai HVZ7 小时前
《深度学习》——调整学习率和保存使用最优模型
人工智能·深度学习·学习
守护者1708 小时前
JAVA学习-练习试用Java实现“使用Apache Ignite对大数据进行内存计算和快速筛查”
java·学习
夜流冰8 小时前
编程参考 - C语言可变参数
笔记
格雷亚赛克斯8 小时前
Qt笔记31-69
数据库·笔记·qt
Long_poem9 小时前
【自学笔记】版本控制与持续集成基础知识点总览-持续更新
笔记·ci/cd
Stream٩( 'ω' )و9 小时前
109~133笔记
笔记