1. 程式人生 > 其它 >Linux gdb除錯命令(如何列印完整字串)

Linux gdb除錯命令(如何列印完整字串)

技術標籤:工具使用

<gdb常用除錯命令>

gdb除錯
1、 gdb test
2、(gdb)b xxx.cpp:1061 //打斷點
       b + 偏移量
       b + 函式名
       info b //檢視斷點
3、(gdb) run --gtest_filter=*.xxxx verbose //執行用例
run (r)
執行原始碼中一行的命令next(簡稱n)//執行時如果遇到函式呼叫,可能想執行到函式內部,這時用step(簡稱p)
continue(c)         // continue+n忽略指定次數的斷點
delete(d)   d + 編號// 刪除斷點或監視點
4、(gdb)p/x *dirTransMsg//列印
p argv
p *argv
p argv[o]//首元素指標
p argv[1]

p/格式變數
格式x顯示為16進位制
    d顯示為10進位制
    u無符號10進位制數
    c顯示為字元 ASCII
    f顯示為浮點小數

5、*****[監視點]!!!
watch<表示式> //表示式發生變化時暫停
awatch<表示式>//表示式被訪問、改變時暫停
ratch<表示式> //被訪問時暫停

6、設定變數 set $s= context.size()

7、反彙編disassemble/m function_1

<Linux gdb除錯列印完整字串>

在使用gdb除錯過程中,經常需要檢視變數的值,最常用的方法:
(gdb) print {變數名}
一般情況下,列印並不存在問題。但當一個字串比較長時,打印出來的內容不完整,內容的最後為"..."
例如:

可以看到後面帶有省略號,內容沒有完整的顯示出來。
如何才能將需要print的內容完整顯示出來呢?
其實gdb 預設有一個最大顯示長度限制,可能通過show print elements命令檢視:

(gdb) show print elements
Limit on string chars or array elements to print is 200.
(gdb) 

可以看到最大顯示長度是200
那麼要完全顯示就要改變這個引數的值了,用set print elements 0 命令設定即可:

(gdb) help set print elements
Set limit on string chars or array elements to print.
"set print elements 0" causes there to be no limit.
(gdb) 
(gdb) set print elements 0
(gdb) show print elements
Limit on string chars or array elements to print is unlimited.
(gdb)

再用print就可以完整顯示了:

當然如果不想改這個引數,也可以通過以下命令顯示(下面這個方法我試過沒有用,並不能突破elements數的限制):

(gdb) p *[email protected]
$7 = "0"
(gdb) p *[email protected]
$8 = "0123"
(gdb) p *[email protected]
$9 = "0123456789abcdefghijklmnopqrstuvwxyz\n0123456789abcdefghijklmnopqrstuvwxyz\n0123456789abcdefghijklmnopqrstuvwxyz\n0123456789abcdefghijklmnopqrstuvwxyz\n0123456789abcdefghijklmnopqrstuvwxyz\n0123456789abcdefghijklmnopqrstuvwxyz\n0123456789abcdefghijklmnopqrstuvwxyz\n0123456789abcdefghijklmnopqrstuvwxyz\n0123456789abcdefghijklmnopqrstuvwxyz\n", '\000' <repeats 690 times>
(gdb) 

<gdb命令中檢視地址之x命令>

可以使用examine命令(簡寫是x)來檢視記憶體地址中的值。x命令的語法如下所示:
x/<n/f/u> <addr>
n、f、u是可選的引數:
n 是一個正整數,表示需要顯示的記憶體單元的個數,也就是說從當前地址向後顯示幾個記憶體單元的內容,一個記憶體單元的大小由後面的u定義。
f 表示顯示的格式,如果地址所指的是字串,那麼格式可以是s,如果地十是指令地址,那麼格式可以是i。
u 表示從當前地址往後請求的位元組數,如果不指定的話,GDB預設是4個bytes。u引數可以用下面的字元來代替,b表示單位元組,h表示雙位元組,w表示四字 節,g表示八位元組。當我們指定了位元組長度後,GDB會從指定的記憶體地址開始,讀寫指定位元組,並把其當作一個值取出來。
<addr>表示一個記憶體地址

注意:嚴格區分n和u的關係,n表示單元個數,u表示每個單元的大小。
n/f/u三個引數可以一起使用。例如:
命令:x/3uh 0x54320 表示,從記憶體地址0x54320讀取內容,h表示以雙位元組為一個單位,3表示輸出三個單位,u表示按無符號十進位制顯示。