【Linux阅读笔记】LinuxC一站式编程1-程序基本概念与gdb调试

news/2024/12/13 16:25:40/

目录

      • 程序基本概念
        • 配置开发环境
        • 第一个程序
        • C 复习
      • gdb
        • 单步执行与跟踪
        • 断点
        • 观察点
        • 段错误

程序基本概念

使用 ubuntu22.0 作为演示环境(vmware 虚拟机搭设)


配置开发环境

配置完基础开发环境后,可以直接下载一个 vscode 作为初始 LDE 使用(后续逐渐熟悉 Vim 后再转,刚开始不要一步登天)

开发需要编译器、头文件以及对应的标准库和文档
必须下载 gcc gdb make

● gcc: The GNU C compiLer
● Libc6-dev: GNU C Library: DeveLopment Libraries and Header FiLes
● manpages-dev: ManuaL pages about using GNU/Linux for deveLopment
● manpages-posix-dev: ManuaL pages about using a POSLX system for deveLopment
● binutiLs: The GNU assembLer, linker and binary utiLities
● gdb: The GNU Debugger
● make: The GNU version of the “make” utiLity


第一个程序

创建文件夹,新建文件 main.c,并使用 gedit 编辑它

mkdir linuxc
cd linuxc
touch main.c
gedit main.c

main.c 添加简单的代码

#include <stdio.h>int main(void){printf("%s\n","helloworld");return 0;
}

使用 gcc 编译得到默认文件输出 a.out,然后直接调用 a.out 文件即可执行!

gcc main.c
./a.out

gcc 编译特定名称 gcc xxx.c -o main.out
gcc 编译回显所有警告 gcc -Wall xxx.c


C 复习

复习个鬼,自己找 cprimerplus 和 c++primer 读去

下一节直接上手 gdb


gdb

单步执行与跟踪

首先编写一份简单的 c 文件:main.c

#include <stdio.h>int add_range(int Low, int high)
{int i, sum;for (i = Low; i <= high; i++)sum = sum + i;return sum;
}
int main(void)
{int result[100];result[0] = add_range(1, 10);result[1] = add_range(1, 100);printf("result[0]=%d\nresult[1]=%d\n", result[0], result[1]);return 0;
}

如果我们想要 gdb 调试该代码,gcc 编译时必须添加-g 参数,表示将源码(的引用)插入到编译后的文件内
gcc -g main.c -o main

然后使用 gdb 运行编译后文件
gdb main

-g 参数并不是直接把源码拼到编译后文件内,我们在使用 gdb 调试时当前文件夹下依然需要源码文件存在,单纯地编译后文件是无法执行的!


查看源代码,一次 10 行 list 1
按回车可以快速执行上一条命令

列出指定函数 l [函数名]

退去 gdb(会询问你一次) quit
强制退出 exit


开始执行程序 start
下一步 n|next
深层模式(可进入执行的函数内部) s|step

查看函数调用帧栈 bt
查看函数局部变量 i
选择指定栈帧 f [栈帧号]

打印变量值 p [变量名]
运行直到当前函数结束 finish


断点

准备测试代码

#include <stdio.h>int main(void)
{int sum = 0, i = 0;char input[5];while (1) {scanf("%s", input);for (i = 0; input[i] != '\0'; i++)sum = sum*10 + input[i] - '0';printf("input=%d\n", sum);}return 0;
}

标注变量(被标注的变量会在每次运行时都显示一次) display [变量名]
取消标注变量 undisplay [变量名]
清除所有标注 clear

为指定行打断点 b [行号]
暂时关闭断点 disable b [断点号]
删除所有断点 delete breakpoints
持续运行代码直到遇到断点后停止 c
从头开始运行 r
查看所有断点详情 i breakpoints

断点还可以设置条件,当满足该条件时才激活断点
break 9 if sum!=0


观察点

