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;

}

相关推荐
天天爱吃肉82181 小时前
第十篇:电源设计的“能量矩阵”——无线充电与碳化硅LLC谐振
笔记·矩阵·汽车
Paddi9301 小时前
Codeforces Round 1004 (Div. 1) C. Bitwise Slides
c++·算法
Luis Li 的猫猫2 小时前
深度学习中的知识蒸馏
人工智能·经验分享·深度学习·学习·算法
鹿鸣悠悠4 小时前
第二月:学习 NumPy、Pandas 和 Matplotlib 是数据分析和科学计算的基础
学习·numpy·pandas
流星白龙5 小时前
【C++】36.C++IO流
开发语言·c++
Java能学吗5 小时前
2.17学习总结
数据结构·学习
靡不有初1116 小时前
CCF-CSP第31次认证第二题——坐标变换(其二)【NA!前缀和思想的细节,输出为0的常见原因】
c++·学习·ccfcsp
YH_DevJourney9 小时前
Linux-C/C++《C/7、字符串处理》(字符串输入/输出、C 库中提供的字符串处理函数、正则表达式等)
linux·c语言·c++
和光同尘@9 小时前
1011. A+B和C (15)-PAT乙级真题
c语言·开发语言·数据结构·c++·算法
我爱学习_zwj9 小时前
4.从零开始学会Vue--{{组件通信}}
前端·javascript·vue.js·笔记·前端框架