gdb 常用命令


gdb 常用命令

1,啟動程序

  • r(un):執行程序,如果沒有設置斷點,則直接把程序都執行完
  • start:執行程序到main函數后,停住。

2,常用命令

  • n(ext):下一條指令(不進入函數)
  • s(tep):進入函數
  • 回車:執行上一條命令
  • c:執行到下一個斷點停住,如果后面沒有斷點,程序執行結束。
  • q:退出gdb

3,設置斷點

  • b(reak):設置斷點,b后面指定行號。

    • 指定行號
    • 指定文件名:行號
    • 指定 函數
    • 指定文件名:函數
  • 設置條件斷點

    • 有個循環,當只想在循環變量i=2的時候,程序停住:【b 行號 if i == 2】

      (gdb) info b
      Num     Type           Disp Enb Address            What
      1       breakpoint     keep y   0x0000555555554748 in main at main.c:10
      	stop only if i == 2
      
  • 設置臨時斷點:tbreak args
    設置一個只中斷一次的斷點。args 和break 命令里的參數一樣,斷點設置也一樣,但斷點在第一次程序中斷后自動 刪除。

  • 用正則表達式設置斷電:rbreak regex
    在所有匹配正則表達式regex 的函數上設置斷點。這個命令會在所有匹配的函數上設置無條件的斷點,也打印設置的斷點列表
    正則表達式的語法是標准的,就如grep工具用的一樣。注意,和shell用的不一樣,例如foo匹配開頭是fo,接下來有0 或者多個o 的函數。在你的正則表達式的開頭和結尾有個隱含的.,所以要想只匹配foo 開頭的函數,用^foo.在調試C++程序,在非特定類的成員函數的重載函數的設置斷點上,rbreak 很有用。
    直接運行rbreak:在所有函數上設置斷點。

4,查看源文件

  • l(list):查看源文件
    • 指定行號
    • 指定文件名:行號
    • 指定 函數
    • 指定文件名:函數

5,查看設置了哪些斷點

  • info b

6,刪除斷點

  • d (el)斷點的號碼

例子:先用info b查看有哪些斷點,注意Num列,如果想刪除【src/add.c:4】處的斷點,就執行【d 2】

(gdb) info b
Num     Type           Disp Enb Address            What
2       breakpoint     keep y   0x0000555555554667 in add at src/add.c:4
3       breakpoint     keep y   0x000055555555468b in main at main.c:5

刪除3號(src/add.c:4處的)斷點:

(gdb) d 2

再用info b看看,發現2號斷點沒有了。

(gdb) info b
Num     Type           Disp Enb Address            What
3       breakpoint     keep y   0x000055555555468b in main at main.c:5

7,查看變量的值和變量的類型

  • 查看任何東西(變量/函數等)的值:p
  • 查看任何東西(變量/函數等)的類型:ptype

8,設置程序的啟動參數

  • 先執行【set args 參數1],然后【r】
  • 直接執行【r 參數1】

9,修改變量的值

  • set var 變量=newValue

10,查看幫助

  • help 命令名字:比如查看set命令的具體用法,可以使用【help set】

11,每次單步執行都想觀察變量的值,請使用【display】,不想看了,就用【undisplay】加Num的號碼

  • display 變量的名字
  • undisplay Num(號碼)
  • info display:可以查看display的Num(號碼)

12,調試core文件,當出現:段錯誤(核心已轉儲)[Segmentation fault (core dumped)]時,可以使用【gdb 程序名 core文件名】后,就能直接看到在哪行出錯,如果沒有顯示,可以輸入【where】,也可以定位到哪行出錯。

但是core文件默認是不被生成的,如何讓它生成呢,

  • 首先確認當前狀態:【ulimit -c】,如果結果為0,說明不能生成core文件
  • 那么就設置core文件的允許大小:【ulimit -c unlimited】,也就是core文件大小沒有限制,這樣設置的好處是當core文件特別大的時候也能夠被生成。當然也可以指定具體的大小【ulimit -c 1024000】等。

之后就有了下面的問題:

程序第一次執行出了[Segmentation fault]錯誤后,就會在當前目錄生成一個名字為【core】的文件,問題來了,如果又執行了一次,又出了[Segmentation fault]錯誤后,又會生成一個【core】,這次的【core】就會覆蓋掉上次的【core】,所以就需要設置如何生成【core】的文件名,達到每次生成的【core】的名字都不相同,就不會覆蓋掉上次的core文件了。

選項如下:

%p:insert pid into filename 添加pid
%u:insert current uid into filename 添加當前的uid
%g:insert current gid into filename 添加當前的gid
%s:insert signal that caused the coredump into the filename 添加導致產生core的信號
%t:insert UNIX time that the coredump occurred into filename 添加core文件生成時間的unix時間
%h:insert hostname where the coredump happened into filename 添加主機名字
%e:insert coredumping executable name into filename 添加程序名

修改辦法:

  • 切換到root用戶

    sudo su
    
  • 編輯/proc/sys/kernel/core_pattern文件,只能用下面的方法

    echo "core-%e-%t" > /proc/sys/kernel/core_pattern
    

    然后生成的core文件的名字就變為:【core-app-1555987945】,注意程序的名字為app。

c/c++ 學習互助QQ群:877684253

本人微信:xiaoshitou5854


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM