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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

gdb常用命令及参考文档

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

gdb常用命令及參考文檔

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


前言

本文的目的只是為了列述gdb常用命令,供日常調(diào)試時(shí)自查

使能方式

編譯的時(shí)候加上-g 去掉-s選項(xiàng)

-s strip - Discard symbols from object files.
-fvisibility=hidden 這個(gè)也不能加
-g gdb 編譯 -g3 3只是級(jí)別。這個(gè)級(jí)別會(huì)產(chǎn)生更多的額外debug信息。3這個(gè)級(jí)別可以調(diào)試宏。

啟動(dòng)方式

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

常用命令

!

在gdb內(nèi)部使用!開頭的命令,可以直接調(diào)用外部命令,如

(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 或者函數(shù)名

加斷點(diǎn)

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

    利用break if命令,可以設(shè)置一個(gè)條件斷點(diǎn),如下

    break line-or-function if expr

    例:

    break 46 if testsize==100

    delete、 clear

    如果我們想刪除某個(gè)斷點(diǎn),有兩種方法:

  • delete 命令 簡(jiǎn)寫d
    • delete break 刪除所有的斷點(diǎn)
    • delete break n 刪除某個(gè)斷點(diǎn) n為斷點(diǎn)號(hào)
  • clear 命令
    • clear 行號(hào) 刪除設(shè)在某一行的斷點(diǎn)
  • info

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

    命令功能
    info break/breakpoint查看斷點(diǎn)
    info break/breakpoint N查看第N個(gè)斷點(diǎn)
    info local或locals 查看當(dāng)前stack frame局部變量
    info variables查看全局和靜態(tài)變量
    info args查看當(dāng)前stack frame參數(shù)
    info thread查看所有的thread

    r/run

    開始

    n

    單步執(zhí)行,但是不會(huì)進(jìn)入函數(shù)內(nèi)部

    s/step

    單步執(zhí)行,會(huì)進(jìn)入函數(shù)內(nèi)部

    p/print

    print查看當(dāng)前某個(gè)變量 p空格后面加變量名

    打印數(shù)組

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

    p *arrayPtr@256

    set

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

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

    finish

    跳出某個(gè)函數(shù)

    c/continue

    繼續(xù)運(yùn)行

    kill

    退出調(diào)試

    file

    裝入需要調(diào)試的exe file

    watch

    監(jiān)視變量

    start

    開始執(zhí)行程序,在main函數(shù)的第一條語句前面停下來

    display/disp

    跟蹤查看某個(gè)變量, 每次停下來都現(xiàn)實(shí)哦

    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

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

    舉例

    x/3uh buf

    技巧

    可以使用如下命令,把一個(gè)內(nèi)存地址轉(zhuǎn)化為一個(gè)指針并打印

    p *(struct virtio_net*)0x20007ffefa00

    backtrace/bt

    查看函數(shù)調(diào)用信息(堆棧)

    frame/f

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

    args

    啟動(dòng)程序的三種方式

  • gdb ${你的程序} 進(jìn)入gdb后,輸入run(簡(jiǎn)寫r) ${arg1} ${arg2} … ${argN}
  • gdb --args ${你的程序} ${arg1} ${arg2} … ${argN} 進(jìn)入gdb后,運(yùn)行run。
  • gdb進(jìn)入gdb后,輸入file ${你的程序}。然后使用set args ${arg1} ${arg2} … ${argN} 設(shè)定好你的程序參數(shù),再運(yùn)行run。
  • 信號(hào)調(diào)試

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

    多線程調(diào)試

  • 進(jìn)程調(diào)試死鎖
  • ulimit -c unlimited 之后kill掉進(jìn)程,會(huì)產(chǎn)生core文件
  • thread apply all bt
  • gdb 會(huì)打出所有線程的棧,如果你發(fā)現(xiàn)有那么幾個(gè)棧停在 pthread_wait 或者類似調(diào)用上,大致就可以得出結(jié)論:就是它們幾個(gè)兒女情長(zhǎng),耽誤了整個(gè)進(jìn)程。
  • 也可以使用gdb attach <進(jìn)程號(hào)> 直接把a(bǔ)ttach上被死鎖的進(jìn)程
  • thread 5 切換到進(jìn)程5
  • 使用bt或者f查看整體棧或者當(dāng)前站幀
  • attach

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

    coredump 文件

    • 開啟coredump
    echo "ulimit -c unlimited" >> /etc/profile
    • 設(shè)置coredump的命名規(guī)則
    # 在/etc/sysctl.conf文件中加入 # 例如下面這個(gè)命令,可以通過在%e前面增加/home/之類的路徑使其保存到特定路徑 kernel.core_pattern=%e.core.%s_%t 并保存退出,執(zhí)行下面指令使其生效 sysctl -p# 參數(shù)含義%% output one '%'%p pid%u uid%g gid%s signal number%t UNIX time of dump%h hostname%e executable filename# 默認(rèn)是這樣的 |/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 驗(yàn)證設(shè)置的pattern

    開始調(diào)試core文件

    調(diào)試的話輸入: gdb filename core

    filename就是產(chǎn)生core文件的可執(zhí)行文件,core就是產(chǎn)生的dump文件

    使用gdb dump內(nèi)存

  • 首先使用/proc/<pid>/maps和/proc/<pid>/smaps確定內(nèi)存地址,然后通過如下命令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))查看內(nèi)存

    gdb讀取內(nèi)存

    (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

    或者把上述命令放到一個(gè)文件gdb-instructions.txt中并執(zhí)行命令

    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調(diào)試的兩種方法
  • gdb不在斷點(diǎn)處停留的問題 set follow-fork-mode child
  • Stopping and starting multi-thread programs 這個(gè)應(yīng)該是官方教程了吧
  • Debugging programs with multiple threads 官方文檔教你多線程debug
  • 10.19 How to Produce a Core File from Your Program
  • 5.5.4 Thread-Specific Breakpoints 斷點(diǎn)只打在對(duì)應(yīng)的線程上
  • linux下利用backtrace追蹤函數(shù)調(diào)用堆棧以及定位段錯(cuò)誤
  • gdb 打印內(nèi)存和數(shù)組p *arrayPtr@256
  • Dumping memory with GDB
  • Linux Core Dumps
  • 調(diào)試心得

  • 除了問題首先要仔細(xì)排查core的地方,先把core的地方看清楚
  • 如果core的地方?jīng)]有出現(xiàn)abort、raise之類的,說明是core的當(dāng)前行segment fault了,原因大概是因?yàn)楫?dāng)前行有一個(gè)空懸指針之類。
  • 第一條說的對(duì),一定要看core、死鎖出現(xiàn)的地方,以及附近的代碼。比如spdk里面每個(gè)core一直是100%,你就根本無法從top里面判斷出來到底是spin住了還是線程得不到調(diào)度卡死了。
  • 總結(jié)

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

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。