linux_day04

大纲:命令,vim,gcc,编译工具,生成代码,调试,库makefile,系统编程

文件系统:文件属性,文件内容,万物皆文件(不在内存中的是文件,鼠标键盘耳机都可以看作键盘),IO多路复用(即时聊天),进程(特点(怎么分配资源),多进程(创建和管理),),进程间通信(管道,共享内存,信号量,消息队列,信号),线程(多线程,互斥和同步,),网络(网络概念,编程,epoll,),服务器结构(进程池和线程池),sql语句,最终实现一个网盘。

1、gcc

        预处理处理#开头的文件,

写代码一般就编译错误(语法错误)或者链接错误(名字冲突)

2、汇编(AT&T语言(汇编的语言有很多种,AT&T语言是其中一种,针对x86机器))

编译后所有的名字都转换成内存的地址;所有的类型的信息都变成长度信息;

        

pushq    (push表示压栈,q表示quadra(4),表示四倍16bit就是64bit,x86的8086是16bit一个字长(每次读取内存的单位),)

%rbp(百分号说明是一个寄存器,register  base  pointer,表示基地址) 

movq  表示拷贝

subq    sub表示减, rsp减去48;

q表示四个字长,一个字长16位为两个字节,

xorl  (xor表示异或,L表示两个字长32位);$表示赋值;

每四个字节为单位:

变量的名字和类型会被转化为内存的位置和内存的大小;

leaq(lea表示load effective address  ,取地址)

call  (调用函数);

存储程序的概念:

在需要调用mian意外的函数时先call这个函数,然后把用一个占位符占位,等链接的时候,再进入函数;

新压一个栈来

参数传递:caller的栈帧到寄存器到caller的栈帧,值传递的过程;

字符串字面常量:存于rdi区,(只读)

esi和rdi是为了调用printf

 fun  return 后回到main;

jmp 指针移动;(for  循环)循环的底层用goto实现

cmpl(比较);

jle(jump less equal):小于等于就跳转;编译器会优化部分代码(等价替换)

je  相等就跳转;

call  ——stack——chk——fail@PLT  (提示栈损毁);如果内存发生修改就证明代码错误;所以引出报错;指针内存乱指等原因;

--------------------汇编总结------------

push (压栈) pop(出栈) call(调用函数) ret(函数返回)

mov (拷贝)  add(加)  sub(减)lea(取地址)

xor(异或) jmp je jle    (跳转)

q(8byte) l(4byte)

所有变量,数组,*p 编译完在汇编中只剩下了地址+长度

循环 for,while,和goto本质一样

函数调用 栈帧独立,传递参数值传递

AS命令,生成汇编文件

可移植GUN汇编

nm命令(列出文件中的符号信息)

常见符号类型:A(该符号的值在今后的链接中不再改变)

U(该符号未定义过,需要自其他对象文件中链接出来)

T(该符号在代码段中,通常是全局非静态函数)

gcc -c  (.c 文件直接生成.o)

objdump (反编译)

反编译汇编文件可以把.o(机器语言)反编译成.s(汇编语言)

以上左侧二进制序列对应右侧汇编代码

链接(参考书《linker &loader》《程序员自我修养》)

把调用函数的名字换成地址;

ld 命令(链接文件)

或者使用gcc命令间接调用链接;

(函数 / 全局变量 定义0次/超过2次)  (缺失main函数) (报错信息有ld错误)链接错误;

执行可执行程序

./ 文件名   (防止与文件名冲突)

库文件(特殊的.o文件)

静态库和动态库

静态库(打包到产品中)

动态库(运行时才加载到产品中)

ldd 查看文件依赖库

-static 选项让文件链接依赖静态库;默认动态库

静态编译占用内存较大

生成静态库:

ar命令:创建、修改库、从库中提出单个模块;

 

1、通过gcc -c add.c -o add.o 生成目标文件

2、打包成静态库文件

ar crsv libadd.a add.o

3、移动到系统搜索目录  /usr/lib

sudo cp libadd.a /usr/lib

4、在链接文件时加上  -ladd

