Linux的gcc,gdb基础

执行详解:

1)如何执行

路径+可执行文件名
或者
路径+可执行文件名 & (将进程放到后台执行);

可以把可执行文件放到 /usr/bin 就可以省略路径了;

思考:为什么?

ps :/usr/bin ps,ls,pwd  (先了解,后期写项目就知道为什么了)

2)两步执行与一步执行

a.可以三步合为一步,即不经过预编译,编译,汇编三步,直接一步生成.o文件:
gcc -c main.c -o main.o
gcc -o main main.o

gcc -c main.c(只编译,看有没有语法错误);工作中常用

b.可以四步合为一步:
gcc -o main main.c

3)多文件的编译执行

先写如下三个文件:
add.c max.c main.c

//add.h
int add(int x,int y);

//add.c
int add(int x,int y)
{
    return x+y;

//max.h
int max(int x,int y);

//max.c
int max(int x,int y)
{
     return x>y?x:y;


//main.c
#include <stdio.h>
#include "./max.h"
#include "./add.h"
int main()
{
    int a=10;
    int b=20;
    printf("a+b=%d\n",add(10,20));
    printf("a,b的最大值为%d\n",max(10,20));
    return 0;
}

如何执行呢?

两步执行:

gcc  -c  main.c

gcc  -o main main.c  add.c  max.c

gcc  -o main main.c (error)

一步执行:gcc  -o main main.c  add.c  max.c

gdb调试

(1)debug版本:


编译阶段会加入某些调试信息;
调试信息是在编译的过程中加入到中间文件.o文件的;
gcc -c main.c -g:生成包含调试信息的中间文件
gcc -o main main.o
一步执行:gcc -o main main.c -g


(2)release版本:


发行版本,没有调试信息;
gcc默认生成release版本;


(3)gdb基础命令:


gdb 可执行文件名

显示代码: l

加断点: b 行号
启动程序:r(运行之前一定要加断点)
查看断点信息: info break/info b
删除断点信息:delete 断点编号
单步执行:n
打印 :p
显示:display 变量名:
退出:q

示例1:

#include <stdio.h>
 #include <string.h>

 int main()
{
    while(1)
   {
       char buff[128]={0};
       printf("input\n");
       fgets(buff,128,stdin);

       if(strcmp(buff,"end")==0)
       {
          break;
       }
       printf("read:%s",buff);
   }

    return 0;
 }

gdb命令(全):
l:显示main函数所在的文件的源代码
list 文件名:num 显示文件名文件num行上下的源代码(多文件)
b 行号:给指定行添加断点
b 函数名:给指定函数的第一有效行添加一个断点
info break:显示断点信息;(info b)
delete 断点号:删除指定断点
r(run):运行程序
n(next):单步执行
c(continue):继续执行,直接执行到下一个断点处
s:进入将要被调用的函数中执行
finish:跳出函数;
q:退出调试

bt:显示函数调用栈
disable 断点号:将断点设定为无效的,不加断点号,将所有断点设置为无效
enable 断点号:将断点设定为有效的,不加断点号,将所有断点设置为有效;
p val:打印变量val的值
p &val:打印变量val的地址
p a+b:打印表达式的值
p arr(数组名):打印数组所有元素的值
p   *arr@len:用指向数组的指针打印数组所有元素的值
display:自动显示,参数和p命令一样;
info display:显示自动显示信息
undisplay+编号:删除指定的自动显示
ptype val:显示变量类型

示例2:

int  SUM(int n)
{
    int sum=0;
    for(int i=0;i<=n;i++)
    {
        sum+=i;
    }
    return sum;
}

int main()
{
    int sum=SUM(100);
    printf("%d\n",sum);
    return 0;
}

补充命令:
多进程的调试命令:

(gdb) set follow-fork-mode mode
mode可以选择parent或者child,即:选择调试哪个进程
注意:未被跟踪调试的进程会直接执行结束;

多线程调试命令:
1)利用info threads查看线程信息;
2)thread id:调试目标id指定的线程;
3)set scheduler-locking off|on|step;
"off"表示不锁定任何线程;
"on"只有当前被调试的线程继续运行;
"step"在单步执行的时候,只有当前线程会执行;

makefile安装及make

makefile文件:Linux上的工程管理工具,可以实现自动化编译;
工程中的源文件不计其数,可以根据模块,功能等存储在不同的目录中;
makefile可以提高编译效率,使用make命令每次只会编译那些修改了的或者依赖修改了的这些文件,没有修改的文件不会重新编译.
VS底层就有自己的makefile文件;

//add.h
int add(int x,int y);

