makefileGDB使用

一、makefile

1、make && makefile

makefile帶來的好處就是——自動化編譯,一旦寫好,只需要一個make命令,整個工程完全自動編譯,極大的提高了軟件開發的效率

下面我們通過如下示例來進一步體會它們的作用:

①編寫makefile文件

touch makefile
vim makefile

使用vim編輯器編輯makefile文件:

image-20230407150615108

#makefile文件中的內容
hello.exe:hello.c  gcc hello.c -o hello.exe
.PHONY:clean
clean:rm -f hello.exe

此時我們只需一個make命令即可完成自動編譯:

make

image-20230407151005413

make命令的作用,即是執行makefile中的命令,此處執行的命令是:

gcc hello.c -o hello.exe

當我們輸入:

make clean

image-20230407145636879

此處就執行了:

rm -f hello.exe

2、make執行步驟

當我們在Linux中輸入并執行make命令時,make會干些什么呢?

step 1:make會在當前目錄下尋找Makefile文件,找到了就會用這個文件作為后續操作的依據;如果沒找到Makefile,就會尋找名為makefile的文件;兩個都沒找到就報錯;

step 2:找到Makefile或者makefile之后,默認文件中第一行作為第一個目標;make命令會分析第一個目標的依賴關系,并且執行該目標的依賴方法**;

2.1 依賴關系

hello.exe:hello.c                #依賴關系

makefile文件中hello.exe就是目標(期望生成的內容);我們編譯文件hello.c期望生成它對應的可執行文件hello.exe,而你要編譯生成這個目標文件,需要依賴hello.c這個文件,這就是依賴關系

2.2 依賴方法

有了依賴關系,我們就知道了生成目標可執行文件hello.exe需要依賴hello.c這個文件,那么我們該怎么利用hello.c文件生成hello.exe文件呢?我們是不是還缺少一個方法,而這個使用目標的依賴關系文件生成期望的目標文件的方法就是依賴方法

gcc hello.c -o hello.exe         #依賴方法

image-20230407151439095

需要注意的是,依賴文件列表可以為空

3、項目清理

# makefile文件中的清理部分
.PHONY:clean
clean:rm -f code

image-20230407151637813

上述makefile文件中,該部分即為項目清理部分;在上述介紹中,我們知道需要顯式輸入make clean才能實現清除編譯好的文件hello.exe以便重新編譯:

image-20230407151932323

其中.PHONY的使用,是將它設置為偽目標,偽目標的特性是:總是被執行的?

4、偽目標 .PHONY

👉 怎樣理解總是被執行的?我們試著多次輸入make指令,發現結果如下:

image-20230407152245884

結果:當第一次使用make命令時,目標被執行生成了一個可執行文件,而當我們再使用make命令時發現make雖然不會報錯但是會告訴我們生成的文件的已經是最新的了,目標并沒有被執行


那么多次輸入make clean指令呢?結果如下:

image-20230407152336502

可以一直執行rm -f hello.exe這條指令!(即使已經重復執行了)


我們將生成可執行文件過程更改為偽目標(使用vim編輯器):

# 修改makefile文件
.PHONY:hello.exe
hello.exe:hello.cgcc hello.c -o hello.exe

image-20230407152918399

再測試一下:

image-20230407153021133

二、GDB

GDB是命令行模式的調試工具,能夠讓用戶在程序運行時觀察程序的內部結構和內存的使用情況。

1、準備工作

gdb_test.c:

#include<time.h>void Print(int sum)
{long long timestamp=time(NULL);printf("result=%d,timestamp:%lld\n",sum,timestamp);
}int AddtoVal(int from,int to)
{int sum=0;for (int i = from; i <= to; i++){sum+=i;}return sum;
}int main()
{int sum=AddtoVal(0,100);Print(sum);return 0;
}

生成可執行文件:

1、debug版本:程序本身會被加入更多的調試信息,以便于進行調試。
?2、release版本:不會添加任何調試信息,是不可調試的。

在Linux當中gcc/g++默認生成的可執行程序是release版本的,是不可被調試的。如果想生成debug版本,就需要在使用gcc/g++生成可執行程序時加上-g選項

gdb_test_g.exe:gdb_test.cgcc gdb_test.c -o gdb_test_g.exe -g
.PHONY:clean
clean:rm -rf gdb_test_g.exe

可使用工具讀取可執行程序符號表debug部分:

[Kevin@VM-8-13-centos code1]$ readelf -S gdb_test_g.exe | grep debug[26] .debug_aranges    PROGBITS         0000000000000000  00001095[27] .debug_info       PROGBITS         0000000000000000  000010c5[28] .debug_abbrev     PROGBITS         0000000000000000  00001536[29] .debug_line       PROGBITS         0000000000000000  000016af[30] .debug_str        PROGBITS         0000000000000000  000017d5

總結:要用gdb調試,首先要進行給編譯器添加-g

2、正式調試

