導航:首頁 > 源碼編譯 > Gdb查看程序編譯路徑

Gdb查看程序編譯路徑

發布時間:2022-07-13 02:24:43

㈠ gdb調試命令是什麼

gdb調試命令如下:

1、啟動gdb

$gdb

這樣可以和gdb進行交互了。

2、啟動gdb,並且分屏顯示源代碼

$gdb -tui

這樣,使用了'-tui'選項,啟動可以直接將屏幕分成兩個部分,上面顯示源代碼,比用list方便多了。這時候使用上下方向鍵可以查看源代碼,想要命令行使用上下鍵就用[Ctrl]n和[Ctrl]p。

3、啟動gdb調試指定程序app

$gdb app

這樣就在啟動gdb之後直接載入了app可執行程序,需要注意的是,載入的app程序必須在編譯的時候有gdb調試選項,例如'gcc -g app app.c',注意,如果修改了程序的源代碼,但是沒有編譯,那麼在gdb中顯示的會是改動後的源代碼,但是運行的是改動前的程序,這樣會導致跟蹤錯亂的。

4、啟動程序之後,再用gdb調試

$gdb <program> <PID>

這里,<program>是程序的可執行文件名,<PID>是要調試程序的PID.如果你的程序是一個服務程序,那麼你可以指定這個服務程序運行時的進程ID。gdb會自動attach上去,並調試他。program應該在PATH環境變數中搜索得到。

5、啟動程序之後,再啟動gdb調試

$gdb <PID>

這里,程序是一個服務程序,那麼你可以指定這個服務程序運行時的進程ID,<PID>是要調試程序的PID.這樣gdb就附加到程序上了,但是現在還沒法查看源代碼,用file命令指明可執行文件就可以顯示源代碼了。

linux入門基礎(四)Gdb調試程序

Gdb調試
注意:在Gcc編譯選項中一定要加入
–g
退出GDB:quit

Ctrl+d
調試過程:
1.
查看文件
命令:
(gdb)
l
命令:(gdb)
b
行號
註:到第17行停止,並沒有執行17行
3.
查看斷點情況
info
b
4.
運行代碼
r
命令:
(gdb)
r
(也可以指定行開始運行,在r後面加上行號)
5.
查看變數值
p
命令:(gdb)
p
變數名
6.
設置監視點:
watch
z
(變數名)
也可以是復雜的表達式
7.
單步運行
命令:(gdb)
n
(逐過程)
8.逐步,會進入函數
命令:(gdb)
s
9.條件斷點
將正常斷點轉變為條件斷點:condition
如:condition
1
i
==
10
只有當滿足條件i
==
1時,才會在斷點1處暫停
10.
恢復程序運行
c
命令:
(gdb)
c
(程序就會運行,如果沒有斷點,就運行剩下部分,如果有斷點,就會運行到下一個斷點)
11.
去除斷點
clear
line_number
clear
filename:line_number
12.
help
12.1
help找出類別
12.2help從列表中

㈢ gdb在調試時是如何找到源文件在哪裡

默認會對兩個路徑進行搜索:

  1. 編譯的時候的源文件路徑

  2. 當前gdb的路徑(即在gdb種執行pwd顯示的路徑,可以用cd改變)

所以你知道為什麼不管可執行文件放到哪裡,都能找到源文件了吧~如果你把源文件移走,就找不到了。這個時候,你可以通過dir命令添加路徑進行查找。

㈣ 你好!我現在在學用Linux 的gdb。我想問一下,單步運行怎麼看gdb運行到了

可以說簡單些嗎?還是沒看懂

㈤ 大家好,請問linux gdb如何查看指定地址的內

gdb 是 Linux 系統下面的一個功能很強大的調試程序。但是在編譯 C 語言源程序時,一定要加上 -g 選項,這樣才會有附帶的調試信息。例如:gcc -g test.c 。具體的 gdb 軟體的使用,就必須參考 gdb 的使用手冊了。

㈥ 如何用GDB進行調試

1: 對於在應用程序中加入參數進行調試的方法:
直接用 gdb app -p1 -p2 這樣進行調試是不行的。
需要像以下這樣使用:
#gdb app
(gdb) r -p1 -p2
或者在運行run命令前使用set args命令:
(gdb) set args p1 p2
可以用show args 命令來查看