静态库链接成功后生成的可执行文件不会因为原静态库的丢失而受影响;

生成动态库:

1、编译成目标文件

 动态库加载于栈区和堆区之间,该区域命名为共享库映射区,该区不能生成绝对地址。

这样生成的代码叫位置无关代码

-fpic (编译时加上这个选项即可完成)

gcc add.c -o add.o -fpic   (编译)

2、打包

gcc -shared add.o -o libadd.so

3、移动到系统库目录

sudo cp libadd.so /usr/lib

4、链接加上-ladd

gcc test.o -o test -ladd

ldd 文件名(查看动态库的链接情况)

删除libadd.so后可执行文件失效;重新copy后可以运行,修改链接库文件后不用链接即可在线更新;

更新出bug后进行回滚:

软连接(符号链接)类似于windows的快捷方式

用版本号来区别更新前后的文件,软连接来链接需要的文件

将动态库文件libadd.so文件移动到libadd.so.0.1后执行test显示找不到库文件;

ln -s命令可以创建软链接

创建软连接成功后用ls -al 可以查看

链接创建后可以执行文件

gcc的其他选项:

-D 选项

预处理时需要用到ifdef 为了避免重复改代码造成的风险,可以注释掉需要定义的宏,在预处理阶段加入-D命令使预处理生效注释掉的宏。

-I 选项(大写i)

增加一个搜索路径,防止重复修改文件目录,导致在源代码里面多次修改导致不可预测的风险。利用改变命令的方式来改变搜索路径。

-O(编译优化,结果不变,指令数量变少,执行速度变快(编译器作者在不影响结果的情况下修改指令顺序和数据存储位置))

可能会对调试影响(单步调试)编译优化分级来减小对代码调试的影响

-O0      不优化

-O1        发布产品

-O2        开源软件

-O3       激进优化方案

                优化越深

优化越深,c于汇编的对应就乱了。

编译警告:

Linux中不能出现警告。

警告实例:在源代码中定义了 i 但是没有用到;

gdb--调试工具

 不能开优化,该工具针对c代码的一行,  -O0

补充调试信息,  -g

以上两点要在编译时加上。

使用-O0和-g后生成可执行程序中包含了调试信息;

gbd 文件名(可执行文件名)进入gdb调式界面

list (每十行显示源代码)list后面加行号可从行号显示;l 和list一样的效果

list 加文件名 加行号 函数名

run  / r运行程序

break /b(打断点)加文件名加行号 加函数(在函数定义入口打断点)

continue / c  运行到下一个断点

step / s 单步调试  vs的f11,进入函数第一行(逐步进入)

next / n    vs的f10 单步调用但是跳过函数(逐步越过)

finish    直接运行这个函数调用完为止;跳出本次函数调用

info break  /i b查看目前的所有断点

delete 加编号   删除断点(不加编号就删除全部)

进入循环断点时,gdb会进入这个断点循环次数,所以需要用到忽略这个断点若干次

多次命中循环体中的断点

ignore忽略断点若干次(测试循环结构)

使用i b 查看断点编号,再用ignore 加断点编号加次数设置忽略次数

已经忽略三次循环的效果

在gdb中查看监视

print  / p

p为指针(内存空间以指针大小偏移,int为4byte,所以地址偏移四字节进四。内存的一个字节对应一个地址)

自动监视变量的值,display 加变量名

每查看一行就自动监视输出一次

删除display

先info display显示display的编号再undisplay 加编号删除

help 加命令 显示手册

X 在gdb中去查看内存:

FMT = 数字  字母1 字母2

数字:查看多少单位

字母1:O(八进制)x(十六进制)d(十进制) u(无符号十进制)t(二进制)

字母2:每个单位的大小 b(1byte)h(halfword,2byte)w(word,4byte) g (giant , 8 bytes)

  例子:arr数组3个字节

x/3tw arr

3个单位 二进制的形式4个字节

4个单位,二进制,4字节

检查崩溃的程序

core文件-----记录程序崩溃的时刻内存的堆栈情况。

