gdb常用功能

來源:互聯網
上載者:User

標籤:style   io   使用   ar   for   檔案   資料   sp   問題   

1,調試core dump 檔案
    ulimit -c 1024:設定coredump檔案大小為1024,否則預設不會產生coredump檔案
    gdb -c core:gdb調試該coredump檔案
    file a.out:指定符號表檔案
    bt:列印堆棧資訊

2,插入斷點:
    b/break  15
    b  funcname
    b  filename::linenum
    b  預設在下一條指令停止
    b if a=100

3,退出gdb
    q
    quit

4,執行shell命令
    shell clear

5,停止運行程式/恢複運行
    斷點(breakpoint),觀察點(watchpoint),捕捉點(catchpoint),訊號(signal),線程停止(thread stops)
    c/continue恢複運行

6,設定觀察點
    watch  <expr>    
    rwatch  <expr>    當expr被讀時停止程式
    awatch  <expr>    當expr被讀或寫時停止程式

7,維護停止點
    clear    清除所有停止點,只有在程式運行時才起作用
    clear  <function>
    clear  <linenum>
    d/delete  [breakpoints][range...]    刪除指定的斷點,breakpoints表示斷點號,range表示斷點號的範圍,如3-7
    dis/disable  [breakpoints][range...]    禁用指定的斷點

8,單步運行
    c/fg/continue    恢複程式運行直到下一個斷點
    step  <count>    單步count次,如果有函數調用,進入該函數內部執行
    next  <count>    單步count次,如果有函數調用,不會進入該函數
    finish    運行程式直到當前函數完成返回
    u/until    運行程式直到完成當前迴圈體並返回

9,查看棧資訊
    bt/backtrace    列印當前函數調用棧的所有資訊
    bt <n>    列印棧頂上n層資訊
    bt <-n>    列印棧低下n層資訊
    f/frame  <n>    一般來說,程式停止時,當前棧就是最頂層棧,f/frame 0表示列印0層,即棧頂資訊,n表示列印第n層棧資訊,列印資訊比bt豐富
    up  <n>    向棧的上面移動n層,如果沒有n,則表示移動一層
    down  <n>    向棧的下面移動n層,如果沒有n,則表示移動一層
    info  f/frame,列印更為詳細的資訊
    info  args    列印當前函數的參數名及值
    info  locals    列印當前函數中所有局部變數的值
    info  catch    列印當前函數中異常處理資訊

10,查看原始碼
    list  <linenum>    顯示程式第linenum行的周圍的來源程式
    list  <function>    顯示函數名為function的函數的來源程式     
    list    顯示當前行後面的來源程式
    list -   顯示當前行前面的來源程式
    一般是列印當前行的上5行和下5行,如果顯示函數是是上2行下8行,預設是10行,當然,你也可以定製顯示的範圍,使用下面命令可以設定一次顯示來源程式的行數
    set listsize <count>    設定一次顯示原始碼的行數
    show listsize    查看當前listsize的設定       
list命令還有下面的用法:
    list <first>, <last>    顯示從first行到last行之間的原始碼
    list , <last>    顯示從當前行到last行之間的原始碼  
    list +    往後顯示原始碼
一般來說在list後面可以跟以下這們的參數:
    <linenum>   行號
    <+offset>   當前行號的正位移量
    <-offset>   當前行號的負位移量
    <filename:linenum>  哪個檔案的哪一行
    <function>  函數名
    <filename:function> 哪個檔案中的哪個函數
    <*address>  程式運行時的語句在記憶體中的地址

11,搜尋原始碼
    forward-search  <regexp>
    search  <regexp>    向前面搜尋
    reverse-search  <regexp>    全部搜尋

12,原始碼在記憶體中的位置
    info  line  <test.c:function>
    info  line  <linenum>

13,查看原始碼的機器碼
    disassemble  function

14,查看運行時資料
    p/print  <expr>
    p  /<f>  <expr>    <f>是輸出的格式,如果設定十六進位輸出的話,就是/x
    x  按十六進位格式顯示變數。
    d  按十進位格式顯示變數。
    u  按十六進位格式顯示無符號整型。
    o  按八進位格式顯示變數。
    t  按二進位格式顯示變數。
    a  按十六進位格式顯示變數。
    c  按字元格式設定顯示變數。
    f  按浮點數格式顯示變數。

15,列印數組
    int *array = (int *) malloc (len * sizeof (int));
    p  *[email protected]    @左邊是數組地址,右邊是數組長度

16,自動顯示,即程式停止或單步跟蹤時,變數自動顯示
    display  <expr>
    display  /<fmt>  <expr>
    display  /<fmt>  <addr>
    info  display    列印設定的自動顯示的變數資訊

17,查看寄存器的值
    info  registers
    info  all-registers
    info  registers  <regname...>


    需要注意的是,如果你的程式編譯時間開啟了最佳化選項,那麼在用GDB調試被最佳化過的程式時,可能會發生某些變數不能訪問,或是取值錯誤碼的情況。這個是很正常的,因為最佳化程式會刪改你的程式,整理你程式的語句順序,剔除一些無意義的變數等,所以在GDB調試這種程式時,運行時的指令和你所編寫指令就有不一樣,也就會出現你所想象不到的結果。對付這種情況時,需要在編譯器時關閉編譯最佳化。一般來說,幾乎所有的編譯器都支援編譯最佳化的開關,例如,GNU的C/C++編譯器GCC,你可以使用“-gstabs”選項來解決這個問題。



gdb常用功能

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.