調試命令:

進入gdb:gdb?文件名

顯示代碼:l?n 顯示從第n行開始的源代碼,每次顯示10行,若n未給出則默認從上次的位置往下顯示。

打一個斷點:b?n在第n行設置斷點。

查看已打斷點:info b

去掉打的斷點:d 斷點編號 刪除指定編號(不是行號)的斷點。

開始調試運行:r(run)

逐過程:n(next)

逐語句:s(step)會進入函數體中

運行到下一個斷點處:c(continue)

查看函數調用堆棧:bt

直接運行完當前函數:finish 個性化跑完自定義的一個個函數,方便定位代碼錯誤的位置

打印變量的值/地址:p(print)變量/&變量

將變量的值/地址加入常顯示:display 變量/&變量

取消指定編號變量的常顯示:undisplay 編號

跳出循環/跳轉至指定行:until 行號

修改變量值:set var 變量=x 將變量的值修改為x

退出gdb:quit/ql
continue)

查看函數調用堆棧:bt

直接運行完當前函數:finish 個性化跑完自定義的一個個函數,方便定位代碼錯誤的位置

打印變量的值/地址:p(print)變量/&變量

將變量的值/地址加入常顯示:display 變量/&變量

取消指定編號變量的常顯示:undisplay 編號

跳出循環/跳轉至指定行:until 行號

修改變量值:set var 變量=x 將變量的值修改為x

退出gdb:quit/ql

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

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

相關文章

使用 Python 實現一個飛書/微信記賬機器人,酷B了!

Python飛書文檔機器人 今天的主題是&#xff1a;使用Python聯動飛書文檔機器人&#xff0c;實現一個專屬的記賬助手&#xff0c;這篇文章如果對你幫助極大&#xff0c;歡迎你分享給你的朋友、她、他&#xff0c;一起成長。 也歡迎大家留言&#xff0c;說說自己想看什么主題的…

代碼隨想錄第天 78.子集 90.子集II

LeetCode 78 子集 題目描述 給你一個整數數組 nums &#xff0c;數組中的元素 互不相同 。返回該數組所有可能的子集&#xff08;冪集&#xff09;。 解集 不能 包含重復的子集。你可以按 任意順序 返回解集。 示例 1&#xff1a; 輸入&#xff1a;nums [1,2,3] 輸出&…

LeetCode 2581.統計可能的樹根數目:換根DP(樹形DP)

【LetMeFly】2581.統計可能的樹根數目&#xff1a;換根DP(樹形DP) 力扣題目鏈接&#xff1a;https://leetcode.cn/problems/count-number-of-possible-root-nodes/ Alice 有一棵 n 個節點的樹&#xff0c;節點編號為 0 到 n - 1 。樹用一個長度為 n - 1 的二維整數數組 edges…

debian/ubuntu 編譯安裝nginx php

debian/ubuntu 編譯安裝nginx php tar -zxvf nginx-1.9.9.tar.gz apt-get install libpcre3 libpcre3-dev ./configure --prefix/work/nginx-1.9.9 --with-pcre make make install service iptables stop #關閉防火墻, 可能不需要 修改nginx運行用戶為tboqi 抱著log目錄可…

【通信基礎知識】完整通信系統的流程圖及各模塊功能詳解

2024.2.29 抱歉最近在寫畢設大論文&#xff0c;因此沒有太多時間更新。然而&#xff0c;在寫論文的過程中&#xff0c;發現自己對通信系統的了解還不夠全明白&#xff0c;因此差了一些碩博論文總結了一個完整的通信系統流程圖。若有不對的地方請多多指正//部分內容有參考ChatGP…

【Elasticsearch管理】網絡配置

