1. 程式人生 > >gdb除錯不顯示程式碼的原因

gdb除錯不顯示程式碼的原因

我們從一個最簡單的C語言程式開始。原始檔main.c 使用者目錄gdb資料夾下。

[email protected]:~/gdb$ cat main.c

int main()

{

    return 0;

};

然後將原始檔編譯為main(需要除錯選項-g),並將main.c移動到src/main.c下,然後對main進行除錯。

[email protected]:~/gdb$ gcc main.c -o main -g

[email protected]:~/gdb$ mv main.c src/main.c

[email protected]

:~/gdb$ gdb main

(gdb) b main

Breakpoint 1 at 0x8048397: file main.c, line 3.

(gdb) list

1   main.c: 沒有那個檔案或目錄.

    in main.c

gdb中,使用list命令檢視原始碼時,無法找到原始檔main.c

探究

由於對DWARF除錯格式並不清晰,我本以為使用除錯選項編譯的可執行程式內部包含了原始檔的內容,這樣無論原始碼是否存在,可執行程式都可以被正常除錯。但是,從上邊的例子中可以看出,事實並非如此。

我們可以作一個簡單的推測:由於移動原始檔的位置後,gdb無法找到原始檔的位置,估計可執行檔案的除錯段內儲存的不是原始檔的內容,而是路徑資訊。

main.c移動回來,重新編譯,生成目標檔案main.o,並檢視其段資訊。

[email protected]:~/gdb$ mv src/main.c main.c

[email protected]:~/gdb$ gcc -c main.c -o main.o -g

[email protected]:~/gdb$ objdump -s main.o

main.o:     file format elf32-i386

Contents of section .text:

 0000 5589e5b8 00000000 5dc3               U.......].     

……

Contents of section .debug_str:

 0000 6d61696e 2e63002f 686f6d65 2f666c6f  main.c./home/flo

0010 7269616e 2f676462 00474e55 20432034  rian/gdb.GNU C 4

 0020 2e342e35 006d6169 6e00                     .4.5.main.     

……

我們發現在.debug_str段內,有兩個很明顯的字串資訊。

1/home/florian/gdb:看起來很像原始檔所在的絕對路徑。

2main.c:顯而易見,是原始檔的名稱。

驗證

我們再把main.c移動到src目錄下,再次編譯,看看字串的資訊有何變化。

[email protected]:~/gdb$ mv main.c src/main.c

[email protected]:~/gdb$ gcc -c src/main.c -o main.o -g

[email protected]:~/gdb$ objdump -s main.o

main.o:     file format elf32-i386

Contents of section .text:

 0000 5589e5b8 00000000 5dc3               U.......].     

……

Contents of section .debug_str:

 0000 2f686f6d 652f666c 6f726961 6e2f6764  /home/florian/gd

 0010 6200474e 55204320 342e342e 35007372  b.GNU C 4.4.5.sr

 0020 632f6d61 696e2e63 006d6169 6e00     c/main.c.main. 

.debug_str段內的兩個字串資訊發生了變化。

1/home/florian/gdb:可見該字串為執行gcc命令時的當前目錄的絕對路徑。

2src/main.c:該字串為原始檔相對於當前目錄的相對路徑。

將兩個目錄合併,便可以得到原始檔的絕對路徑:

/home/florian/gdb /src/main.c

結論

由此可見,使用除錯選項編譯生成的可執行檔案內並非儲存了原始檔的內容,而是原始檔的絕對路徑資訊。DWARF除錯格式(詳見這裡)定義的其他debug段內儲存了二進位制程式碼與原始檔行號的對應關係,這樣gdblist命令工作時,實際是讀取可執行檔案內的行號資訊,並將原始檔的程式碼內容顯示出來。這也是為什麼將原始檔移動後,list命令資訊無法找到原始檔的原因。

從這裡,我們也可以清楚一個事實:當原始碼目錄的原始檔路徑發生變化後,如果需要對可執行檔案進行除錯,則必須重新編譯。

類似的問題不僅僅在gdblist命令中存在,objdump –S命令用於交叉顯示反彙編程式碼與原始碼,同樣會受移動原始檔的影響。

相關推薦

gdb除錯顯示程式碼原因

我們從一個最簡單的C語言程式開始。原始檔main.c在 使用者目錄gdb資料夾下。 [email protected]:~/gdb$ cat main.c int main()

Android使用Glide加載https鏈接的圖片顯示原因

exec taf fin any launch {} oncreate exce 文章 平時我們使用Glide加載http網址的圖片的時候,圖片可以正常加載出來,但是如果服務器端加上了安全認證,當加載自簽名的https圖片的時候就會報如下錯誤(證書路徑驗證異常)。 我們如

Android使用Glide載入https連結的圖片顯示原因

平時我們使用Glide載入http網址的圖片的時候,圖片可以正常加載出來,但是如果伺服器端加上了安全認證,當載入自簽名的https圖片的時候就會報如下錯誤(證書路徑驗證異常)。  我們如果不修改Glide的程式碼的話,是會出現 javax.net.ssl.SSLHandshakeExceptio

解決真機除錯顯示問題

1. 找到C:\Users\XXX\.android\adb_usb.ini檔案,如果沒有,就建立一個adb_usb.ini檔案,然後加上一行0x2a45即可。 2. adb kill-server 3.adb start-server 4.adb devices就可