//add.c
int add(int x,int y)
{
    return x+y;

//max.h
int max(int x,int y);

//max.c
int max(int x,int y)
{
     return x>y?x:y;


//main.c
#include <stdio.h>
#include "./max.h"
#include "./add.h"
int main()
{
    int a=10;
    int b=20;
    printf("a+b=%d\n",add(10,20));
    printf("a,b的最大值为%d\n",max(10,20));
    return 0;
}

注意:顶格与tab键
了解makefile文件的生成规则;
总结:
makefile可以提高编译效率,使用make命令每次都只会编译那些修改了的或者依赖修改了的文件(间接修改),没有修改的文件不会重新编译;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/216993.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

死磕Nacos系列:Nacos在我的SpringCloud项目中做了什么?

Nacos服务注册 我们一个SpringCloud项目中集成了Nacos&#xff0c;当项目启动成功后&#xff0c;就可以在Nacos管理界面上看到我们项目的注册信息&#xff0c;还可以看到项目的健康状态等等信息&#xff1a; 那Nacos是什么时候进行了哪些操作的呢&#xff1f;今天我们来一探究…

【ArcGIS Pro微课1000例】0035:栅格影像拼接(dem高程数据)

本实验讲解在ArcGIS Pro中,栅格数据的两种拼接(镶嵌)方法,适用于遥感影像、DOM、DEM、DSM等常见栅格数据。 文章目录 一、加载实验数据二、栅格拼接工具1. 镶嵌2. 镶嵌至新栅格三、注意事项四、拓展阅读一、加载实验数据 加载配套实验数据中的0035.rar中的两个dem数据,如…

RabbitMq使用与整合

MQ基本概念 MQ概述 MQ全称 Message Queue&#xff08;[kjuː]&#xff09;&#xff08;消息队列&#xff09;&#xff0c;是在消息的传输过程中保存消息的容器。多用于分布式系统之间进行通信。 &#xff08;队列是一种容器&#xff0c;用于存放数据的都是容器&#xff0c;存…

Redis集群(新)

1.什么是集群 Redis集群实现了对Redis的水平扩容&#xff0c;可实现并发写操作&#xff0c;启动n个redis节点&#xff0c;将数据分别存储在不同的节点中&#xff0c;每块节点负责不同区域的插槽&#xff0c;所以Redis集群通过分区来提供一定程度的可用性。 Redis集群现采用的是…

2023 年 认证杯 小美赛 ABC题 国际大学生数学建模挑战赛 |数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时&#xff0c;你是否曾经感到茫然无措&#xff1f;作为2022年美国大学生数学建模比赛的O奖得主&#xff0c;我为大家提供了一套优秀的解题思路&#xff0c;让你轻松应对各种难题。 cs数模团队在认证杯 小美赛前为大家提供了许多资料的内容呀&am…

leetcode刷题详解二

160. 相交链表 本质上是走过自己的路&#xff0c;再走过对方的路&#xff0c;这是求两个链表相交的方法 ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {//本质上是走过自己的路&#xff0c;再走过对方的路if(headA NULL|| headB NULL){return NULL;}Lis…

AssembleRH850.dll未能加载或找不到

AssembleRH850.dll未能加载或找不到 省流解决方案 省流 经过卸了反复重装、杀毒、系统dll修复&#xff0c;百般折腾&#xff0c;是这一堆东西在搞鬼。解决方案 下载DirectX修复工具&#xff08;增强版&#xff09;&#xff0c;专门修复上述的C问题。

数字孪生技术:提升UI交互性与个性化设计

随着数字化时代的到来&#xff0c;数字孪生技术正在逐渐改变我们的生活和工作方式。数字孪生是一种复制现实世界系统或实体的技术&#xff0c;通过创建数字模型来模拟现实世界中的各种行为和事件。这种技术不仅为人们提供了一个全新的视角来看待和解决问题&#xff0c;同时也为…

HarmonyOS简述及开发环境搭建

一、HarmonyOS简介 1、介绍 HarmonyOS是一款面向万物互联时代的、全新的分布式操作系统。有三大系统特性&#xff0c;分别是&#xff1a;硬件互助&#xff0c;资源共享&#xff1b;一次开发&#xff0c;多端部署&#xff1b;统一OS&#xff0c;弹性部署。 HarmonyOS通过硬件互…

QT已有项目导入工程时注意事项

文章目录 从qt其他版本上开发的工程导入另一qt版本时 从qt其他版本上开发的工程导入另一qt版本时 这里以之前在qt5.12.2上开发的项目为例&#xff0c;现在到在qt6.5.3上运行。 不能直接导入IDE上&#xff0c;否则会报各种莫名奇妙的错误。 首先要把扩展名位.pro.user文件 删掉…

MySQL 及 SQL 注入

文章目录 前言什么是sql注入防止SQL注入Like语句中的注入后言 前言 hello world欢迎来到前端的新世界 &#x1f61c;当前文章系列专栏&#xff1a;Mysql &#x1f431;‍&#x1f453;博主在前端领域还有很多知识和技术需要掌握&#xff0c;正在不断努力填补技术短板。(如果出现…

Redis主从复制(新)

像一些大型的项目&#xff0c;为了保证系统的稳定性&#xff0c;会有一台Redis服务器专门作为主机(master)&#xff0c;还会有多台服务器作为从机(slave)&#xff0c;主机可专门用作写数据&#xff0c;然后根据配置和策略&#xff0c;自动将数据同步到从机&#xff0c;而从机专…