2. 加入斷點:
break <linenumber>
break <funcName>
break +offset
break -offset
(在當前行號的前面或後面的offset行停住。)

break filename:linenum
在源文件filename的linenum行處停住。

break filename:function
在源文件filename的function函數的入口處停住。

break ... if
...可以是上述的參數,condition表示條件,在條件成立時停住。比如在循環境體中,可以設置 break if i=100,表示當i為100時停住程序。

3. 查看運行時的堆棧:
使用bt命令

4. 列印某個變數的值:
print val

5. 單步: n
繼續運行:c
step
單步跟蹤,如果有函數調用,他會進入該函數。
next
同樣單步跟蹤,如果有函數調用,他不會進入該函數。很像VC等工具中的step over。後面可以加count也可以不加,不加表示一條條地執行,加表示執行後面的count條指令,然後再停住。
set step-mode
set step-mode on
打開step-mode模式,於是,在進行單步跟蹤時,程序不會因為沒有debug信息而不停住。這個參數有很利於查看機器碼。
set step-mod off
關閉step-mode模式。
finish
運行程序,直到當前函數完成返回。並列印函數返回時的堆棧地址和返回值及參數值等信息。
until 或 u
當你厭倦了在一個循環體內單步跟蹤時,這個命令可以運行程序直到退出循環體。

6.在GDB中執行shell命令:
在gdb環境中,你可以執行UNIX的shell的命令,使用gdb的shell命令來完成:
eg. shell make

7. 運行環境
可設定程序的運行路徑。
show paths 查看程序的運行路徑。
set environment varname [=value] 設置環境變數。如:set env USER=hchen
show environment [varname] 查看環境變數。

8.觀察點(WatchPoint)
觀察點一般來觀察某個表達式(變數也是一種表達式)的值是否有變化了,如果有變化,馬上停住程 序。我們有下面的幾種方法來設置觀察點:
watch
為表達式(變數)expr設置一個觀察點。一量表達式值有變化時,馬上停住程序。
rwatch
當表達式(變數)expr被讀時,停住程序。
awatch
當表達式(變數)的值被讀或被寫時,停住程序。
info watchpoints
列出當前所設置了的所有觀察點。

9. 維護breakpoint
clear
清除所有的已定義的停止點。
clear func
清除所有設置在函數上的停止點。
delete [breakpoints] [range...]
刪除指定的斷點,breakpoints為斷點號。如果不指定斷點號,則表示刪除所有的斷點。range 表示斷點號的范圍(如:3-7)。其簡寫命令為d。
比刪除更好的一種方法是disable停止點,disable了的停止點,GDB不會刪除,當你還需要時,enable即可,就好像回收站一樣。
disable [breakpoints] [range...]
disable所指定的停止點,breakpoints為停止點號。如果什麼都不指定,表示disable所有的停止 點。簡寫命令是dis.
enable [breakpoints] [range...]
enable所指定的停止點,breakpoints為停止點號。

10、程序變數
查看文件中某變數的值:
file::variable
function::variable
可以通過這種形式指定你所想查看的變數,是哪個文件中的或是哪個函數中的。例如,查看文件f2.c中的全局變數x的值:
gdb) p 'f2.c'::x

查看數組的值
有時候,你需要查看一段連續的內存空間的值。比如數組的一段,或是動態分配的數據的大小。你可以使用GDB的「@」操作符,「@」的左邊是第一個內存的地址的值,「@」的右邊則你你想查看內存的長度。例如,你的程序中有這樣的語句:
int *array = (int *) malloc (len * sizeof (int));
於是,在GDB調試過程中,你可以以如下命令顯示出這個動態數組的取值:
p *array@len
如果是靜態數組的話,可以直接用print數組名,就可以顯示數組中所有數據的內容了。

11.輸出格式
一般來說,GDB會根據變數的類型輸出變數的值。但你也可以自定義GDB的輸出的格式。例如,你想輸出一個整數的十六進制,或是二進制來查看這個整型變數的中的位的情況。要做到這樣,你可以使用GDB的數據顯示格式:

