日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

gdb 调试_GDB调试指南-源码查看

發(fā)布時(shí)間:2024/8/23 57 豆豆
生活随笔 收集整理的這篇文章主要介紹了 gdb 调试_GDB调试指南-源码查看 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言

我們在調(diào)試過程中難免要對照源碼進(jìn)行查看,如果已經(jīng)開始了調(diào)試,而查看源碼或者編輯源碼卻要另外打開一個(gè)窗口,那未免顯得太麻煩。文本將會(huì)介紹如何在GDB調(diào)試模式下查看源碼或?qū)υ创a進(jìn)行編輯。

準(zhǔn)備工作

為了說明后面的內(nèi)容,我們先準(zhǔn)備一些源碼,分別是main.c:

//main.c

頭文件test.h:

#ifndef _TEST_H

以及test.c:

#include

編譯運(yùn)行:

$ gcc -g -o main main.c test.c $ chmod +x main $ ./main it will print from 5 to 1 5 4 3 2 1 print end it will print 1 to 5 1 2 3 4 5 print end

程序功能比較簡單,用來打印5到1的數(shù)以及1到5的數(shù),這里也就不多做解釋。

列出源碼

首先要介紹的就是list命令(可簡寫為l),它用來打印源碼。

直接打印源碼

例如:

$ gdb main (gdb) l 1 //main.c 2 #include<stdio.h> 3 #include"test.h" 4 int main(void) 5 { 6 printf("it will print from 5 to 1n"); 7 printNum(5); 8 printf("print endn"); 9 10 printf("it will print 1 to 5n"); (gdb)

直接輸入l可從第一行開始顯示源碼,繼續(xù)輸入l,可列出后面的源碼。后面也可以跟上+或者-,分別表示要列出上一次列出源碼的后面部分或者前面部分。

列出指定行附近源碼

l后面可以跟行號(hào),表明要列出附近的源碼:

(gdb) l 9 4 int main(void) 5 { 6 printf("it will print from 5 to 1n"); 7 printNum(5); 8 printf("print endn"); 9 10 printf("it will print 1 to 5n"); 11 printNum1(5); 12 printf("print endn"); 13 return 0;

在這里,l后面跟上9,表明要列出第9行附近的源碼。

列出指定函數(shù)附近的源碼

這個(gè)很容易理解,而使用也很簡單,l后面跟函數(shù)名即可,例如:

(gdb) l printNum 1 #include"test.h" 2 void printNum(int n) 3 { 4 if( n < 0) 5 return; 6 while(n > 0) 7 { 8 printf("%dn",n); 9 n--; 10 }

在這里,l后面跟上函數(shù)名printNum,它便列出了printNum函數(shù)附近的源碼。

設(shè)置源碼一次列出行數(shù)

不知道你有沒有發(fā)現(xiàn),在列出函數(shù)源碼的時(shí)候,它并沒有列全,因?yàn)閘每次只顯示10行,那么有沒有方法每次列出更多呢? 我們可以通過listsize屬性來設(shè)置,例如設(shè)置每次列出20行:

(gdb) set listsize 20 (gdb) show listsize Number of source lines gdb will list by default is 20.

這樣每次就會(huì)列出20行,當(dāng)然也可以設(shè)置為0或者unlimited,這樣設(shè)置之后,列出就沒有限制了,但源碼如果較長,查看將會(huì)不便。

列出指定行之間的源碼

list first,last 例如,要列出3到15行之間的源碼:

(gdb) l 3,15 3 { 4 if( n < 0) 5 return; 6 while(n > 0) 7 { 8 printf("%dn",n); 9 n--; 10 } 11 } 12 13 void printNum1(int n) 14 { 15 if( n < 0)

啟始行和結(jié)束行號(hào)之間用逗號(hào)隔開。兩者之一也可以省略,例如:

(gdb) list 3, 3 { 4 if( n < 0) 5 return; 6 while(n > 0) 7 { 8 printf("%dn",n); 9 n--; 10 } 11 } 12

省略結(jié)束行的時(shí)候,它列出從開始行開始,到指定大小行結(jié)束,而省略開始行的時(shí)候,到結(jié)束行結(jié)束,列出設(shè)置的大小行,例如默認(rèn)設(shè)置為10行,則到結(jié)束行為止,總共列出10行。前面我們也介紹了修改和查看默認(rèn)列出源碼行數(shù)的方法。

列出指定文件的源碼

前面執(zhí)行l(wèi)命令時(shí),默認(rèn)列出main.c的源碼,如果想要看指定文件的源碼呢?可以

l location

其中l(wèi)ocation可以是文件名加行號(hào)或函數(shù)名,因此可以使用:

(gdb) l test.c:1 1 #include"test.h" 2 void printNum(int n) 3 { 4 if( n < 0) 5 return; 6 while(n > 0) 7 { 8 printf("%dn",n); 9 n--; 10 } (gdb)

來查看指定文件指定行,或者指定文件指定函數(shù):

(gdb) l test.c:printNum1 9 n--; 10 } 11 } 12 13 void printNum1(int n) 14 { 15 if( n < 0) 16 return; 17 int i = 1; 18 while(i <= n) (gdb)

或者指定文件指定行之間:

(gdb) l test.c:1,test.c:3 1 #include"test.h" 2 void printNum(int n) 3 { (gdb)

指定源碼路徑

在查看源碼之前,首先要確保我們的程序能夠關(guān)聯(lián)到源碼,一般來說,我們在自己的機(jī)器上加上-g參數(shù)編譯完之后,使用gdb都能查看到源碼,但是如果出現(xiàn)下面的情況呢?

源碼被移走

例如,我現(xiàn)在將main.c移動(dòng)到當(dāng)前的temp目錄下,再執(zhí)行l(wèi)命令:

(gdb) l 1 main.c: No such file or directory. (gdb)

它就會(huì)提示找不到源碼文件了,那么怎么辦呢? 我們可以使用dir命名指定源碼路徑,例如:

(gdb) dir ./temp Source directories searched: /home/hyb/workspaces/gdb/sourceCode/./temp:$cdir:$cwd

這個(gè)時(shí)候它就能找到源碼路徑了。我這里使用的是相對路徑,保險(xiǎn)起見,你也可以使用絕對路徑。

更換源碼目錄

例如,你編譯好的程序文件,放到了另外一臺(tái)機(jī)器上進(jìn)行調(diào)試,或者你的源碼文件全都移動(dòng)到了另外一個(gè)目錄,怎么辦呢?當(dāng)然你還可以使用前面的方法添加源碼搜索路徑,也可以使用set substitute-path from to將原來的路徑替換為新的路徑,那么我們?nèi)绾沃涝瓉淼脑创a路徑是什么呢?借助readelf命令可以知道:

