<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    JUST DO IT ~

    我只想當個程序員

    2017年5月24日

         摘要: 檢查宏定義
    WIN32
    _DEBUG
    _WINDOWS
    _USRDLL  閱讀全文
    posted @ 2017-08-16 10:43 小高 閱讀(402) | 評論 (0)編輯 收藏

    GDB筆記

    概覽

    基礎

    用戶態會話

    調試模式

    • 轉儲文件調試

      瞬間靜態分析,進程死狀態。
      gdb –core=file

    • 交互調試

      1. 調試新進程
        gdb exe
        gdb –args exe [args]

      2. 調試已經運行的進程
        gdb –pid= 進程號

      3. 內核調試

    3種調試已有進程

    gdb exe

    .

    gdb –args exe [args]

    .

    gdb
    file exe
    run [args]

    .

    gdb –args gcc a.c -o a

    命令行參數

    show args

    set args 多次運行設置命令行參數

    環境變量和執行路徑

    path directory

    .

    show paths

    .

    show environment [varname]

    .

    set environment varname[=value] 清除或者設置環境變量

    工作目錄

    繼承進入gdb工作目錄

    改變工作目錄

    cd dirctory

    顯示路徑

    pwd

    輸入輸出

    info terminal
    run > a.txt
    tty /dev/ttyb

    遠程調試可用這些輔助。

    inferior 下層 多個進程調試

    inferior gdb維護的一系列對象,每個inf對應一個調試目標進程。

    info inferior 顯示下層信息
    NULL 程序沒有跑或者已經終止
    clone-inferior -copies 2 復制當前下層2份

    (gdb) info inferiors
    Num Description Executable
    * 1 process 10087 /home/gao/code/a
    (gdb) clone-inferior -copies 2
    Added inferior 2.
    Added inferior 3.
    (gdb) info inferiors
    Num Description Executable
    3 程序沒有跑或者已經終止 /home/gao/code/a
    2 /home/gao/code/a
    * 1 process 10087 /home/gao/code/a
    (gdb)

    切換下程

    inferior 2 切換2這個下程。
    進程號是0,沒開始運行。
    run 運行起來。

    .

    增加一個運行下層

    add-inferior -exec executeable 增加一個運行下層
    比如說調試一個服務端程序,一個客戶端程序。

    remove-inferior n 刪掉一個下層
    detach inferior 繼續運行 quit
    kill inferior 調試進程退了,但是inferior紀錄還在。

    Tab 幫助

    (gdb) remove-
    remove-inferiors remove-symbol-file
    (gdb) remove-
    remove-inferiors remove-symbol-file
    (gdb) remove-

    file 命令

    file a.exe 可自行文件和符號文件是一個文件

    可自行文件和符號文件分開

    exec-file 指定目標文件

    .

    symbol-file 指定符號文件

    run 開始運行
    可以支持 run > >> < 重定向

    set args 清理命令行參數

    附加到進程

    gdb –pid= pid

    attach pid

    終止調試進程

    detach pid 分離進程繼續運行

    .

    quit 進程退出

    .

    q
    ctrl + D

    執行控制

    斷點

    軟件斷點

    break 普通
    tbreak 一次性
    rbreak 正則表達式一批斷點

    • 基于cpu斷點指令,x86 int3機器碼0xcc。
    • 替換斷點位置的指令
    • CPU自執行這里觸發斷點異常。
    • 沒有斷點數量限制。

    硬件斷點

    • 基于cpu調試寄存器,dr0~dr7,數量限制。x86可以設定4個斷點。數量限制。
    • 不修改代碼,在只讀內存上設置斷點。EEPROM上的代碼設置。
    • 有數量限制。

    location

    • linespec

    1. 行號
    2. -/+ 偏移
    3. 文件名 :行號
    4. 函數名
    5. 函數:標號
    6. 文件名:函數
    7. 標號

    • explicit

    1. -source linename
    2. -function function
    3. -label label
    4. -line number

    • address location break * address

    實踐

    file banner
    b main 中斷在main函數
    info funciton useage 顯示useage函數地址
    info *0x88888e4 直接寫地址設定斷點
    info b 顯示所有斷點
    list usage 顯示useage函數
    b line.c:11
    b +2 當前顯示到14行+2行所以設定在17行

    虛擬機設定硬件斷點會失敗.
    (gdb)hbreak hd_ioctl
    (gdb) info b
    物理機可以設定.

    (gdb) hbreak v
    Hardware assisted breakpoint 2 at 0x40053a: v. (2 locations)
    (gdb) info b
    Num Type Disp Enb Address What
    1 breakpoint keep y
    breakpoint already hit 1 time
    1.1 y 0x000000000040054f in main at a.c:10 inf 1
    1.2 y 0x000000000040054f in main at a.c:10 inf 2
    2 hw breakpoint keep y
    2.1 y 0x000000000040053a in v at a.c:4 inf 1
    2.2 y 0x000000000040053a in v at a.c:4 inf 2
    (gdb)

    管理斷點

    info b 顯示斷點
    delete 1 刪除
    disable 1
    enable 1
    delete 刪除所有的斷點
    clear sum 刪除sum函數入口的所有斷點

    擴展斷點

    watchpoint 監視一個表達式,值變化中斷。

    watch a*b+c/d
    watch *( int * )

    watch fd 監控局部變量fd
    c 繼續運行
    info b //
    注意,x86硬件調試,寫操作,執行過這一行,gdb顯示下一行,要看上一行。hw watchpoint,在x86平臺wachtpoint基于硬件實現,其他平臺可能是基于軟件實現。 vc6純軟件執行,執行目標速度低。
    執行位置超過當前區域,無效監視點會被刪除。

    訪問監視點
    rwatch 讀停下來。
    awatch 讀或寫停下來。 awatch fd
    watch -l

    b hd_ioctl thread 1

    info threads 帶* 當前線程

    繁忙函數解決方案

    b hd_ioctl thread 1 if fd > 0

    當斷點,斷了后執行命令
    ()command 12
    ()silent
    ()print “fd is %d\n”,fd
    ()continue
    ()end

    動態ping不修改代碼。

    tracepoint 遠程主機通訊調試,前端stub立刻恢復執行,但會記錄下來。

    catchpoint

    執行控制

    進入子函數內部。單步 step

    匯編 stepi

    stepi 4
    類似nexti

    不要進入子函數

    next

    繼續執行

    continue

    跑起來直到3號斷點命中

    until 3
    跑起來直到3號斷點命中,快捷禁止其他斷點。

    恢復執行直到函數返回。

    finish

    調用函數!

    gdb 杜撰代碼調用函數。
    call sum(1,2) …

    強制返回

    強制main函數 return。
    return 1

    觸發中斷

    異常或斷點進入調試器。
    調試器發起中斷,讓程序中斷下來。ctrl+C,app收到中斷信號,進入調試器。

    符號

    調試器讀區 調試符號。

    二進制-調試符號-源碼

    linux dwarf 存儲調試符號信息。gcc

    readelf -h filename
    里面如果有line location debug標示

    readelf -w 導出調試文件

    gcc -g 才能輸出符號

    ubuntu 符號服務器
    < ddebs.ubuntu.com/pool/main/>
    分離操作
    strip

    安裝ubunte的linux 內核符號
    https://askubuntu.com/questions/197016/how-to-install-a-package-that-contains-ubuntu-kernel-debug-symbols

    安裝libc符號

    dpkg -s /lib/x86_64-linux-gun/libc-2.15.so
    dpkg -s libc.so.6
    sudo apt-get -c aptproxy.conf install libc6-dbg

    libc 調試符號

    sudo apt-get install libc6-dbg

    符號路徑

    gdb 使用file 或 symbol-file 加載符號文件
    自動搜索 path 路徑

    (gdb)i share
    * 共享庫沒調試信息

    搜索符號
    info vaiables regex 類名/函數名/變量名

    內存地址與符號互換

    info addriess 函數名

    info symbol 地址

    (gdb) info address main
    Symbol “main” is a function at address 0x400547.
    (gdb) info symbol 0x400547
    main in section .text of /home/gao/code/a

    .

    info os

    查看加載的文件內存位置

    info files

    列出全局變量

    info variable
    info va

    顯示源碼

    list
    list -
    dir 源碼路徑
    show dir

    常用命令源碼

    安裝系統工具源碼和調試

    apt-get source coreutils
    sudo apt-get install coreutils-dbgsym
    gdb /bin/ls
    list main
    dir ~/src/coreutils-7.4/src
    list main

    libc

    sudo apt-get source libc6-dev
    /home/ge/eglibc-2.15

    dir 搜索路徑 :分割
    $cdir 編譯路徑
    cwd 當前工作路徑

    查看調試目標

    觀察寄存器
    info reg


    子函數返回地址
    函數參數
    局部變量

    bt n 觀察函數返回地址
    frame n 切換棧幀
    up n
    down n
    info frame [address]
    info args
    info locals

    注意,切換棧幀之后可能會發生,本地變量值不準確,因為值存在寄存器中需要小心。

    觀察內存
    print

    p /f 表達式 表達式要打印位置
    xduotcf

    x

    x /Nuf
    N 打印幾個單元
    u 每個單元大小 b-1byte w-2byte h-4byte g-8byte

    f s字符串i指令格式

    x/s 0xfffff81946000 打印字符串

    x /32bx arg bit 16禁制

    (gdb) x /32bx &i
    0x7fffffffc76c: 0x01 0x00 0x00 0x00 0x70 0x05 0x40 0x00
    0x7fffffffc774: 0x00 0x00 0x00 0x00 0x40 0xfa 0xa2 0xf7
    0x7fffffffc77c: 0xff 0x7f 0x00 0x00 0x58 0xc8 0xff 0xff
    0x7fffffffc784: 0xff 0x7f 0x00 0x00 0x58 0xc8 0xff 0xff
    (gdb)

    p arg[0]
    p arg[i]

    p *&a[0]@10 a0數組開始的10個元素

    反匯編

    disas main main反匯編代碼
    x/5i schedule 這個地址開始的5條匯編指令。

    gdb mov 從左往右賦值at&t匯編。

    高級技巧

    信號

    • info signals 異常/同步/中斷

    stop 要不要中斷下來看
    printf 打印信息
    pass 要不要傳遞給應用程序。

    • handle 修改規則 handle signal act print noprint stop nostop pass nopass

    handle SIGPIPE 不要中斷下來,打印一個信息,網絡程序常用

    (gdb) handle SIGPIPE nostop
    Signal Stop Print Pass to program Description
    SIGPIPE No Yes Yes Broken pipe

    Thread

    info threads

    LWP-light weight process 線程編號。
    * gdb當前線程

    切換當前線程

    thread 2

    打印所有線程

    thread apply all bt 針對一群線程的命令避免切換來看。

    線程改名字

    thread name [name]

    我自己經驗 LWP 可以很好的觀察線程負載情況。

    posted @ 2017-05-24 14:18 小高 閱讀(316) | 評論 (0)編輯 收藏

    導航

    <2017年5月>
    30123456
    78910111213
    14151617181920
    21222324252627
    28293031123
    45678910

    統計

    常用鏈接

    留言簿(3)

    隨筆分類(352)

    收藏夾(19)

    關注的blog

    手冊

    搜索

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 豆国产96在线|亚洲| 男性gay黄免费网站| 99精品视频免费观看| 国产亚洲人成网站在线观看不卡| 日韩在线观看免费| 亚洲不卡AV影片在线播放| 午夜亚洲国产精品福利| 免费在线黄色网址| 免费无码午夜福利片69| 不卡一卡二卡三亚洲| xxxx日本在线播放免费不卡| 国产成人综合亚洲AV第一页 | 亚洲AV无码一区东京热| 久久青草免费91线频观看不卡| 亚洲综合无码一区二区| 免费A级毛片无码无遮挡内射| 99热亚洲色精品国产88| 午夜无遮挡羞羞漫画免费| 亚洲AV无码一区二区三区网址| 亚洲不卡无码av中文字幕| 女人隐私秘视频黄www免费| 亚洲精品中文字幕乱码影院| 67194成是人免费无码| 美女羞羞视频免费网站| 亚洲乱码国产乱码精品精| 亚洲免费视频网址| 精品免费AV一区二区三区| 黑人大战亚洲人精品一区| 最近中文字幕无免费| 亚洲av成人无码网站…| 中文字幕久久亚洲一区| 99久久综合国产精品免费| 精品一区二区三区无码免费直播| 亚洲国产精品国自产拍AV| 成人免费男女视频网站慢动作| 久久久久久久久无码精品亚洲日韩| 亚洲情a成黄在线观看| 一级毛片**不卡免费播| 欧美色欧美亚洲另类二区| 亚洲AV无码一区二区乱孑伦AS| 一个人在线观看视频免费|