指针在解引用和初始化之前不能赋值,不然会造成野指针。

错误实例:

段错误:Segmentation fault

core dumped (core文件储存)操作系统会限制core文件的大小

ulimit -a (查看操作系统限制大小)

ulimit -c unlimited   (设置core文件 不限制大小)

该指令不是永久生效,只能影响一个终端;

修改以下文件,来修改core的大小限制

切换到root用户

用echo  core > /proc/sys/kernel/core_pattern

往core_pattern 写入core

之后core文件获得不限制大小的权限,即可生成core文件

gdb 可执行文件名 core(该命令用于查看core文件内容)

获得报错信息,

bt命令用于调用堆栈的情况

1、编译时加上 -g -O0

2、ulimit -c unlimited

3、执行程序

4、gdb  可执行程序  core

栈溢出导致的崩溃

 

命令行参数 + gdb:

用gdb启动:

set args how are you(设置追加参数,)

show args (展示追加的参数)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

为什么说?上位机开发有广泛的前景

上位机开发展现了广泛的前景,主要有以下几个方面的原因: 广泛应用的C#语言: C#在软件开发领域得到了广泛应用,拥有丰富的库、工具和社区支持,使得学习和使用C#进行上位机开发更加便捷。与Windows密切相关: …

LeetCode -- 79.单词搜索

1. 问题描述 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水…

用 Pytest+Allure 生成漂亮的 HTML 图形化测试报告

本篇文章将介绍如何使用开源的测试报告生成框架 Allure 生成规范、格式统一、美观的测试报告。 通过这篇文章的介绍,你将能够: 将 Allure 与 Pytest 测试框架相结合;如何定制化测试报告内容执行测试之后,生成 Allure 格式的测试报…

10.广域网技术

