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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

gdb常用命令及参考文档

發布時間:2024/2/28 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 gdb常用命令及参考文档 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

gdb常用命令及參考文檔

    • 前言
    • 使能方式
    • 啟動方式
    • 常用命令
      • !
      • help
      • proc
      • l/list
      • b、break + line 或者函數名
        • break-if
      • delete、 clear
      • info
      • r/run
      • n
      • s/step
      • p/print
        • 打印數組
      • set
      • finish
      • c/continue
      • kill
      • file
      • watch
      • start
      • display/disp
      • catch
      • x
        • 技巧
      • backtrace/bt
      • frame/f
      • args
    • 信號調試
    • 多線程調試
    • attach
    • coredump 文件
      • 開始調試core文件
      • 使用gdb dump內存
      • gdb讀取內存
      • 使用gdb打印棧幀
    • 參考鏈接
    • 調試心得


前言

本文的目的只是為了列述gdb常用命令,供日常調試時自查

使能方式

編譯的時候加上-g 去掉-s選項

-s strip - Discard symbols from object files.
-fvisibility=hidden 這個也不能加
-g gdb 編譯 -g3 3只是級別。這個級別會產生更多的額外debug信息。3這個級別可以調試宏。

啟動方式

gdb -xxx # 如果想要增加更多啟動參數 gdb --args ./SSDTEST.exe -slot 1 -ns 1 -sn 1 #后面加上所有的參數

常用命令

!

在gdb內部使用!開頭的命令,可以直接調用外部命令,如

(gdb) ! grep heap /proc/1131/maps 00c7d000-00d94000 rw-p 00000000 00:00 0 [heap]

help

幫助信息

proc

顯示/proc中的一些信息

(gdb) help info proc Show /proc process information about any running process. Specify any process id, or use the program being debugged by default.List of info proc subcommands:info proc all -- List all available /proc info info proc cmdline -- List command line arguments of the process info proc cwd -- List current working directory of the process info proc exe -- List absolute filename for executable of the process info proc mappings -- List of mapped memory regions info proc stat -- List process info from /proc/PID/stat info proc status -- List process info from /proc/PID/status

l/list

list 顯示多行源代碼

b、break + line 或者函數名