x 按十六進制格式顯示變數。
d 按十進制格式顯示變數。
u 按十六進制格式顯示無符號整型。
o 按八進制格式顯示變數。
t 按二進制格式顯示變數。
a 按十六進制格式顯示變數。
c 按字元格式顯示變數。
f 按浮點數格式顯示變數。
(gdb) p i
$21 = 101
(gdb) p/a i
$22 = 0x65
(gdb) p/c i
$23 = 101 'e'
(gdb) p/f i
$24 = 1.41531145e-43
(gdb) p/x i
$25 = 0x65
(gdb) p/t i
$26 = 1100101

11.查看內存
使用examine命令(簡寫是x)來查看內存地址中的值。x命令的語法如下所示:
x/
n、f、u是可選的參數。
n 是一個正整數,表示顯示內存的長度,也就是說從當前地址向後顯示幾個地址的內容。
f 表示顯示的格式,參見上面。如果地址所指的是字元串,那麼格式可以是s,如果地十是指令地址,那麼格式可以是i。
u 表示從當前地址往後請求的位元組數,如果不指定的話,GDB默認是4個bytes。u參數可以用下面的字元來代替,b表示單位元組,h表示雙位元組,w表示四位元組,g表示八位元組。當我們指定了位元組長度後,GDB會從指內存定的內存地址開始,讀寫指定位元組,並把其當作一個值取出來。

n/f/u三個參數可以一起使用。例如:
命令:x/3uh 0x54320 表示,從內存地址0x54320讀取內容,h表示以雙位元組為一個單位,3表示三個單位,u表示按十六進制顯示。

12.自動顯示

你可以設置一些自動顯示的變數,當程序停住時,或是在你單步跟蹤時,這些變數會自動顯示。相關的GDB命令是display。
display
display/
display/ expr
expr是一個表達式,fmt表示顯示的格式,addr表示內存地址,當你用display設定好了一個或多個表達式後,只要你的程序被停下來,GDB會自動顯示你所設置的這些表達式的值。

格式i和s同樣被display支持,一個非常有用的命令是:
display/i $pc

undisplay
delete display
刪除自動顯示,dnums意為所設置好了的自動顯式的編號。

disable display
enable display
disable和enalbe不刪除自動顯示的設置,而只是讓其失效和恢復。

info display
查看display設置的自動顯示的信息。GDB會打出一張表格,向你報告當然調試中設置了多少個自動顯示設置,其中包括,設置的編號,表達式,是否enable。

13. 設置顯示選項
set print address
set print address on
打開地址輸出,當程序顯示函數信息時,GDB會顯出函數的參數地址。系統默認為打開的,
show print address
查看當前地址顯示選項是否打開。

set print array
set print array on
打開數組顯示,打開後當數組顯示時,每個元素佔一行,如果不打開的話,每個元素則以逗號分隔。這個選項默認是關閉的。與之相關的兩個命令如下,我就不再多說了。

set print array off
show print array

set print elements
這個選項主要是設置數組的,如果你的數組太大了,那麼就可以指定一個來指定數據顯示的最大長度,當到達這個長度時,GDB就不再往下顯示了。如果設置為0,則表示不限制。

show print elements
查看print elements的選項信息。

set print null-stop
如果打開了這個選項,那麼當顯示字元串時,遇到結束符則停止顯示。這個選項默認為off。

set print pretty on
如果打開printf pretty這個選項,那麼當GDB顯示結構體時會比較漂亮。

14.關於顯示源碼list

㈦ 如何在Windows的命令行下進行程序編譯和gdb調試

1、概念介紹。

1、Windows下的cmd就是Windows的命令行終端,其中的一些命令和Ubuntu的有些許區別,不過在這個博客的范疇中沒有涉及。
2、Windows的環境變數,大概可以說是如果設置好了在path路徑裡面了,就可以直接在cmd命令行里直接調用程序。

2、配置操作

1、選擇計算機,右鍵,選擇「屬性」
2、「高級系統設置」 –> 「環境變數」

3、選擇「環境變數」裡面的「系統變數」 ,選擇path, 編輯

