日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁(yè) > 單片機(jī) > 程序喵大人


gdb基本上是每個(gè)unix環(huán)境開發(fā)者都會(huì)使用的調(diào)試工具,使用gdb基本上可以按照自己的需求隨心所欲的運(yùn)行程序,可讓被調(diào)試的程序在自己所指定的斷點(diǎn)處停住,同時(shí)可以檢查程序當(dāng)前的狀態(tài),檢查各種變量及寄存器的值,也可以動(dòng)態(tài)的改變程序的執(zhí)行環(huán)境。本期純干貨,無(wú)廢話,準(zhǔn)備好開始咯~


gdb調(diào)試的三種方法
  1. gdb filename:run開始、quit結(jié)束

  2. gdb attach pid:程序已經(jīng)運(yùn)行后,可使用attach跟蹤進(jìn)程,attach目標(biāo)進(jìn)程后,調(diào)試器會(huì)暫停下來(lái),需要continue才繼續(xù),停止調(diào)試后使用detach命令分離調(diào)試器,quit結(jié)束

  3. gdb filename corename:默認(rèn)不開啟core,需要設(shè)置core文件大小,使用ulimit -a可查看core文件大小,使用ulimit -c [n]設(shè)置core文件最大n字節(jié),使用ulimit -c unlimited表示修改為不限制大小。

自定義core文件名稱

core文件的默認(rèn)路徑和名稱為當(dāng)前工作目錄下生成的"core",通過(guò)如下方式可修改core的目錄和文件名稱:
echo "/root/test/core-%e-%p-%t" > /proc/sys/kernel/core_pattern
%p->pid
%u->uid
%g->gid
%s->signal
%t->timestamp
%h->hostname
%e->exectable name

