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 (展示追加的參數)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/714242.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/714242.shtml
英文地址,請注明出處:http://en.pswp.cn/news/714242.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ProtoBuf 是什么?

1. 序列化概念 序列化和反序列化 序列化:把對象轉換為字節序列的過程稱為對象的序列化。 反序列化:把字節序列恢復為對象的過程稱為對象的反序列化。 什么情況下需要序列化 存儲數據:當你想把的內存中的對象狀態保存到?個?件中或者存到數…

怎么壓縮成mp4視頻?

在數字化時代,視頻已經成為我們日常生活中不可或缺的一部分。然而,有時候我們可能會遇到視頻文件太大的問題,不便于傳輸、存儲或分享。那么,如何將視頻壓縮成MP4格式,以減小文件大小呢?本文將為您介紹幾種簡…

docker學習第一步:基于Linux安裝docker!

要求Linux下的CentOS 7.0 以上的版本 01、安裝docker版本倉庫 1、設置倉庫 sudo yum install -y yum-utils device-mapper-persistent-data lvm2 2、穩定倉庫 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 現在我也找了很…

醫學大數據|文獻閱讀|有關“胃癌+機器學習”的研究記錄

目錄 1.基于32基因特征構建的機器學習模型可有效預測胃癌患者的預后和治療反應 2.胃癌患者術后90天死亡率的機器學習風險預測模型 3.使用機器學習模型預測幽門螺桿菌根除患者胃癌患病風險 4.利用初始內窺鏡檢查和組織學結果進行個性化胃癌發病率預測 1.基于32基因特征構建的…

隨想錄算法訓練營第四十八天|121. 買賣股票的最佳時機、122.買賣股票的最佳時機II

121. 買賣股票的最佳時機 public class Solution {public int MaxProfit(int[] prices) {int result0;int lowint.MaxValue;for(int i0;i<prices.Length;i){if(prices[i]<low){lowprices[i];}else{resultMath.Max(result,prices[i]-low);}}return result;} } 先遍歷找到…

機器學習_10、集成學習-AdaBoost

AdaBoost AdaBoost&#xff08;Adaptive Boosting的簡稱&#xff09;是一種集成學習方法&#xff0c;它的核心思想在于將多個弱學習器組合起來&#xff0c;形成一個強學習器。通過這種方式&#xff0c;AdaBoost能夠顯著提高分類性能。下面詳細介紹AdaBoost的主要概念和工作原理…

查看網絡連接的netstat

netstat是一個監控TCP/IP網絡的非常有用的工具&#xff0c;可以顯示路由表、實際的網絡連接&#xff0c;以及每一個網絡接口設備的狀態信息&#xff0c;可以讓用戶得知目前都有哪些網絡連接正在運作。netstat用戶顯示與IP、TCP、UDP和ICMP協議相關的統計數據&#xff0c;一般用…

【Vue3】PostCss 適配

px 固定的單位&#xff0c;不會進行自適應。rem r root font-size16px 1rem16px&#xff0c;但是需要手動進行單位的換算vw vh 相對于視口的尺寸&#xff0c;不同于百分比&#xff08;相對于父元素的尺寸&#xff09;375屏幕 1vw 3.75px 利用插件進行 px&#xff08;設計稿&…

算法復習之二分【備戰藍橋杯】

二分模板一共有兩個&#xff0c;分別適用于不同情況。 算法思路&#xff1a;假設目標值在閉區間[l, r]中&#xff0c; 每次將區間長度縮小一半&#xff0c;當l r時&#xff0c;我們就找到了目標值。 版本一 當我們將區間[l, r]劃分成[l, mid]和[mid 1, r]時&#xff0c;其更…

Docker自定義JDK鏡像并拉取至阿里云鏡像倉庫全攻略

前言 隨著容器技術的日益成熟&#xff0c;Docker已經成為現代軟件開發和部署的標配工具。其中&#xff0c;自定義Docker鏡像是滿足特定項目需求的關鍵步驟。特別是在Java開發環境中&#xff0c;我們可能需要為不同的項目配置不同版本的JDK。這時&#xff0c;通過Docker自定義J…

臨時筆記2

