日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2024/8/23 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 gdb 调试_GDB调试指南-源码查看 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

我們在調試過程中難免要對照源碼進行查看,如果已經開始了調試,而查看源碼或者編輯源碼卻要另外打開一個窗口,那未免顯得太麻煩。文本將會介紹如何在GDB調試模式下查看源碼或對源碼進行編輯。

準備工作

為了說明后面的內容,我們先準備一些源碼,分別是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的數以及1到5的數,這里也就不多做解釋。

列出源碼

首先要介紹的就是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可從第一行開始顯示源碼,繼續輸入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行附近的源碼。

列出指定函數附近的源碼

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

(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后面跟上函數名printNum,它便列出了printNum函數附近的源碼。

設置源碼一次列出行數

不知道你有沒有發現,在列出函數源碼的時候,它并沒有列全,因為l每次只顯示10行,那么有沒有方法每次列出更多呢? 我們可以通過listsize屬性來設置,例如設置每次列出20行:

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

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

列出指定行之間的源碼

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)

啟始行和結束行號之間用逗號隔開。兩者之一也可以省略,例如:

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

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

列出指定文件的源碼

前面執行l命令時,默認列出main.c的源碼,如果想要看指定文件的源碼呢?可以

l location

其中location可以是文件名加行號或函數名,因此可以使用:

(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)

來查看指定文件指定行,或者指定文件指定函數:

(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)

指定源碼路徑

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

源碼被移走

例如,我現在將main.c移動到當前的temp目錄下,再執行l命令:

(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

這個時候它就能找到源碼路徑了。我這里使用的是相對路徑,保險起見,你也可以使用絕對路徑。

更換源碼目錄

例如,你編譯好的程序文件,放到了另外一臺機器上進行調試,或者你的源碼文件全都移動到了另外一個目錄,怎么辦呢?當然你還可以使用前面的方法添加源碼搜索路徑,也可以使用set substitute-path from to將原來的路徑替換為新的路徑,那么我們如何知道原來的源碼路徑是什么呢?借助readelf命令可以知道:

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

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

(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)

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

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

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

編輯源碼

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

$ 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

設置之后,就可以在gdb調試模式下進行編輯源碼了,使用命令edit location,例如:

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

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

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

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

另外一種模式

啟動時,帶上tui(Text User Interface)參數,會有意想不到的效果,它會將調試在多個文本窗口呈現:

gdb main -tui

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

總結

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

本文最新內容地址:GDB調試指南-源碼查看

相關內容

GDB調試指南-啟動調試

GDB調試指南-斷點設置

GDB調試指南-變量查看

GDB調試指南-單步調試

微信公眾號【編程珠璣】:專注但不限于分享計算機編程基礎,Linux,C語言,C++,數據結構與算法,工具,資源等編程相關[原創]技術文章,號內包含大量經典電子書和視頻學習資源。歡迎一起交流學習,一起修煉計算機“內功”,知其然,更知其所以然。

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。