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表示按無符號十進位制顯示。