臨時筆記2 數據庫設計 有哪些表 表里有哪些字段 表和表之間是什么關系 JDBC(全稱&#xff1a;JAVA DATABASE CONNECTIVITY) 本質是官方定義的一套操作所有關系型數據庫的規則&#xff0c;即接口。每個數據庫廠商去實現這一接口&#xff0c;寫出實現類&#xff0c;即驅動&…

List<Object>集合對象屬性拷貝工具類

目錄 問題現象&#xff1a; 問題分析&#xff1a; 解決方法&#xff1a; 問題現象&#xff1a; 最近在項目中經常會使用到BeanUtils工具類來作對象的屬性字段拷貝&#xff0c;但如果應用到List集合的話就需要遍歷去操作了&#xff0c;如下&#xff1a; 打印結果&#xff1a; …

Cocos Creator 3.8.x 后效處理(前向渲染)

關于怎么開啟后效效果我這里不再贅述&#xff0c;可以前往Cocos官方文檔查看具體細節&#xff1a;后效處理官網 下面講一下怎么自己定義一個后處理效果&#xff0c;想添加自己的后效處理的話只需要在postProcess節點下添加一個BlitScreen 組件即可&#xff0c;然后自己去添加自…

第三方集成站點帶token訪問SpringSecurity應用站點自動登錄方案

近期有個WEB項目需要改造。業主找第三方搞了一個集成站點&#xff0c;將多個應用站點的鏈接集中放在一個導航頁面。由于進入集成站點時已經登錄過了&#xff0c;業主要求點擊這些應用站點的鏈接時就不必再登錄。 以前做過類似項目&#xff0c;用的是單點登錄。大家都用同一個登…

關于python數據可視化的學習(多維數組)

import numpy as np # 通過這個語句可以知道其是否存在nmpy這個包 創建數據 H np.array([[[94,26],[11,11]],[[22,22],[23,23]],[[33,33],[33,34]]]) # 理解其中的邏輯結構然后開始運行 # 一個基礎維度邏輯數據結構中包含一個一個二維數據&#xff0c;二維數組之后再次進行升…

Selenium基礎:自動化你的網頁交互!

在構建Python爬蟲的過程中&#xff0c;你可能會遇到需要與網頁進行交互的情況&#xff0c;比如填充表單、點擊按鈕等。這時&#xff0c;Selenium庫就成了你的有力工具。Selenium是一個強大的工具&#xff0c;能夠模擬用戶在網頁上的各種操作。本篇博客將向你介紹Selenium的基礎…

EdgeX Foundry 設備服務

文章目錄 1.設備服務2.設備配置文件3.設備資源4.資源屬性&#xff08;Attributes&#xff09;5.資源屬性&#xff08;Properties&#xff09;6.設備命令7.資源操作8.REST 命令端點9.推送事件 EdgeX Foundry # EdgeX Foundryhttps://iothub.org.cn/docs/edgex/ https://iothub.…

好用的AI模型集合

AI-Chat 這個網站提供的AI-Chat 3.5和AI-Chat 4.0聊天機器人&#xff0c;每天都可以免費使用。 不管是學習、工作還是日常生活&#xff0c;都能給我們帶來很大的幫助&#xff0c;效率真的可以說是翻倍了。我覺得&#xff0c;如果你想讓自己的生活更加高效、更加有序&#xff0…

WEB漏洞 SSRF簡單入門實踐

一、漏洞原理 SSRF 服務端請求偽造 原理&#xff1a;在某些網站中提供了從其他服務器獲取數據的功能&#xff0c;攻擊者能通過構造惡意的URL參數&#xff0c;惡意利用后可作為代理攻擊遠程或本地的服務器。 二、SSRF的利用 1.對目標外網、內網進行端口掃描。 2.攻擊內網或本地的…

Selenium 4.0+ 版本的“正確使用”以及“驅動程序的正確安裝”

前言 本文是該專欄的第18篇,后面會持續分享python爬蟲干貨知識,記得關注。 你是否還在使用selenium 3.0+版本呢?如果還是在使用selenium的舊版本,那就好好看完這篇文章,讓你立刻使用上最新的selenium版本——selenium 4.0+版本。 我們都知道selenium是一個開源的Web自動…