文章目錄 HTTP高級網絡設置高級TCP設置 TransportTCP傳輸概要文件Transport跟蹤 線程池fixed線程池fixed_auto_queue_sizescaling處理器設置 HTTP Elasticsearch只在默認情況下綁定到本地主機。對于運行本地開發服務器(如果在同一臺機器上啟動多個節點&#xff0c;甚至可以運行…

YOLOv7基礎 | 第2種方式:簡化網絡結構之yolov7.yaml(由104層簡化為30層)

前言:Hello大家好,我是小哥談。通過下載YOLOv7源碼可知,原始的yolov7.yaml文件是拆開寫的,比較混亂,也不好理解,并且為后續改進增添了很多困難。基于此種情況,筆者就給大家介紹一種將yolov7.yaml文件簡化的方法,將104層簡化為30層,并且參數量和計算量和原來是一致的,…

內存占用構造方法

#使用虛擬內存構造內存消耗 mkdir /tmp/memory mount -t tmpfs -o size5G tmpfs /tmp/memory dd if/dev/zero of/tmp/memory/block #釋放消耗的虛擬內存 rm -rf /tmp/memory/block umount /tmp/memory rmdir /tmp/memory #內存占用可直接在/dev/shm目錄下寫文件

《極客時間 - 左耳聽風》【文章筆記個人思考】

《極客時間 - 左耳聽風》原文鏈接&#xff1a;https://time.geekbang.org/column/intro/100002201?tabcatalog 10 | 如何成為一個大家愿意追隨的Leader&#xff1f; 10 | 如何成為一個大家愿意追隨的Leader&#xff1f; 這里的Leader是在技術上取得優勢&#xff0c;而不是行政…

2024年2月個人工作生活總結

本文為 2024年2月工作生活總結。 研發編碼 一些警告修正記錄 這個月修正了個人所負責的工程警告&#xff0c;這些警告其實是前人的代碼遺留的&#xff0c;我續寫的代碼&#xff0c;除printf函數的%d、%ld格式&#xff0c;都在寫的過程中改了。 下面記錄一些典型的警告及應對…

NLP(一)——概述

參考書: 《speech and language processing》《統計自然語言處理》 宗成慶 語言是思維的載體&#xff0c;自然語言處理相比其他信號較為特別 word2vec用到c語言 Question 預訓練語言模型和其他模型的區別? 預訓練模型是指在大規模數據上進行預訓練的模型&#xff0c;通常…

測試環境搭建整套大數據系統(七:集群搭建kafka(2.13)+flink(1.13.6)+dinky(0.6)+iceberg)

一&#xff1a;搭建kafka。 1. 三臺機器執行以下命令。 cd /opt wget wget https://dlcdn.apache.org/kafka/3.6.1/kafka_2.13-3.6.1.tgz tar zxvf kafka_2.13-3.6.1.tgz cd kafka_2.13-3.6.1/config vim server.properties修改以下倆內容 1.三臺機器分別給予各自的broker_id…

git操作學習記錄,簡單易上手

配置git 的賬戶郵箱 $ git config --global user.name "Firstname Lastname" $ git config --global user.email "your_emailexample.com"代碼回溯 git rest --hard [commit哈希值]git log命令只能查看以當前狀態為終點的歷史日志 git reflog命令&#x…

Python+neo4j構建豆瓣電影知識圖譜

文章目錄 數據來源數據整理導入節點和關系導入使用Subgraph批量導入節點和關系 多標簽實體和實體去重 數據來源 http://www.openkg.cn/dataset/douban-movie-kg 該網址擁有豐富的中文知識圖譜數據集&#xff0c;OpenKG(Open Knowledge Graph)&#xff0c;可供研究人員使用研究…

【golang】25、圖片操作

用 “github.com/fogleman/gg” 可以畫線, 框 用 “github.com/disintegration/imaging” 可以變換顏色 一、渲染 1.1 框和字 import "github.com/fogleman/gg"func DrawRectangles(inPath string, cRects []ColorTextRect, fnImgNameChange FnImgNameChange) (st…

Python爬蟲——Urllib庫-3

目錄 ajax的get請求 獲取豆瓣電影第一頁的數據并保存到本地 獲取豆瓣電影前十頁的數據 ajax的post請求 總結 ajax的get請求 獲取豆瓣電影第一頁的數據并保存到本地 首先可以在瀏覽器找到發送數據的接口 那么我們的url就可以在header中找到了 再加上UA這個header 進行請…

Facebook的元宇宙實踐:數字化社交的新前景

近年來&#xff0c;元宇宙&#xff08;Metaverse&#xff09;這一概念備受矚目&#xff0c;被認為是數字化社交的未來趨勢之一。而在眾多科技巨頭中&#xff0c;Facebook&#xff08;現更名為Meta&#xff09;一直處于元宇宙發展的前沿。在本文中&#xff0c;我們將深入探討Fac…

萬字帶你走過數據庫的這激蕩的三年

本文收集了卡內基梅隆大學計算機科學系數據庫學副教授 Andy Pavlo 從 2021 到 2023 連續三年對數據庫領域的回顧&#xff0c;希望通過連續三年的回顧讓你對數據庫領域的技術發展有所了解。 關于 Andy Pavlo&#xff1a;卡內基梅隆大學計算機科學系數據庫學副教授&#xff0c;數…

vuepress項目側邊欄菜單配置使用

第一種菜單配置&#xff0c;自定義菜單名稱 {text: 菜單名稱,// 是否折疊collapsible: true,children: [{text: "自定義md菜單名稱",sidebarDepth: 2,link: "/xxx/aa.md",children: [],}],},第二種菜單配置 標題自動生成菜單&#xff0c;使用需要搭配sideb…

c語言求矩陣的局部極大值

給定M行N列的整數矩陣A&#xff0c;如果A的非邊界元素A[i][j]大于相鄰的上下左右4個元素&#xff0c;那么就稱元素A[i][j]是矩陣的局部極大值。本題要求給定矩陣的全部局部極大值及其所在的位置。 輸入格式&#xff1a; 輸入在第一行中給出矩陣A的行數M和列數N&#xff08;3≤…