加斷點

  • 如果是多個文件,可以對某個文件的某一行打斷點, 例:對gdb_test.c的第三行打斷點 b gdb_test.c:3
  • 可以對某個函數進行打斷點 例:對本程序中func()函數打斷點 b func
    同理也可以對多個文件中的某一個文件的函數打斷點,例: b gdb_test.c:func
  • break-if

    利用break if命令,可以設置一個條件斷點,如下

    break line-or-function if expr

    例:

    break 46 if testsize==100

    delete、 clear

    如果我們想刪除某個斷點,有兩種方法:

  • delete 命令 簡寫d
    • delete break 刪除所有的斷點
    • delete break n 刪除某個斷點 n為斷點號
  • clear 命令
    • clear 行號 刪除設在某一行的斷點
  • info

    info、delete、clear 后面可以加很多東西, 包括,break, watch, display

    命令功能
    info break/breakpoint查看斷點
    info break/breakpoint N查看第N個斷點
    info local或locals 查看當前stack frame局部變量
    info variables查看全局和靜態變量
    info args查看當前stack frame參數
    info thread查看所有的thread

    r/run

    開始

    n

    單步執行,但是不會進入函數內部

    s/step

    單步執行,會進入函數內部

    p/print

    print查看當前某個變量 p空格后面加變量名

    打印數組

    可以用以下各式打印數組,頭指針頭加@數量

    p *arrayPtr@256

    set

    使用set或者print可以修改變量的值

    print array[1] = 12 set variable array[1] = 12

    finish

    跳出某個函數

    c/continue

    繼續運行

    kill

    退出調試

    file

    裝入需要調試的exe file

    watch

    監視變量

    start

    開始執行程序,在main函數的第一條語句前面停下來

    display/disp

    跟蹤查看某個變量, 每次停下來都現實哦

    catch

    捕捉

    catch assert -- Catch failed Ada assertions catch catch -- Catch an exception ####重要 catch exception -- Catch Ada exceptions catch exec -- Catch calls to exec catch fork -- Catch calls to fork catch load -- Catch loads of shared libraries catch signal -- Catch signals by their names and/or numbers catch syscall -- Catch system calls by their names and/or numbers catch throw -- Catch an exception catch unload -- Catch unloads of shared libraries catch vfork -- Catch calls to vfork

    x

    查看內存
    格式: x /nfu <addr>
    說明:
    x 是 examine 的縮寫
    n表示要顯示的內存單元的個數
    f表示顯示方式, 可取如下值
    x 按十六進制格式顯示變量。
    d 按十進制格式顯示變量。
    u 按十進制格式顯示無符號整型。
    o 按八進制格式顯示變量。
    t 按二進制格式顯示變量。
    a 按十六進制格式顯示變量。
    i 指令地址格式
    c 按字符格式顯示變量。
    f 按浮點數格式顯示變量。
    u表示一個地址單元的長度
    b表示單字節,
    h表示雙字節,
    w表示四字節,
    g表示八字節

    舉例

    x/3uh buf

    技巧

    可以使用如下命令,把一個內存地址轉化為一個指針并打印

    p *(struct virtio_net*)0x20007ffefa00

    backtrace/bt

    查看函數調用信息(堆棧)

    frame/f

    查看站幀(目前運行到的地方)

    args

    啟動程序的三種方式

  • gdb ${你的程序} 進入gdb后,輸入run(簡寫r) ${arg1} ${arg2} … ${argN}
  • gdb --args ${你的程序} ${arg1} ${arg2} … ${argN} 進入gdb后,運行run。
  • gdb進入gdb后,輸入file ${你的程序}。然后使用set args ${arg1} ${arg2} … ${argN} 設定好你的程序參數,再運行run。
  • 信號調試

    handle <signal> <keywords...>
    • 在GDB中定義一個信號處理。信號可以以SIG開頭或不以SIG開頭,可以用定義一個要處理信號的范圍(如:SIGIO- SIGKILL,表示處理從SIGIO信號到SIGKILL的信號,其中包括SIGIO, SIGIOT,SIGKILL三個信號),也可以使用關鍵字 all來標明要處理所有的信號。一旦被調試的程序接收到信號,運行程序馬上會被GDB停住,以供調試。其可以是以下幾種關鍵字的一個或多個。
    關鍵字說明
    nostop當被調試的程序收到信號時,GDB不會停住程序的運行,但會打出消息告訴你收到這種信號。
    stop當被調試的程序收到信號時,GDB會停住你的程序。
    print當被調試的程序收到信號時,GDB會顯示出一條信息。
    noprint當被調試的程序收到信號時,GDB不會告訴你收到信號的信息。
    pass/noignore當被調試的程序收到信號時,GDB不處理信號。這表示,GDB會把這個信號交給被調試程序會處理。
    nopass/ignore當被調試的程序收到信號時,GDB不會讓被調試程序來處理這個信號。
    info signals info handle 查看有哪些信號在被GDB檢測中。

    多線程調試

  • 進程調試死鎖
  • ulimit -c unlimited 之后kill掉進程,會產生core文件
  • thread apply all bt
  • gdb 會打出所有線程的棧,如果你發現有那么幾個棧停在 pthread_wait 或者類似調用上,大致就可以得出結論:就是它們幾個兒女情長,耽誤了整個進程。
  • 也可以使用gdb attach <進程號> 直接把attach上被死鎖的進程
  • thread 5 切換到進程5
  • 使用bt或者f查看整體棧或者當前站幀
  • attach

    • 常規的通過gdb cmd這種方式開啟調試,特別說明的是通過attach的方法附加到一個指定的進程上去進行調試,這種方法適合于調試一個已經運行的進程,具體用法:gdb -p [pid]
    • 此時被attach的進程會阻塞,進入T模式(ps 命令看到STATE為T),如果調試完畢了,使用 detach 命令就釋放了進程,它就自由運行了。

    coredump 文件

    • 開啟coredump
    echo "ulimit -c unlimited" >> /etc/profile
    • 設置coredump的命名規則
    # 在/etc/sysctl.conf文件中加入 # 例如下面這個命令,可以通過在%e前面增加/home/之類的路徑使其保存到特定路徑 kernel.core_pattern=%e.core.%s_%t 并保存退出,執行下面指令使其生效 sysctl -p# 參數含義%% output one '%'%p pid%u uid%g gid%s signal number%t UNIX time of dump%h hostname%e executable filename# 默認是這樣的 |/usr/share/apport/apport %p %s %c %PIf the first character of the pattern is a '|', the kernel will treatthe rest of the pattern as a command to run. The core dump will bewritten to the standard input of that program instead of to a file.
    • 通過cat /proc/sys/kernel/core_pattern 驗證設置的pattern

    開始調試core文件

    調試的話輸入: gdb filename core

    filename就是產生core文件的可執行文件,core就是產生的dump文件

    使用gdb dump內存

  • 首先使用/proc/<pid>/maps和/proc/<pid>/smaps確定內存地址,然后通過如下命令dump memory
  • (gdb) ! grep heap /proc/1131/maps 00c7d000-00d94000 rw-p 00000000 00:00 0 [heap] (gdb) dump binary memory /tmp/python-heap.bin 0x00c7d000 0x00d94000

    然后可以使用如[xxd](https://man.cx/ xxd(1))查看內存

    gdb讀取內存

    (gdb) define xxd dump binary memory dump.bin $arg0 $arg0+$arg1 shell xxd dump.bin shell rm -f dump.bin end (gdb) xxd 0x00007f3498000000 32 0000000: 2000 001c 367f 0000 0000 00a4 347f 0000 ...6.......4... 0000010: 0000 0004 0000 0000 0000 0004 0000 0000 ................

    使用gdb打印棧幀

    gdb中輸入

    set logging file my_back_trace.txt thread apply all bt full quit

    或者把上述命令放到一個文件gdb-instructions.txt中并執行命令

    echo -ne "set logging file my_back_trace.txt\nthread apply all bt full\nquit" > gdb-instructions.txt gdb /exe $(pidof exe) -x gdb-instructions.txt

    參考鏈接

  • DebuggingWithGdb python 使用gdb調試的兩種方法
  • gdb不在斷點處停留的問題 set follow-fork-mode child
  • Stopping and starting multi-thread programs 這個應該是官方教程了吧
  • Debugging programs with multiple threads 官方文檔教你多線程debug
  • 10.19 How to Produce a Core File from Your Program
  • 5.5.4 Thread-Specific Breakpoints 斷點只打在對應的線程上
  • linux下利用backtrace追蹤函數調用堆棧以及定位段錯誤
  • gdb 打印內存和數組p *arrayPtr@256
  • Dumping memory with GDB
  • Linux Core Dumps
  • 調試心得

  • 除了問題首先要仔細排查core的地方,先把core的地方看清楚
  • 如果core的地方沒有出現abort、raise之類的,說明是core的當前行segment fault了,原因大概是因為當前行有一個空懸指針之類。
  • 第一條說的對,一定要看core、死鎖出現的地方,以及附近的代碼。比如spdk里面每個core一直是100%,你就根本無法從top里面判斷出來到底是spin住了還是線程得不到調度卡死了。
  • 總結

    以上是生活随笔為你收集整理的gdb常用命令及参考文档的全部內容,希望文章能夠幫你解決所遇到的問題。

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