IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> Linux gdb调试C语言程序 -> 正文阅读

[C++知识库]Linux gdb调试C语言程序

gdb常用命令

gdb在命令的首字母唯一时是可以缩写的。

  • b/break 函数名:给函数设置断点。

  • c/continue:继续执行。

  • b/break 文件名.c:行号:在指定文件的指定行设置断点。

  • next:单步执行程序,如果是函数则将函数整体执行,不会进入

  • 回车键:执行上次的命令。

  • file 可执行文件名:调试指定的文件。

  • s/step:单步执行程序,如果是函数则会进入

  • l/list:显示当前行下面的10行代码。

  • p/print 变量名:查看变量的值。也可以查看函数的值(地址)。

  • i/info b/break:查询断点信息。

  • d/delete:删除所有的断点。

  • d/delete 断点序号:删除第几个断点。

  • attach pid:调试运行中的进程id为pid的程序。

demo1

#include <stdio.h>

int add(int num1, int num2){
	return num1 + num2;
}

int main(){
	int a = 5;
	int b = 8;
	int ret = add(a,b);
	printf("%d + %d = %d\n", a, b, ret);
	return 0;
}

生成可执行文件

在这里插入图片描述
在这里插入图片描述

调试

选中编译文件

调试必须在编译时加入 -g,然后再输入file 可执行文件名,编译时如果没有指定文件名,默认是a.out
在这里插入图片描述

查看代码

每次l命令只能看10行。
在这里插入图片描述

运行代码

在这里插入图片描述

设置断点(函数)

在这里插入图片描述

  • 先在add函数处添加了断点,然后直接运行程序。

  • 然后就停在了第4行(实际上是从第10行调用的),也就是add中return的位置。
    在这里插入图片描述

  • 执行n指令,继续走一步,来到第五行。

  • 再次执行n指令,也就是ret赋值完毕,来到第11行。

  • 按下回车,执行上一次的指令,也就是n,执行printf语句打印出信息,显示了下一行的语句:return 0;

打印变量信息

在这里插入图片描述

断点情况

  • 查看断点
    在这里插入图片描述
  • 删除指定断点
    在这里插入图片描述
    只有一个断点,删除了一号断点后,就没有断点了。

demo2

#include <stdio.h>
#include <unistd.h>

void printHello(int times){
	printf("Hello -- %d\n", times);
}

int main(){
	for(int i=0;i<10000;i++){
		printHello(i);
		sleep(3);  // 睡眠3秒
	}
	return 0;
}


生成可执行文件

for循环如果报错,要加一个-std=c99
-o 可以指定可执行程序的名称,这里我将demo2.c的可执行文件名称指定为demo2
在这里插入图片描述
测试一下:
在这里插入图片描述

如果打印操作不是通过printHello函数,并且printf中没有\n,那么是没有打印结果的。
需要加上\n,或者是fflush(stdout);刷新一下缓冲区。
这是因为printf的输出结果被放在缓冲区,如果没有换行符或者刷新缓冲区,不会有输出。

调试

这次我们要调试运行中的程序,所以要获取该程序的进程id
ps -ef | grep 进程名
先运行程序,然后从另一个终端中搜索该程序的进程号:
在这里插入图片描述

这里的10237就是PID(process identity)

调试运行中的程序

在这里插入图片描述

  • attach 10237:调试PID为10237的程序。
  • b demo2.c:10demo2.c的第10行打一个断点,同时左边终端到Hello --58就停住了,没有再输出信息。
  • 执行一步,也就是执行sleep(3),提示我们下一次要执行的是:
9		for(int i=0;i<10000;i++)\{

也就是第9行的for循环体。

  • 查看i的值
    在这里插入图片描述
  • 再执行一步
    在这里插入图片描述
  • 这里用s再执行下一步,s是会进入函数的,s就是step的缩写
    在这里插入图片描述
    在这里插入图片描述

果然进入了第5行的函数体中。

  • 我们使用c命令,也就是continue:继续执行代码,因为我们设置过断点,所以会来到调用函数的地方。
    在这里插入图片描述
  • 这里我们用n,来看看是否会进入函数。
    在这里插入图片描述
    发现是没有的,程序直接执行完了当前行,并且下一行要执行sleep(3)
    也打印出了结果。当然,Hello --59是上一次打印的。
    在这里插入图片描述
  • 我们还可以通过kill命令结束程序。
    kill命令不是gdb中的,所以我们要先通过qquit退出gdb的shell,调试会话还没结束,它会问你一下要不要退出,我们输入y
    在这里插入图片描述
    我们一结束调试,旁边的终端就又开始输出信息了。等着,马上kill掉它😡。
    在这里插入图片描述
    进程被kill掉,程序就结束啦。
    在这里插入图片描述
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-15 22:13:21  更:2022-03-15 22:14:54 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 4:28:13-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码