$ readelf main -p .debug_str[ 0] long unsigned int[ 12] short int[ 1c] /home/hyb/workspaces/gdb/sourceCode[ 40] main.c (顯示部分內(nèi)容)

main為你將要調(diào)試的程序名,這里我們可以看到原來的路徑,那么我們現(xiàn)在替換掉它:

(gdb) set substitute-path /home/hyb/workspaces/gdb/sourceCode /home/hyb/workspaces/gdb/sourceCode/temp (gdb) show substitute-path List of all source path substitution rules:`/home/hyb/workspaces/gdb/sourceCode' -> `/home/hyb/workspaces/gdb/sourceCode/temp'. (gdb)

設(shè)置完成后,可以通過show substitute-path來查看設(shè)置結(jié)果。這樣它也能在正確的路徑查找源碼啦。

需要注意的是,這里對路徑做了字符串替換,那么如果你有多個(gè)路徑,可以做多個(gè)替換。甚至可以對指定文件路徑進(jìn)行替換。

最后你也可以通過unset substitute-path [path]取消替換。

編輯源碼

為了避免已經(jīng)啟動(dòng)了調(diào)試之后,需要編輯源碼,又不想退出,可以直接在gdb模式下編輯源碼,它默認(rèn)使用的編輯器是/bin/ex,但是你的機(jī)器上可能沒有這個(gè)編輯器,或者你想使用自己熟悉的編輯器,那么可以通過下面的方式進(jìn)行設(shè)置:

$ EDITOR=/usr/bin/vim $ export EDITOR

/usr/bin/vim可以替換為你熟悉的編輯器的路徑,如果你不知道你的編輯器在什么位置,可借助whereis命令或者witch命令查看:

$ whereis vim vim: /usr/bin/vim /usr/bin/vim.tiny /usr/bin/vim.basic /usr/bin/vim.gnome /etc/vim /usr/share/vim /usr/share/man/man1/vim.1.gz $ which vim /usr/bin/vim

設(shè)置之后,就可以在gdb調(diào)試模式下進(jìn)行編輯源碼了,使用命令edit location,例如:

(gdb)edit 3 #編輯第三行 (gdb)edit printNum #編輯printNum函數(shù) (gdb)edit test.c:5 #編輯test.c第五行

可自行嘗試,這里的location和前面介紹的一樣,可以跟指定文件的特定行或指定文件的指定函數(shù)。 編輯完保存后,別忘了重新編譯程序:

(gdb)shell gcc -g -o main main.c test.c

這里要注意,為了在gdb調(diào)試模式下執(zhí)行shell命令,需要在命令之前加上shell,表明這是一條shell命令。這樣就能在不用退出GDB調(diào)試模式的情況下編譯程序了。

另外一種模式

啟動(dòng)時(shí),帶上tui(Text User Interface)參數(shù),會(huì)有意想不到的效果,它會(huì)將調(diào)試在多個(gè)文本窗口呈現(xiàn):

gdb main -tui

但是本文不作介紹,有興趣的可以探索一下。

總結(jié)

本文介紹了GDB調(diào)試中的源碼查看,源碼編輯以及如何在GDB調(diào)試模式下執(zhí)行shell命令。

本文最新內(nèi)容地址:GDB調(diào)試指南-源碼查看

相關(guān)內(nèi)容

GDB調(diào)試指南-啟動(dòng)調(diào)試

GDB調(diào)試指南-斷點(diǎn)設(shè)置

GDB調(diào)試指南-變量查看

GDB調(diào)試指南-單步調(diào)試

微信公眾號(hào)【編程珠璣】:專注但不限于分享計(jì)算機(jī)編程基礎(chǔ),Linux,C語言,C++,數(shù)據(jù)結(jié)構(gòu)與算法,工具,資源等編程相關(guān)[原創(chuàng)]技術(shù)文章,號(hào)內(nèi)包含大量經(jīng)典電子書和視頻學(xué)習(xí)資源。歡迎一起交流學(xué)習(xí),一起修煉計(jì)算機(jī)“內(nèi)功”,知其然,更知其所以然。

總結(jié)

以上是生活随笔為你收集整理的gdb 调试_GDB调试指南-源码查看的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。