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 天前
【LangChain 1.2 实战(一)】 概述
笔记·学习·langchain
观无1 天前
MAUI笔记
笔记
Hello_Embed1 天前
Windows 安装 Claude Code 并接入 模型
windows·笔记·ai编程
大Mod_abfun1 天前
数字媒体艺术概论(课堂作业/笔记)
笔记·媒体
知识分享小能手1 天前
R语言入门学习教程,从入门到精通,R语言数据计算与分组统计(9)
开发语言·学习·r语言
笑鸿的学习笔记1 天前
qt-C++语法笔记之Qt Graphics View 框架中的类型辨析完全指南
c++·笔记·qt
山居秋暝LS1 天前
安装C++版opencv和opencv_contrib
开发语言·c++·opencv
lizhihai_991 天前
股市学习心得—半导体12种核心材料
大数据·人工智能·学习
U盘失踪了1 天前
调用大模型API上下文关联
笔记
sakiko_1 天前
UIKit学习笔记3-布局、滚动视图、隐藏或显示视图
前端·笔记·学习·objective-c·swift·uikit