gdb note

作者: 姜附 | 来源:发表于2021-01-04 14:13 被阅读0次

    .gdbinit###

    handle pass
    handle nostop
    set confirm off
    set pagination off
    set print pretty

    set target-async 0

    set scheduler-locking on

    set non-stop off

    .gdbinit###

    define gobt

    set logging file ~/gdblog ## 改变记录文件,默认记录文件是gdb.txt。

    默认这个项目是关闭,

    也就是以添加的形式将记录信息写入文件,这样之前文件中的信息不会被覆盖掉。

    注意:如果设置这个选项的时候记录功能已经打开,需要关闭记录功能再重新打开才能起作用。

    set logging overwrite off

    set logging redirect on ## 设置输出信息只记录到文件不作显示。
    set logging on
    bt
    set logging off
    shell echo #Local Variables: # >> ~/gdblog
    shell echo #mode: compilation # >> ~/gdblog
    shell echo #End: # >> ~/gdblog
    shell emacs -n ~/gdblog
    end

    define showmem
    set DATA=arg0
    set LEN=arg1
    printf "%p:%d\n", DATA,LEN

    set $COUNT=0
    while ($COUNT < $LEN)
        printf "0x%02x ", *(unsigned char*)($DATA+$COUNT)
        set $COUNT=$COUNT+1
        if (0 == ($COUNT % 16))
            printf "\n"
        end
    end
    
    printf "\n"
    

    end

    p/x data@len
    p/x data[0]@len
    p/x *data@len

    variable, 变量

    set VAR=0 setVAR=$VAR+1

    condition, 条件

    if (10 < $VAR)
    c
    end

    loop, 循环

    while (VAR < obj.size) printf "%d/%d\n",VAR, obj.size
    set VAR=VAR+1
    end

    -silent

    gdb -args ./a.out -c -m -t
    set args –b –x
    show args
    run <args>
    cd
    dir

    查看数组的前5个值
    p arr[0]@5

    signal处理
    handle pass
    handle nostop

    断点
    break 46 if testsize==100
    break csras_server/server.cpp:46
    break 123
    commands #默认是给最近定义的断点
    silent
    watch i
    c
    end

    commands 2 #直接指定给哪一个断点
    enable
    c
    end

    clear server.cpp:123

    tui模式
    (cmd)command
    (src)source
    (asm)assembly
    (reg)register
    layout src
    layout asm
    layout split
    winheight src +/-5
    focus next/prev

    gdb 调试跟踪多进程程序
    gdb只能跟踪一个进程(默认是跟踪父进程),而不能同时跟踪多个进程,
    可以设置gdb跟踪父进程还是子进程, 命令如下:
    set follow-fork-mode parent 跟踪父进程, 默认
    set follow-fork-mode child 跟踪子进程

    set scheduler-locking on # 多线程下禁止线程切换
    set scheduler-locking off|on|step #估计是实际使用过多线程调试的人都可以发现,
    #在使用step或者continue命令调试当前被调试线程的时候,
    #其他线程也是同时执行的,怎么只让被调试程序执行呢?
    #通过这个命令就可以实现这个需求。
    #off 不锁定任何线程,也就是所有线程都执行,这是默认值。
    #on 只有当前被调试程序会执行。
    #step 在单步的时候,除了next过一个函数的情况(熟悉情况的人可能知道,
    #这其实是一个设置断点然后continue的行为)以外,只有当前线程会执行。

    break test.c:123 thread all # 在所有线程中相应的行上设置断点
    thread apply ID1 ID2 command # 让一个或者多个线程执行GDB命令command。
    thread apply all command # 让所有被调试线程执行GDB命令command
    set target-async 1 # 异步模式
    set pagination off
    set non-stop on

    设置core环境
    uname -a 查看机器参数
    ulimit -a 查看默认参数
    ulimit -c 1024 设置core文件大小为1024
    ulimit -c unlimit 设置core文件大小为无限

    帮助
    help xxx
    apropos xxx

    跳转
    jump 5
    j 123
    需要注意的是,跳转到第5行执行完毕之后,如果后面没有断点则继续执行,而并不是停在那里了。
    可配合tbreak使用。

    执行N次下一步
    next N

    util N

    检测表达式变化则停住
    watch i != 10
    这里,i != 10这个表达式一旦变化,则停住。watch 为表达式(变量)expr设置一个观察点。一量表达式值有变化时,马上停住程序(也是一种断点)。
    rwatch 当expr被读时,停住程序。
    awatch 当expr被读或被写时,停住程序。

    监视指定内存
    p &(s_packet->data)
    $10 = (const uint8_t **) 0x7fffec0015d8
    awatch (uint8_t)0x7fffec0015d8

    info frame 查看当前函数的程序语言
    info source 显示当前的调试源文件
    whatis var 显示一个变量var的类型
    kill 终止一个正在调试的程序
    whatis var 显示一个变量var的类型
    ptype var 以更详细的方式显示变量var的类型,这里,会打印出var的结构定义
    print x=4 修改运行时候的变量值

    备常用命令:
    1.常看源码:list(l) 
      list <linenumber> 行号
      list <+offset> 当前行号的正偏移
      list <-offset> 当前行号的负偏移
      list <filename:linenumber> 哪个文件的哪一行
      list <function> 函数名
      list <filename:function> 文件的哪个函数
      list <*address> 程序运行时语句在内存中的地址

    2.设置断点:break(b)
      break <function> 指定函数断点
      break <linenumber> 指定行号断点
      break <+offset/-offset> 当前行号的正/负偏移
      break <filename:linenumber> 哪个文件的哪一行
      break <*address> 运行中的内存地址
      break 不带参数,下一条指令停止处
      break ... if <condition> 在运行中,当condition条件满足时停止。
        eg. break if i=100 //当i=100时,立即停止
    break foo if i=100 //断点设置在foo中,断点条件是i-100, 一点在函数foo中,i的值等于100,被停止。

    3.查看信息:info
      info break 查看断点信息
    info locals 打印出当前函数中所有局部变量及其值
      info stack 查看栈中信息
    info frame 更详细的栈层地址信息
      info args 查看参数信息
      info registers/info all-registers 查看(所有)寄存器信息
      info sources 查看项目的源代码信息

    4.维护breakpoint:disable/enable/clear/delete
    disable(dis) 【breakpoints】 【range...】
    如果没有参数,则停止所有的断点,
    enable 【breakpoints】【range】
    clear <function>/<filename:function>/<linenum>/<filename:linenum>
    清楚已定义的停止点
    delete [breakpoints] [ranga...]
    删除指定的断点

    以下是list命令的說明。
    參數 說明
    list filename:number 列出某檔案的第幾行,檔案是可省略的。
    list [function] 列出某函數的程式碼
    list 繼續印出程式碼
    list - 印出上一次list的程式碼的前一段程式碼(類似向上翻動)
    show listsize 顯示現在一次印出幾行
    set listsize 設定一次印出幾行

    查看文件中某变量的值
    file::variable
    function::variable
    可以通过这种形式指定你所想查看的变量,是哪个文件中的或是哪个函数中的。例如,查看文件f2.c中的全局变量x的值:
    gdb) p 'f2.c'::x

    如果a是一个数组,10个元素,如果要显示则:
    (gdb) print *a@10
    这样,会显示10个元素,无论a是double或者是int的都会正确地显示10个元素。

    用16进制显示(var)值
    print /x var
    这里可以知道,print可以指定显示的格式,这里用'/x'表示16进制的格式。
    可以支持的变量显示格式有:
    x 按十六进制格式显示变量。
    d 按十进制格式显示变量。
    u 按十六进制格式显示无符号整型。
    o 按八进制格式显示变量。
    t 按二进制格式显示变量。
    a 按十六进制格式显示变量。
    c 按字符格式显示变量。
    f 按浮点数格式显示变量。

    如果a是一个数组,10个元素,如果要显示则:
    print *a@10
    p a[0]@10

    print /x var
    这里可以知道,print可以指定显示的格式,这里用'/x'表示16进制的格式。
    可以支持的变量显示格式有:
    x 按十六进制格式显示变量。
    d 按十进制格式显示变量。
    u 按十六进制格式显示无符号整型。
    o 按八进制格式显示变量。
    t 按二进制格式显示变量。
    a 按十六进制格式显示变量。
    c 按字符格式显示变量。
    f 按浮点数格式显示变量。

    循环
    set $PID=1

    PID=PID+1

    while (PID <= 47) printf "thread %d",TID
    thread PID btPID=$PID+1
    end

    打印所有线程的栈
    set logging file <文件名>
    set logging on
    thread apply all bt
    set logging off
    quit

    打印字符串,无省略
    printf "%s\r\n", addr

    默认编译的时候,调试过程是看不见宏的值的。编译时候需要给选项。-g3
    gcc -g3 -o test.c test
    察看宏(macro)命令: p macroname(...)
    就像察看一个普通变量一样。如果只想看宏的展开形势,就用如下命令:
    macro expand macroname(...) 查看展开形式
    还可以用info macro macroname 查看宏定义。

    保存断点到文件

    save breakpoint outputfile

    相关文章

      网友评论

          本文标题:gdb note

          本文链接:https://www.haomeiwen.com/subject/bohvoktx.html