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) 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:看起來很像原始檔所在的絕對路徑。
(2)main.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命令時的當前目錄的絕對路徑。
(2)src/main.c:該字串為原始檔相對於當前目錄的相對路徑。
將兩個目錄合併,便可以得到原始檔的絕對路徑:
/home/florian/gdb /src/main.c
結論
由此可見,使用除錯選項編譯生成的可執行檔案內並非儲存了原始檔的內容,而是原始檔的絕對路徑資訊。DWARF除錯格式(詳見這裡)定義的其他debug段內儲存了二進位制程式碼與原始檔行號的對應關係,這樣gdb的list命令工作時,實際是讀取可執行檔案內的行號資訊,並將原始檔的程式碼內容顯示出來。這也是為什麼將原始檔移動後,list命令資訊無法找到原始檔的原因。
從這裡,我們也可以清楚一個事實:當原始碼目錄的原始檔路徑發生變化後,如果需要對可執行檔案進行除錯,則必須重新編譯。
類似的問題不僅僅在gdb的list命令中存在,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