預設情況下,日誌是沒有開啟的,所有的除錯資訊都會在螢幕中顯示,即預設是輸出到stdout中的。那麼有沒有可能將輸出到螢幕中的內容儲存到檔案裡呢。答案自然是肯定的,這裡面有個地方遇要注意一下子,具體會在下面的示例中提及。
將日誌檔案開啟,不指定檔名的話,預設的檔名是gdb.txt。
gdb)set logging on
gdb)help set logging
在設定日誌的時候,有一點需要注意,如果日誌輸出過長,導致滾屏發生的話。程式會停下來等待人工干預,這樣在上一節中使用commands的目的就無法實現。
為了抑止滾屏時人工干預,需要輸入如下指令。
gdb)set pagination off
在本節最後提及的是在gdb中環境中執行shell裡的指令,如gdb的輸出內容過多,準備呼叫clear來清屏。
gdb)shell clear
如果源**發生變化了,想在gdb中直接呼叫相關指令進行編譯。
gdb)shell gcc -o hello -g hello.c
將最新的目標檔案再次載入到gdb
gdb)file hello
本節側重於如何用各種方法檢視變數的值。
#include #include void show_slogan(char* slogan);
int counter;
char* welcome_msg = "you are welcome!";
int main(int argc, char** ar**)
void show_slogan(char* slogan)
編譯
gcc -o test -g test.c
啟動gdb
gdb test
gdb)br 10
gdb)r
程式執行至斷點1,即行10
顯示區域性變數的值
gdb)info loal
i = 10
列印i的位址
gdb)p &i
$1 = (int *) 0x7fffffffe7cc
因為作者當前是64位cpu,故顯示為64位指標
有了指標,就可以使用大殺器"x"
多費一句話,在gdb中,檢視記憶體中到底放置了哪些東西關鍵的關鍵就是要學會使用x並理解其輸出內容中的具體含義。
gdb)x 0x7fffffffe7cc
顯示當前指標中包含的值,與p i的效果相同。
如果上述i的例子不能讓你有較深印象的話,那麼就用welcome_msg來說明問題中。
gdb)p welcome_msg
$5 = 0x400664 "you are welcome!"
現在有了welcome_msg的指標,有x來列印內容
gdb)x/s 0x400664
0x400664:"you are welcome!"
想到byte級別,好的使用修飾符c
gdb)x/16c 0x400664
0x400664: 121
'y'
111
'o'
117
'u'
32
' '
97
'a'
114
'r'
101
'e'
32
' '
0x40066c: 119
'w'
101
'e'
108
'l'
99
'c'
111
'o'
109
'm'
101
'e'
33 '!
想來welcome_msg的例子可以讓你切身體會到x的強大之處。
x後可以跟多種修飾符
顯示x的幫助資訊
gdb) help x
好了,今天的主要內容就是介紹赫赫有名的x.用好x就可以讓記憶體中的內容無所遁形。
每天學點GDB 2
在一中提到gdb最最基本的用法,在本節主要講述一下如何讓gdb在斷點處列印一下診斷資訊,但程式執行本身不會中斷。先稍微改一改源程式 include include int main int argc,char argv return 0 假設要在執行期間檢視i值的變化。如果是step by step...
每天學點GDB 3
預設情況下,日誌是沒有開啟的,所有的除錯資訊都會在螢幕中顯示,即預設是輸出到stdout中的。那麼有沒有可能將輸出到螢幕中的內容儲存到檔案裡呢。答案自然是肯定的,這裡面有個地方遇要注意一下子,具體會在下面的示例中提及。將日誌檔案開啟,不指定檔名的話,預設的檔名是gdb.txt gdb set log...
每天學點GDB 8
使用gdb來進行stl容器的除錯 現代c 中stl使用的越來越普遍,較之其它型別,stl容器類的除錯顯得複雜度更好。本篇以map為例說明如何利用gdb來遍歷map中的各成員變數。原始碼如下 include include include using namespace std int main in...