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

news/2024/5/19 21:51:59/

目录

      • 程序基本概念
        • 配置开发环境
        • 第一个程序
        • 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是一个协议名…

git --- git tag用法

1 什么是tag tag是git版本库的一个标记,指向某个commit的指针。 tag主要用于发布版本的管理,一个版本发布之后,我们可以为git打上 v.1.0.1 v.1.0.2 …这样的标签。 tag感觉跟branch有点相似,但是本质上和分工上是不同的: tag 对应某次commit, 是一个点,是不可移动的。 b…

动态代理入门必看

基本介绍 代理 就是让代理角色帮助真实角色完成一件事情。比如说&#xff0c;我叫我们朋友帮我完成博客&#xff0c;那么这个朋友就是代理&#xff0c;朋友不是我&#xff0c;但是和我完成同样的事&#xff0c;并且还可以对这件事加入他的行为逻辑。 不论是什么代理方法&…

1.docker-安装及使用

1.安装步骤 Install Docker Engine on CentOS 1. 确定CenOS7及以上版本 cat /etc/redhat-release2.卸载旧版本 yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine3.yum安…

HuggingGPT强势来袭,LLM+专家模型,迈向更通用的AI

出品人&#xff1a;Towhee 技术团队 超级组合&#xff1a;HuggingFace ChatGPT HuggingGPT强势来袭。人类仿佛距离真正的AGI又更近了一步。 HuggingGPT是浙江大学与微软亚洲研究院的联手研究&#xff0c;发布之后迅速引发关注&#xff0c;已经开源。 它的使用非常简单&#x…

【密码学复习】第六讲 HASH函数和MAC(三)

H是一个Hash函数 K表示密钥 B表示计算消息摘要时消息分块的字节长度&#xff08;对MD5和SHA-1是512比特,64字节&#xff09; L表示消息摘要按字节计算的长度&#xff08;对MD5是16字节&#xff09; ipad表示0x36重复B次&#xff0c;opad表示0x5c重复B次。 K可以…

有关WPF的一些事

RaisePropertyChanged和OnPropertyChanged的区别 WPF中&#xff0c;数据绑定是实现MVVM模式的关键。在数据绑定的过程中&#xff0c;我们需要在数据发生变化时及时通知UI更新。为了实现这个功能&#xff0c;WPF提供了两个重要的方法&#xff1a;WPFRaisePropertyChanged和OnPr…

逆向-还原代码之(*point)[4]和char *point[4] (Interl 32)

// source code #include <stdio.h> #include <string.h> #include <stdlib.h> /* * char (*point)[4] // 数组指针。 a[3][4] // 先申明二维数组,用它来指向这个二维数组 * char *point[4] // 指针数组。 a[4][5] // 一连串的指针…

flac格式如何转换为mp3,这3个方法超好用

随着音频格式的不断创新和发展&#xff0c;每种格式对应不同的特点。比如像flac格式可以提供无损音质的体验&#xff0c;但它的文件大小却是相对较大&#xff0c;不太适合在普通设备上进行传输和使用。而mp3作为一种流行的音频格式&#xff0c;它的压缩率较高&#xff0c;不但可…

mysql安装(1)

下载软件包 解压tar -zxvf mysql-5.7.28-linux-glibc2.12-x86_64.tar.gz mv mysql-5.7.28-linux-glibc2.12-x86_64 /usr/local/mysql 创建相关目录 mkdir /home/storage/mysql_3306/data logs run tmp 创建用户 groupadd mysql useradd -r -g mysql -s /bin/false mysql 修…

病毒丨3601lpk劫持病毒分析

作者&#xff1a;黑蛋 一、病毒简介 文件名称&#xff1a; 1f3e836b4677a6df2c2d34d3c6413df2c5e448b5bc1d5702f2a96a7f6ca0d7fb 文件类型(Magic)&#xff1a; PE32 executable (GUI) Intel 80386, for MS Windows 文件大小&#xff1a; 52.50KB SHA256&#xff1a; 1f3e836b4…

以 Wow 插件抛砖引玉,如何进行简单的游戏翻译工作

文章目录 前情提要WA例子翻译思路1. 找到需要翻译的关键信息2. 如果需要的话&#xff0c;先机翻减少工作量3. 人工核对检查和修改 结果展示 前情提要 魔兽世界美服10.1更新在即&#xff0c;刚刚来到美服的朋友需要用到一些插件&#xff0c;很多是没有汉化版本的&#xff0c;我…

计算机图形学 | 实验五:模型导入

计算机图形学 | 实验五&#xff1a;模型导入 计算机图形学 | 实验五&#xff1a;模型导入模型加载库AssimpAssimp简介Assimp构建 Mesh && Model 类的创建MeshModel 绘制模型 华中科技大学《计算机图形学》课程 MOOC地址&#xff1a;计算机图形学&#xff08;HUST&…