4、添加環境變數。注意:最好不要動原來的東西,在原來的東西的基礎上在前面或後面加上一個分號,然後把Dev C++安裝目錄下的MinGW64/bin文件夾的路徑復制到環境變數裡面去。。(此處是巧借了dev的自帶編譯器,如果各位以其他方法找到了新版的MinGW文件的話,也可以配置成自己喜歡的)注意,路徑中不要出現中文,否則可能出現有趣的問題

(ps:博主這邊用的就不是dev 的MinGW64包了,而是師兄傳下來的 :))

4、一路確定,配置完成。

3、使用操作

在你代碼所在的文件夾,按住shift加右鍵,點擊「在此處打開命令窗口」,進入到cmd終端,接下來就可以愉快地使用g++,gcc編譯器,和gdb調試器了。

4、後期優化

大家還可以給自己配一個用的順手的編輯器,比如sublime,gvim,(甚至是notepad ,hhh)同理把它放在環境變數里,那麼也可以在cmd中直接打開,這時在win下的編程過程就和Ubuntu的非常像了。。

5、備注

1、此處以win7為例,其他版本的應該大同小異。

2、另附片面的gdb調試方法

3、使用編輯器和命令行編譯的方法對於了解程序的運行過程更加有好處,但是從方便性上的確不如IDE,特別是用熟了vs的同學們就應該更能體會得到,所以各有利弊,大家自己選擇最符合自己口味的編程環境就好:)

㈧ gdb怎麼查看程序是在哪行代碼那裡執行了exit退出

gdb 查看 core 文件

基本上
core 文件就是一個包含了程序崩潰時這個進程的所有信息的文件。在那 「遙遠的黃金年代」,程序員不得不把 core 文件以十六進制的方式顯示
出來,然後滿頭大汗的閱讀機器碼的手冊,但是現在事情就簡單得多了。順便說一下, 在 FreeBSD 和其他的 4.4BSD 系統下,core 文件都叫作
progname.core 而不是簡單叫 core,這樣可以很清楚的表示出這個 core
文件是屬於哪個 程序。

1. 要檢查一個 core 文件,首先用 gdb 可執行文件名
來調試產生core文件的可執行程序:

2. 命令 core會分析 可執行程序名.core
文件
註:如果當前不是 core 文件所在目錄,首先要執行 dir
/可執行程序名.core的路徑/。
(gdb)core 可執行程序名.core

舉例:
$gdb a.out
GDB is free software and you are
welcome to distribute copies of it under certain conditions; type "show ing"
to see the conditions. There is absolutely no warranty for GDB; type "show
warranty" for details. GDB 4.13 (i386-unknown-freebsd), Copyright 1994 Free
Software Foundation, Inc.