IE8中jQuery.load()載入頁面顯示原因

一、jQuery.load()   jQuery.load(url,[data],[callback])通過Ajax非同步請求載入伺服器中的資料,並把資料放到指定元素中。 url :請求伺服器的地址 data :可選項,請求時傳送的資料 callback :可選項,請求成功後的回撥

圖示顯示原因

圖示不顯示的原因 *1、Windows Explorer Shell 支援 Overlay Icon 最多15個,Windows 自身已經使用了4個,所以就只剩下了11個 供我們使用。電腦上安裝的軟體這麼多,為什麼偏偏你想要的圖示不顯示? 2、因為電腦上有很多軟體都會註冊這些圖示,例

gdb除錯顯示陣列

可以用下面的方法來顯示陣列 p *[email protected]   其中p相當於print,array就是陣列首地址,也可以是陣列名,len是想要顯示的陣列的長度。 比如我有一個數組的定義 int a[] = {1, 2, 3, 4, 5}; &nb

gdb除錯Android native程式碼

除錯環境:     Ubuntu 16.04,win10,android 7.1     其中,win10主機通過USB與被測試機連線,Ubuntu16.04上有android 7.1 SDK程式碼及編譯環境,通過本地網路與被測試機連線。 第一部分: 程式碼示例:

織夢二次安裝在二級目錄圖片顯示原因

第一種:批量修改域名下所有文章內的圖片路徑。 1、進後臺-核心-批量維護-資料庫內容替換 2、選擇表 dede_addonarticle 3、欄位 body 4、被替換內容: src=”/uploads/ 5、替換為:src=”http://你的域名/uploads

git branch 顯示原因

轉自:https://blog.csdn.net/qq_39671159/article/details/81261049 必須使用git init命令建立倉庫,執行git add . 和git commit(提交成功後),再使用git branch命令,才顯示出本地分支。git branch :檢視本地分

pycharm執行和除錯顯示結果

剛在虛擬機器裡面安裝了pycharm,配置(setting)完後,新建一個py檔案,鍵入"hello world",竟然沒有結果,雖然執行成功。pycharm太不友好了吧!然後開始找問題:1:有人說是檔

ecshop廣告位新增之後顯示原因分析

ecshop前臺頁面廣告位不顯示不外乎以下幾種情況,一一檢查,一般都可以解決。 1.檢查一下後臺的廣告位的時間是否到期了,如果到期之後,廣告位的圖片就不會顯示。 修改方式:進入ecshop後臺->廣告列表->編輯,把廣告位的結束日期定在今日之後,重新整理前

pycharm 顯示程式碼提示

1、檢查是否程式碼本身有問題。 2、檢查程式碼提示是否成功開啟。setting → Inspections → Spelling要開啟setting → Inspections → Python 要開啟 3、檢查IDE省電模式是否關閉狀態!!!file → power save mode 取消掉 4

iOS 控制元件載入圖片顯示原因--多麼痛的領悟

在編輯專案程式碼的過程中曾多次出現載入圖片不顯示的情況,有按鈕上的,也有imageView上的,當時稀裡糊塗的換了圖片就可以了,還以為是圖片本身的格式問題,現在終於抓到元凶了。 在Xcode中的Ima

nicescroll.js顯示原因總結

nicescroll.js是一款jquery外掛。使用方法網上有很多,這裡不再贅述。當新增nicescroll.js後,不顯示滾動條時,原因有以下幾種。 原因一:需要滾動條的標籤使用了絕對佈局(position:absolute),而且z-index>0。 解決辦法:

gdb除錯顯示utf-8字元

gdb本身只支援ASCII, ISO-8859-1,set charset可以檢視。直接print utf8的中文字元會出現亂碼, 看到網上有個解決方法是在除錯程式中加入一個列印的函式,感覺比較好用,分享 一下。 將如下程式碼和main函式放在一起,除錯的時

在iPhone手機上寫了input type="date" 顯示出來的原因

input框 ios iphone6s chrome 測試 date 設備 cnblogs blog 在iPhone手機上寫了input type="date" 顯示不出來的原因 今天在手機頁面上使用新的input類型,這樣子寫,在chrome瀏覽器上瀏覽,很好,顯示出來。

關於uoloadify顯示效果原因(thinkphp5仿百度糯米)

style thinkphp5 jquery 效果 自己的 技術分享 方法 F12 元素 .首先看你的jquery.js(總的)這個文件有沒有加載進去(必須在uploadify前面)2.看自己的jquert.uploadify.js和uploadify能不能加載到網頁上去

firefox(火狐)下 js中設置checkbox屬性checked="checked"已有,但復選框卻顯示勾選的原因

顯示 isa googl def 獲取 undefine 方法 ted 網上 剛看到問題時以為是瀏覽器兼容性的原因,ie、google都能正常顯示。 網上查詢之後發現是jQuery的attr()方法用的不恰當。 jQuery1.6之前使用attr()可以修改 ,從jQuer

使用UIImageView+AFNetworking 圖片能正常顯示原因

一個 afn del set inf sports model 添加 sar 今天調的東西涉及到圖片加載,我剛看了下項目裏以前導入了SDWebImage庫,又發現整個就一個地方使用到了SDWebImage異步加載圖片的方法,感覺占體積又雞肋,幹脆去掉,用UIImageVie