#include <stdio.h>int main(void)
{int sum = 0, i = 0;char input[5];while (1) {sum = 0;scanf("%s", input);for (i = 0; input[i] != '\0'; i++)sum = sum*10 + input[i] - '0';printf("input=%d\n", sum);}return 0;
}

设置观察点 watch [欲观察的变量名]


段错误

#include <stdio.h>int main(void)
{int man = 0;scanf("%d", man);return 0;
}

很明显,上面这一段代码汇总的 scanf 中对应的 man 前面缺少了一个&符号
此时使用 gdb 进行 run 调试,会直接在对应行进行报错;

对于部分错误,可能不会在逐行运行的时候直接抛出,可能会在 return 执行的时候才抛出,这个要注意!



http://www.ppmy.cn/news/46834.html

相关文章

机器学习 day03(成本函数,简化后的和一般情况下的成本函数)

1. 成本函数 平方误差成本函数是最通常用于线性回归的成本函数最终&#xff0c;我们要找到一组w和b&#xff0c;让j函数的值最小误差&#xff1a;ŷ - y 2. 简化后的平方误差成本函数&#xff0c;即b 0 当w 1时&#xff0c;f(x) x&#xff0c;J(1) 0 左侧为f(x)函数&am…

Python 图像处理实用指南:11~12

原文&#xff1a;Hands-On Image Processing with Python 协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 本文来自【ApacheCN 计算机视觉 译文集】&#xff0c;采用译后编辑&#xff08;MTPE&#xff09;流程来尽可能提升效率。 当别人说你没有底线的时候&#xff0c;…

程序员 如何避免职场危机,打造自己稀缺性

你在职场上如何又脱颖而出 你唯一的办法就干嘛 找一找怎么才能构建我自己的稀缺性 我经过我 多年的工作和有观察的体验 化是什么呢 从技术迭代进步的角度来说 因为软件越来a p i化 个人的能力被解脱了 一定会向上下有延伸 因为当你做一块 以前是一年做下来时间只需要一个月 是一…

(一)Linux:自由、开放、灵活的操作系统内核

目录 一、Linux的发展史 二、linux的开源 三、目前的现状 四、企业应用现状 五、发行的版本 六、安装与使用 七、利用云服务器配置Linux环境 一、Linux的发展史 Linux是一款由林纳斯托瓦兹&#xff08;Linus Torvalds&#xff09;开发的操作系统内核&#xff0c;它的发布…

windows开启自启动jar包

1.新建txt文本文档 2.复制以下内容&#xff0c;并记得修改 appName 到自己jar包所在目录 并修改jar包名称 3.重命名文本文档.txt为 &#xff08;自己起名字&#xff09;.bat (注&#xff1a;修改成.bat文件&#xff0c;名字自己起) echo off setlocal set appNameD:/tes…

Qt QList 详解:从底层原理到高级用法

目录标题 引言&#xff1a;QList 的重要性与应用场景&#xff08;Introduction: The Importance and Application Scenarios of QList&#xff09;QList的常用接口QList和std::listQList 使用场合迭代器&#xff1a;遍历 QList 中的元素&#xff08;Iterators: Traversing Elem…

在新电脑上重启自己的django+vue项目遇到的数据库和Nodejs问题

数据库问题 今天在新电脑上重启自己备份的项目文件,迁移数据库的时候一直出现这个问题,运行代码也是这个问题。很奇怪,明明是不出错的代码做的备份怎么会出问题? 找了一下午,终于晚上把问题解决了。 问题 1、首先是这个问题 2、再往上追溯,发现是这里的问题 3、在原…

【记录】Truenas Scale|中危漏洞,需要SMB签名

部分内容参考&#xff1a;等保测试问题——需要SMB签名(SMB Signing not Required) 以及 ChatGPT。 Truenas常用SMB服务&#xff0c;但默认并不开启SMB签名。这样具有中间人攻击的风险。 一、漏洞详情 1.1 漏洞报告 漏洞提示如下&#xff1a; 1.2 漏洞介绍 SMB是一个协议名…