(gdb)core
a.out.core
Core was generated by `a.out'.
Program terminated with
signal 11, Segmentation fault.
Cannot access memory at address
0x7020796d.
#0 0x164a in bazz (anint=0x5) at temp.c:17
(gdb)

這種情況下,運行的程序叫 a.out,因此 core 文件 就叫
a.out.core。我們知道程序崩潰的原因就是函數 bazz 試圖訪問一塊不屬於它的內存。

有時候,能知道一個函數是怎麼被調用的是非常有用處的。因為在一個復雜的程序裡面問題可能會發生在函數調用棧上面很遠的地方。

3.
命令 bt 會讓 gdb
輸出函數調用棧的回溯追蹤
(gdb)bt
#0 0x164a in bazz (anint=0x5) at temp.c:17
#1 0xefbfd888 in end ()
#2 0x162c in main () at temp.c:11
(gdb)

函數 end() 在一個程序崩潰的時候將被調用;
在本例
中,函數 bazz()
是從 main()中被調用的。

㈨ gdb調試和運行分別在哪裡

window模式下字元調試這是路徑C:\Dev-Cpp\bin
gdb
windows 用開發工具dev-cpp,就在編譯開發工具下直接執行。
如果是linux下,在所編譯的文件夾中直接輸入> gdb 文件名

㈩ 誰知道.gdb格式的文件用什麼打開

GDB輕松調試

一、引言

在了解GDB可以做什麼,怎麼做之前,讓我們先來看看為什麼要用GDB,或者說對調試工具有什麼期望。

一般我們使用GDB(或其他調試工具)是為了發現程序bug,更經常地是在已知程序有錯的情況下定位bug。既然這樣,我們就需要跟蹤程序的執行情況,查看程序執行是否正常,當然這就需要有個讓我們與執行程序交互的環境,調試工具提供一個能讓程序在你的掌控下執行,並讓你能夠查看一些執行過程中的「內幕信息」的環境。

為了查看程序運行過程中的狀態,我們就希望程序能在適當的位置或者在一定的條件下能夠暫停運行;為此,調試工具提供了斷點、查看變數/表達式、顯示程序棧等功能。看了某個點的「內幕」後,我們還期望更多,所以要能控製程序運行才行,這就要求斷點、繼續運行、單步(多步)運行、進入函數運行等功能,在某些情況下,還需要通過修改當前的執行環境(變數等)來達到期望的執行順序。也就是說,光看著是不夠的,還需要能改才行。

理解了這些問題後,我們就明白GDB的各個功能的用意了,自然也就明白該如何使用調試工具了。當然,要讓GDB有效的發揮作用,還是需要一定的經驗與技巧,而這主要靠實踐,學習資料(包括本文)充其量只能幫你一把(小心別讓它幫倒忙)。

總而言之,我們首先要明白使用調試工具的目的和用意,才能理解它的各項功能,才能藉助它快速有效的發現問題;否則,即使工具再強大,你也不知道該如何使用才好。

另外要多結合使用代碼檢視、運行日誌、測試工具等方法來發現潛在的問題,提供程序的質量。這些問題將在另文探討,先做個廣告。

二、GDB能做什麼

GDB可以用來調試C、C++、Mola-2的程序。一般來說,GDB能做的事大致可以分為四類:

1、啟動程序,按指定的方式執行程序。
2、在指定條件下使程序暫停.
3、當程序被停住時,可以檢查此時你的程序中的變化。
4、改變程序中的變數或執行順序來試驗。

三、GDB使用概述

首先要了解的是gdb的help命令,因為你可能記不住各個命令的語法和用途,但只要能正確使用help命令,你就不需要任何其它的gdb資料。

啟動gdb後,輸入help

[eric@linux eric]$ gdb
GNU gdb Red Hat Linux (5.3.90-0.20030710.40rh)
Copyright 2003 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show ing" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i386-redhat-linux-gnu".
(gdb) help
List of classes of commands:

aliases -- Aliases of other commands
breakpoints -- Making program stop at certain points
data -- Examining data
files -- Specifying and examining files
internals -- Maintenance commands
obscure -- Obscure features
running -- Running the program
stack -- Examining the stack
status -- Status inquiries
support -- Support facilities
tracepoints -- Tracing of program execution without stopping the program
user-defined -- User-defined commands

Type "help" followed by a class name for a list of commands in that class.
Type "help" followed by command name for full documentation.
Command name abbreviations are allowed if unambiguous.
(gdb)

如上文顯示,gdb的命令很多,所以把它分成許多個種類。help命令只是例出gdb的命令種類,如果要看某類中的命令,可以使用help <class> 命令,如:help breakpoints,查看設置斷點的所有命令。當如也可以直接help <command>來查看某個命令的具體信息。

gdb 技巧:在記不清整個命令時,可以只打命令的前一個或幾個字元,然後敲擊兩次TAB鍵來列出所有以這幾個字元開頭的命令;另為,大多命令都有縮寫,如b同 break,c同continue,n同next,p同print等。另為,一個命令在輸入能唯一標示命令的前綴後,按一下TAB鍵就能補齊命令的全稱,比如輸入ba後按一下TAB鍵,就自動補齊為backtrace,輸入pr後按一下TAB鍵就補齊為print。

為調試編譯代碼

為了使 gdb 正常工作, 你必須使你的程序在編譯時包含調試信息. 調試信息包含你程序里的每個變數的類型和在可執行文件里的地址映射以及源代碼的行號. gdb 利用這些信息使源代碼和機器碼相關聯.
在編譯時用 -g 選項打開調試選項.

在GDB中運行程序

當以gdb <program>方式啟動gdb後,可以使用r或是run命令運行程序。在程序運行之前,你有可能需要設置下面四方面的事。

1、程序運行參數。
set args 可指定運行時參數。(如:set args 10 20 30 40 50)
show args 命令可以查看設置好的運行參數。

2、運行環境。
path <dir> 可設定程序的運行路徑。
show paths 查看程序的運行路徑。
set environment varname [=value] 設置環境變數。如:set env USER=hchen
show environment [varname] 查看環境變數。

3、工作目錄。
cd <dir> 相當於shell的cd命令。
pwd 顯示當前的所在目錄。

4、程序的輸入輸出。
info terminal 顯示你程序用到的終端的模式。
使用重定向控製程序輸出。如:run > outfile
tty命令可以指寫輸入輸出的終端設備。如:tty /dev/ttyb

調試已運行的程序

可以有兩種方法調試已運行程序:
1、用ps查看正在運行的程序的進程ID,然後用gdb <program> PID格式掛接正在運行的程序。
2、先用gdb <program>關聯上程序,並進行gdb,在gdb中用attach命令來掛接程序正在運行的進程。detach可用來取消掛接的進程。

暫停/恢復程序運行

你可以使用info program 來查看程序的當前的執行狀態。

在gdb中,我們可以有以下幾種暫停方式:斷點(BreakPoint)、觀察點(WatchPoint)、捕捉點(CatchPoint)、信號(Signals)、線程停止(Thread Stops)。如果要恢復程序運行,可以使用c或是continue命令。

查看變數/表達式的值

可以使用print expr(或p expr)來查看程序變數/表達式的值

顯示程序棧

可以使用backtrace(或bt)來顯示程序棧

單步跟蹤

next [n] 執行下一條(或n條)語句,不進入子程序

step [n] 執行下一條(或n條)語句,進入子程序,可用finish從子程序返回

四、GDB常用命令

backtrace 顯示程序中的當前位置和表示如何到達當前位置的棧跟蹤(同義詞:where)
breakpoint 在程序中設置一個斷點
cd 改變當前工作目錄
clear 刪除剛才停止處的斷點
commands 命中斷點時,列出將要執行的命令
continue 從斷點開始繼續執行
delete 刪除一個斷點或監測點;也可與其他命令一起使用
display 程序停止時顯示變數和表達時
down 下移棧幀,使得另一個函數成為當前函數
frame 選擇下一條continue命令的幀
info 顯示與該程序有關的各種信息
jump 在源程序中的另一點開始運行
kill 異常終止在gdb 控制下運行的程序
list 列出相應於正在執行的程序的原文件內容
next 執行下一個源程序行,從而執行其整體中的一個函數
print 顯示變數或表達式的值
pwd 顯示當前工作目錄
pype 顯示一個數據結構(如一個結構或C++類)的內容
quit 退出gdb
reverse-search 在源文件中反向搜索正規表達式
run 執行該程序
search 在源文件中搜索正規表達式
set variable 給變數賦值
signal 將一個信號發送到正在運行的進程
step 執行下一個源程序行,必要時進入下一個函數
undisplay display命令的反命令,不要顯示表達式
until 結束當前循環
up 上移棧幀,使另一函數成為當前函數
watch 在程序中設置一個監測點(即數據斷點)
whatis 顯示變數或函數類型

命令的具體使用方法請用上面介紹的help查詢,看不明白的地方就多試試。

閱讀全文

與Gdb查看程序編譯路徑相關的資料

熱點內容
噴油螺桿製冷壓縮機 瀏覽:578
python員工信息登記表 瀏覽:376
高中美術pdf 瀏覽:160
java實現排列 瀏覽:512
javavector的用法 瀏覽:981
osi實現加密的三層 瀏覽:231
大眾寶來原廠中控如何安裝app 瀏覽:913
linux內核根文件系統 瀏覽:242
3d的命令面板不見了 瀏覽:525
武漢理工大學伺服器ip地址 瀏覽:148
亞馬遜雲伺服器登錄 瀏覽:524
安卓手機如何進行文件處理 瀏覽:70
mysql執行系統命令 瀏覽:929
php支持curlhttps 瀏覽:142
新預演算法責任 瀏覽:443
伺服器如何處理5萬人同時在線 瀏覽:250
哈夫曼編碼數據壓縮 瀏覽:424
鎖定伺服器是什麼意思 瀏覽:383
場景檢測演算法 瀏覽:616
解壓手機軟體觸屏 瀏覽:348