常用命令
  • run(r): 運(yùn)行一個(gè)程序

  • start: 執(zhí)行程序,停在main函數(shù)處

  • continue(c): 讓暫停的程序繼續(xù)執(zhí)行,continue默認(rèn)遇到斷點(diǎn)時(shí)候會(huì)暫停執(zhí)行,可以使用continue n表示繼續(xù)執(zhí)行一定次數(shù)

  • next(n): 運(yùn)行到下一行

  • step(s): 進(jìn)入到調(diào)用函數(shù)內(nèi)部

  • until(u): 運(yùn)行到指定行停下來(lái)

  • finish(fi): 結(jié)束當(dāng)前調(diào)用函數(shù),到上一層函數(shù)調(diào)用處

  • return: 結(jié)束當(dāng)前調(diào)用函數(shù)并返回指定值到上一層函數(shù)調(diào)用處
    finish命令會(huì)執(zhí)行函數(shù)到正常退出函數(shù),return會(huì)立即結(jié)束當(dāng)前函數(shù)并返回

  • jump(j): 執(zhí)行流跳轉(zhuǎn)到指定行或地址

  • print(p): 打印變量或寄存器值,也可以修改變量或寄存器值,默認(rèn)顯示有最大長(zhǎng)度,設(shè)置set print element 0可設(shè)置將打印結(jié)果顯示完整

  • backtrace(bt): 當(dāng)前線程調(diào)用堆棧
    bt n:顯示棧頂?shù)膎個(gè)幀信息
    bt -n: 顯示棧底的n個(gè)幀信息
    bt full: 顯示棧中所有幀的所有信息:函數(shù)參數(shù)、本地變量等

  • frame(f): 切換到調(diào)用線程的制定堆棧

  • thread id: 切換到指定線程

  • break(b): 添加斷點(diǎn)

  • tbradk: 添加臨時(shí)斷點(diǎn)(temporary)

  • rbreak [regex]在滿足正則表達(dá)式的函數(shù)處添加斷點(diǎn)

  • 條件斷點(diǎn)1:break [linenumber] if [condition]

  • 條件斷點(diǎn)2: 先break [linenumber]再condition [linenumber] [condition]

  • delete(del): 刪除斷點(diǎn)

  • enable: 啟用某個(gè)斷點(diǎn)

  • disable: 禁用某個(gè)斷點(diǎn)

  • enable once [num]:斷點(diǎn)只啟用一次

  • 捕獲: catch和tcatch表示捕獲xxx停止程序運(yùn)行
    catch syscall close 產(chǎn)生close系統(tǒng)調(diào)用后停止程序運(yùn)行

  • display: 每次程序中斷下來(lái)都會(huì)自動(dòng)輸出變量的值
    delete display
    info display
    delete display id

  • watch: 監(jiān)視某一變量或內(nèi)存地址值是否發(fā)生變化,當(dāng)變化時(shí)gdb就會(huì)停下
    watch [expr/field]:發(fā)生變化時(shí)暫停執(zhí)行
    awatch [expr/field]:被訪問(wèn)或者發(fā)生變化時(shí)暫停執(zhí)行
    rwatch [expr/field]:被訪問(wèn)時(shí)暫停執(zhí)行
    watch expr thread [threadid]:監(jiān)視某個(gè)線程的變量表達(dá)式

  • list(l): 顯示源碼
    list + 向后看源碼
    list - 向前看源碼
    默認(rèn)只顯示10行代碼,可以查看行數(shù)show listsize
    可以設(shè)置行數(shù)set listsize [num]
    list [first],[last]
    list [function]
    list [filename:function]

  • info: 查看斷點(diǎn)線程等信息

  • ptype: 查看變量類型
    whatis field 打印出field的結(jié)構(gòu)定義
    ptype field 更詳細(xì)的打印field的類型

  • set variable [field]=[expression]改變變量的值

  • set $r0=[value] 改變寄存器的值

  • disassemble(dis): 查看匯編代碼

  • show disassembly-flavor:顯示反匯編指令格式

  • set disassembly-flavor intel 設(shè)置反匯編格式為intel格式

  • set args: 設(shè)置程序啟動(dòng)命令行參數(shù)

  • show args: 查看設(shè)置的命令行參數(shù)

  • info break:查看斷點(diǎn)信息

  • info thread:查看線程信息

  • info sharedlibrary:顯示加載的動(dòng)態(tài)鏈接庫(kù)信息
    LWP:Light Weight Process輕量級(jí)進(jìn)程

  • signal SIGSEGV: 可以使用signal SIGSEGV手動(dòng)給程序發(fā)送信號(hào)
    handle SIGSEGV 使用handle表示gdb調(diào)試時(shí)忽略某個(gè)信號(hào)

  • show scheduler-locking:顯示當(dāng)前線程scheduler-locking狀態(tài)

  • set scheduler-locking on調(diào)試時(shí)將程序執(zhí)行流鎖定在當(dāng)前線程,禁止上下文切換

  • set scheduler-locking off:不鎖定任何線程,所有線程都執(zhí)行

  • set scheduler-locking step: 阻止其它線程在當(dāng)前線程單步調(diào)試時(shí)搶占當(dāng)前線程,當(dāng)next、continue、until、finish等其它線程才會(huì)執(zhí)行

  • checkpoint搭配restart [id]: 相當(dāng)于給在當(dāng)前進(jìn)程檢查點(diǎn)加一個(gè)快照,適合調(diào)試難以復(fù)現(xiàn)的bug,預(yù)感將要發(fā)生bug前,添加個(gè)checkpoint

  • 多線程調(diào)試
    thread id 多線程時(shí),默認(rèn)是主線程,這里可以切換當(dāng)前調(diào)試的線程為指定id的線程號(hào)
    thread apply all [cmd] 所有線程執(zhí)行命令
    thread apply 1 2 3 [cmd] 1 2 3線程執(zhí)行命令
    thread apply 1 2 3 bt: 查看1 2 3線程堆棧信息

tui調(diào)試

tui調(diào)試是gdb自帶的功能,ctrl+X+A可以開啟TUI模式,開啟TUI模式后默認(rèn)會(huì)有兩個(gè)窗口,上窗口是當(dāng)前執(zhí)行位置的代碼,下窗口是gdb環(huán)境

cgdb

cgdb是一個(gè)更高級(jí)的調(diào)試工具,和gdb使用方式完全相同,默認(rèn)就會(huì)開啟tui功能查看代碼

gdb調(diào)試原理

gdb調(diào)試原理是使用ptrace系統(tǒng)調(diào)用,可自行搜索相關(guān)文章。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除( 郵箱:macysun@21ic.com )。
關(guān)閉