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 name21;

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(argv1,argv2,argv3);

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;

}

相关推荐
破芽35 分钟前
learn-claude-code-s08-s09-学习笔记
笔记·学习
星恒随风1 小时前
Linux网络编程基础(二):彻底理解局域网通信、MAC与IP地址、数据封装、端口号、网络字节序及Socket接口
linux·网络·笔记·学习·tcp/ip·1024程序员节
思麟呀1 小时前
BTree的原理与 C++ 完整实现
c语言·数据结构·c++·算法·1024程序员节
jimy11 小时前
C++ 中 xvalue 的 identity 存在哪里?和 lvalue 的 identity 有什么区别?
开发语言·c++·1024程序员节
xiaoye-duck2 小时前
《C++ 项目:手写大模型接入 SDK》Provider分析与实现
开发语言·c++·语言模型
嘻嘻嘻3212 小时前
ICLR2025|MIM‑Refiner:利用预训练掩码图像建模中间表征提升对比学习
学习
星恒随风2 小时前
Linux线程同步与互斥:彻底理解读者写者问题、读写锁原理、读者优先与写者优先(附pthread完整实验)
linux·服务器·笔记·1024程序员节
Young Doro2 小时前
从 KSG 到 InfoAtlas:互信息估计完整学习册
学习
会编程的小孩2 小时前
qt_day1
c++
Be for thing2 小时前
PyCharm安装与PyTorch项目配置|Jupyter Notebook与PyCharm使用对比
pytorch·学习·1024程序员节