1. PPP实验点这里(拓扑代码) 2. PPPoE配置实验点这里(拓扑代码) 目录 一、广域网二、PPP协议三、PPP链路建立过程1-LCP(链路协商)四、PPP链路建立过程2-PAP/CHAP(认证协商,可选&…

微服务间通信重构与服务治理笔记

父工程 依赖版本管理,但实际不引入依赖 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation&…

详解字符串函数<string.h>(上)

1. strlen函数的使用和模拟实现 size_t strlen(const char* str); 1.1 函数功能以及用法 字符串长度 strlen函数的功能是计算字符串的长度。在使用时&#xff0c;要求用户传入需要计算长度的字符串的起始位置&#xff0c;并返回字符串的长度。 #include <stdio.h> #…

【两万字面试系列】三年前的面试题。Service里面的线程安全问题

前言 三年前&#xff0c;大概是21年&#xff0c;那会刚学完java&#xff0c;然后去面试&#xff0c;被打的一塌糊涂&#xff0c;今天来盘一盘之前的面试&#xff0c;到底是怎样的问题整住了。然后发现了去年整的线程安全东西&#xff0c;也贴到文章后面了。那个贴的还不太准&a…

2024腾讯云服务器优惠价格表又降价了,给同行干emo了

腾讯云优惠活动2024新春采购节活动上线&#xff0c;云服务器价格已经出来了&#xff0c;云服务器61元一年起&#xff0c;配置和价格基本上和上个月没什么变化&#xff0c;但是新增了8888元代金券和会员续费优惠&#xff0c;腾讯云百科txybk.com整理腾讯云最新优惠活动云服务器配…

探索数据结构:解锁计算世界的密码

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;数据结构与算法 贝蒂的主页&#xff1a;Betty‘s blog 前言 随着应用程序变得越来越复杂和数据越来越丰富&#xff0c;几百万、…

每日五道java面试题之spring篇(九)

目录&#xff1a; 第一题. 说一下Spring的事务传播行为第二题. 说一下 spring 的事务隔离&#xff1f;第三题. Spring AOP and AspectJ AOP 有什么区别&#xff1f;AOP 有哪些实现方式&#xff1f;第四题. JDK动态代理和CGLIB动态代理的区别第五题. 解释一下Spring AOP里面的几…

基于SSM医院电子病历管理系统的设计与实现(源代码+数据库脚本+万字文档+PPT)

系统介绍 医院电子病历管理系统主要是借助计算机&#xff0c;通过对医院电子病历管理系统所需的信息管理&#xff0c;增加用户的选择&#xff0c;同时也方便对广大用户信息的及时查询、修改以及对用户信息的及时了解。医院电子病历管理系统 对用户带来了更多的便利&#xff0c…

1、jQuery介绍、css()、选择器、事件、动画

一、jQuery介绍&#xff1f; 1、什么是jQuery&#xff1f; 是一个JavaScript函数库 2、jQuery特点 写的少&#xff0c;做的多 3、jQuery的安装 直接下载引入 <script src"jquery-1.10.2.min.js"></script>通过cdn引入 <script src"https…

VScode 单步断点调试Nodejs方法总结

目录 方法一 方法二 方法三 方法一 使用vscode开发nodejs程序,能够启动单步调试模式,在指定代码处添加断点,像chrome、firefox浏览器上一样进行JavaScript的调试。 新建一个nodejs的工程,编写代码后,配置代码调试的步骤: 1、切换到代码调试界面 2、界面提示,新建一…

Python列表中添加删除元素不走弯路

1.append() 向列表中添加单个元素&#xff0c;一般用于尾部追加 list1 ["香妃", "乾隆", "贾南风", "赵飞燕", "汉武帝"]list1.append("周瑜") print(list1) # [香妃, 乾隆, 贾南风, 赵飞燕, 汉武帝, 周瑜]…

私域必备宝藏工具:多微信统一管理聚合聊天

对于私域流量运营者来说&#xff0c;如何高效管理多个微信号成为了一道难题。 不过不用担心&#xff0c;通过微信管理系统&#xff0c;可以实现多个微信同时登录&#xff0c;同一个界面内聚合聊天&#xff0c;省去来回切换账号的步骤。而且&#xff0c;还有很多非常实用且便捷…

幻兽帕鲁/Palworld服务器的最佳网络设置、内存和CPU配置是什么?

幻兽帕鲁/Palworld服务器的最佳网络设置、内存和CPU配置是什么&#xff1f; 对于4到8人的玩家&#xff0c;推荐的配置是4核16G的CPU和16G的内存。10到20人的玩家选择8核32G的CPU和32G或以上的内存。2到4人的玩家则建议选择4核8G的CPU和8G的内存。对于32人的玩家&#xff0c;推…

java常用环境docker安装

配置目录 rocketmqredismysql不配置binlog配置binlog Nacoszookeeper 本文为精简安装&#xff0c;部分不带容器卷映射&#xff0c;仅供以学习使用。 rocketmq nameservice sudo docker run -d \ --privilegedtrue \ --name rmqnamesrv \ -p 9876:9876 \ -e "MAX_HEAP_SI…

数据结构之二叉树的精讲

&#x1d649;&#x1d65e;&#x1d658;&#x1d65a;!!&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦ &#x1f44f;&#x1f3fb;‧✧̣̥̇:Solitary_walk ⸝⋆ ━━━┓ - 个性标签 - &#xff1a;来于“云”的“羽球人”。…

用按位或、按位与取反实现权限的增减

一、介绍&#xff1a; 在Linux操作系统中&#xff1a; r -4&#xff1a;可读权限 w -2&#xff1a;可写权限 x -1&#xff1a;可执行权限 问题1&#xff1a;三个权限为1,2,4&#xff0c;分别对应:2^0,2^1,2^2&#xff0c;为什么要用8进制表示用户的文件权限&#xff1f; …

《汇编语言》第3版 (王爽)检测点3.1解析

第三章 检测点3.1 &#xff08;1&#xff09;.在Debug中&#xff0c;用“d 0:0 1f”查看内存&#xff0c;结果如下。 下面的程序执行前&#xff0c;AX 0&#xff0c;BX 0&#xff0c;写出每条汇编指令执行完后相关寄存器中的值。 mov ax,1 ;将1放入AX寄存器中&#xff0c;…