日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux编程基础——GDB(查看数据)

發布時間:2024/6/14 linux 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux编程基础——GDB(查看数据) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

查看棧信息

當程序被停住了,首先要確認的就是程序是在哪兒被斷住的。這個一般是通過查看調用棧信息來看的。在gdb中,查看調用棧的命令是backtrace,可以簡寫為bt。

????(gdb) bt
????#0 pop () at stack.c:10
????#1 0x080484a6 in main () at main.c:12

也可以通過info stack命令實現類似的功能(我更喜歡這個命令):

????(gdb) info stack
????#0 pop () at stack.c:10
????#1 0x080484a6 in main () at main.c:12

查看源程序

當程序斷住是,gdb會顯示當前斷點的位置:

????Breakpoint 1, pop () at stack.c:10
????10 return stack[top--];

可以用list命令來查看當前斷點附近的程序的源代碼:

????(gdb) list
????5 int top = -1;
????6
????7
????8 char pop(void)
????9 {
????10 return stack[top--];
????11 }
????12
????13 void push(char c)
????14 {

list命令后面還可以更一些參數,來顯示更多功能:

  • <linenum>????行號。
  • <+> [offset]????當前行號的正偏移量。
  • <-> [offset] ????當前行號的負偏移量。
  • <filename:linenum> 文件的中的行行。
  • <function> ????????????函數的代碼
  • <filename:function> ????文件中的函數。
  • <*address> 程序運行時的語句在內存中的地址。

不過,就算有這些信息,查看代碼仍然不大方便。現在新版的gdb都帶一個tui的功能,可以通過focus命令開啟,其主要界面如下:

這個界面比起list來說方便多了,能高亮當前語句的執行位置,步進時也會跟著變化,有點使用Turbo C的感覺。

不知道是不是由于focus比較新的緣故,貌似網上并沒有多少文章介紹它,雖然它比較容易上手,但也有不少可以介紹的地方,限于篇幅我這里就不做更多的說明,感興趣的朋友可以看下gdb的gui用法這篇文章。

查看運行時數據

gdb中查看變量的命令是print,一般用它的簡寫形式p。它的語法如下:

????print [</format>] <expr>

其中參數expr可以是一個變量,也可以是表達式。format表示輸出格式,例如,可以用/x來將結果按16進制輸出。如下是幾個基本的例子:

????(gdb) p top
????$16 = 1
????(gdb) p &top
????$17 = (int *) 0x804a014 <top>
????(gdb) p 3+2*5
????$18 = 13
????(gdb) p /x 3+2*5
????$19 = 0xd

format的取值范圍有如下幾種:

  • x 按十六進制格式顯示變量。
  • d 按十進制格式顯示變量。
  • u 按十六進制格式顯示無符號整型。
  • o 按八進制格式顯示變量。
  • t 按二進制格式顯示變量。
  • a 按十六進制格式顯示變量。
  • c 按字符格式顯示變量。
  • f 按浮點數格式顯示變量。

查看函數返回值

查看函數返回值是在調試的過程中經常遇到的需求。例如,對于如下函數

????int foo()
????{
????????return 100;
????}

我們可以以如下方式獲取函數的返回值:

1. 通過finish命令運行至函數結束,此時會打印函數返回值。

????(gdb) finish
????Run till exit from #0 foo () at main.c:9
????main () at main.c:15
????15 }
????Value returned is $2 = 100

2. 返回值會存儲在eax寄存器中,通過查看信息可以獲取返回值。

????(gdb) p $eax
????$3 = 100

????(gdb) info registers
????eax 0x64 100

查看連續內存

可以使用GDB的"@"操作符查看連續內存,"@"的左邊是第一個內存的地址的值,"@"的右邊則你你想查看內存的長度。

例如,對于如下代碼:int arr[] = {2, 4, 6, 8, 10};,可以通過如下命令查看arr前三個單元的數據。

????(gdb) p *arr@3
????$2 = {2, 4, 6}

查看內存

可以使用examine命令(簡寫為x)來查看內存地址中的值。x命令的語法如下所示:

????x /<n/f/u> <addr>

  • n 表示顯示內存的長度,也就是說從當前地址向后顯示幾個地址的內容。
  • f 表示顯示的格式,如果是字符串,則用s,如果是數字,則可以用i。
  • u 表示從當前地址往后請求的字節數,默認是4個bytes。(b單字節,h雙字節,w四字節,g八字節)
  • <addr> 表示一個內存地址。

例如:以兩字節為單位顯示前面的那個數組的地址后32字節內存信息如下.

????(gdb) x /16uh arr
????0xbffff4cc: 2 0 4 0 6 0 8 0
????0xbffff4dc: 10 0 34032 2052 0 0 0 0

自動顯示

在VisualStudio中,可以通過監視窗口動態查看變量的值。在gdb中,也提供了類似的命令display,它的語法是:

????display <expr>
????display /<fmt> <expr>
????display /<fmt> <addr>

expr是一個表達式,fmt表示顯示的格式,addr表示內存地址。當你用display設定好了一個或多個表達式后,只要你的程序被停下來(單步跟蹤時),GDB會自動顯示你所設置的這些表達式的值。

幾個相關的命令如下:

  • undisplay <dnums...>????????不顯示dispaly
  • delete display [dnums]????刪除自動顯示,不帶dnums參數則刪除所有自動顯示,也支持范圍刪除,如: delete display 1,3-5
  • disable display <dnums...>????使display失效
  • enable display <dnums...>????恢復display
  • info display????????查看display信息

轉載于:https://www.cnblogs.com/TianFang/archive/2013/01/21/2869474.html

總結

以上是生活随笔為你收集整理的Linux编程基础——GDB(查看数据)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。