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