gdb 调试_GDB调试指南-源码查看
前言
我們在調(diào)試過程中難免要對照源碼進行查看,如果已經(jīng)開始了調(diào)試,而查看源碼或者編輯源碼卻要另外打開一個窗口,那未免顯得太麻煩。文本將會介紹如何在GDB調(diào)試模式下查看源碼或?qū)υ创a進行編輯。
準(zhǔn)備工作
為了說明后面的內(nèi)容,我們先準(zhǔn)備一些源碼,分別是main.c:
//main.c頭文件test.h:
#ifndef _TEST_H以及test.c:
#include編譯運行:
$ 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后面可以跟行號,表明要列出附近的源碼:
(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ù)附近的源碼
這個很容易理解,而使用也很簡單,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ù)源碼的時候,它并沒有列全,因為l每次只顯示10行,那么有沒有方法每次列出更多呢? 我們可以通過listsize屬性來設(shè)置,例如設(shè)置每次列出20行:
(gdb) set listsize 20 (gdb) show listsize Number of source lines gdb will list by default is 20.這樣每次就會列出20行,當(dāng)然也可以設(shè)置為0或者unlimited,這樣設(shè)置之后,列出就沒有限制了,但源碼如果較長,查看將會不便。
列出指定行之間的源碼
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é)束行號之間用逗號隔開。兩者之一也可以省略,例如:
(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é)束行的時候,它列出從開始行開始,到指定大小行結(jié)束,而省略開始行的時候,到結(jié)束行結(jié)束,列出設(shè)置的大小行,例如默認(rèn)設(shè)置為10行,則到結(jié)束行為止,總共列出10行。前面我們也介紹了修改和查看默認(rèn)列出源碼行數(shù)的方法。
列出指定文件的源碼
前面執(zhí)行l(wèi)命令時,默認(rèn)列出main.c的源碼,如果想要看指定文件的源碼呢?可以
l location其中l(wèi)ocation可以是文件名加行號或函數(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)到源碼,一般來說,我們在自己的機器上加上-g參數(shù)編譯完之后,使用gdb都能查看到源碼,但是如果出現(xiàn)下面的情況呢?
源碼被移走
例如,我現(xiàn)在將main.c移動到當(dāng)前的temp目錄下,再執(zhí)行l(wèi)命令:
(gdb) l 1 main.c: No such file or directory. (gdb)它就會提示找不到源碼文件了,那么怎么辦呢? 我們可以使用dir命名指定源碼路徑,例如:
(gdb) dir ./temp Source directories searched: /home/hyb/workspaces/gdb/sourceCode/./temp:$cdir:$cwd這個時候它就能找到源碼路徑了。我這里使用的是相對路徑,保險起見,你也可以使用絕對路徑。
更換源碼目錄
例如,你編譯好的程序文件,放到了另外一臺機器上進行調(diào)試,或者你的源碼文件全都移動到了另外一個目錄,怎么辦呢?當(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é)果。這樣它也能在正確的路徑查找源碼啦。
需要注意的是,這里對路徑做了字符串替換,那么如果你有多個路徑,可以做多個替換。甚至可以對指定文件路徑進行替換。
最后你也可以通過unset substitute-path [path]取消替換。
編輯源碼
為了避免已經(jīng)啟動了調(diào)試之后,需要編輯源碼,又不想退出,可以直接在gdb模式下編輯源碼,它默認(rèn)使用的編輯器是/bin/ex,但是你的機器上可能沒有這個編輯器,或者你想使用自己熟悉的編輯器,那么可以通過下面的方式進行設(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)試模式下進行編輯源碼了,使用命令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)試模式的情況下編譯程序了。
另外一種模式
啟動時,帶上tui(Text User Interface)參數(shù),會有意想不到的效果,它會將調(diào)試在多個文本窗口呈現(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)試指南-啟動調(diào)試
GDB調(diào)試指南-斷點設(shè)置
GDB調(diào)試指南-變量查看
GDB調(diào)試指南-單步調(diào)試
微信公眾號【編程珠璣】:專注但不限于分享計算機編程基礎(chǔ),Linux,C語言,C++,數(shù)據(jù)結(jié)構(gòu)與算法,工具,資源等編程相關(guān)[原創(chuàng)]技術(shù)文章,號內(nèi)包含大量經(jīng)典電子書和視頻學(xué)習(xí)資源。歡迎一起交流學(xué)習(xí),一起修煉計算機“內(nèi)功”,知其然,更知其所以然。總結(jié)
以上是生活随笔為你收集整理的gdb 调试_GDB调试指南-源码查看的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 留守女孩携笔从戎,被录取为空军飞行员
- 下一篇: python读取二进制文件_如何用pyt