• gdb常用功能


    1,调试core dump 文件
        ulimit -c 1024:设置coredump文件大小为1024,否则默认不会生成coredump文件
        gdb -c core:gdb调试该coredump文件
        file a.out:指定符号表文件
        bt:打印堆栈信息

    2,插入断点:
        b/break  15
        b  funcname
        b  filename::linenum
        b  默认在下一条指令停止
        b if a=100

    3,退出gdb
        q
        quit

    4,执行shell命令
        shell clear

    5,停止运行程序/恢复运行
        断点(breakpoint),观察点(watchpoint),捕捉点(catchpoint),信号(signal),线程停止(thread stops)
        c/continue恢复运行

    6,设置观察点
        watch  <expr>    
        rwatch  <expr>    当expr被读时停止程序
        awatch  <expr>    当expr被读或写时停止程序

    7,维护停止点
        clear    清除所有停止点,只有在程序运行时才起作用
        clear  <function>
        clear  <linenum>
        d/delete  [breakpoints][range...]    删除指定的断点,breakpoints表示断点号,range表示断点号的范围,如3-7
        dis/disable  [breakpoints][range...]    禁用指定的断点

    8,单步运行
        c/fg/continue    恢复程序运行直到下一个断点
        step  <count>    单步count次,如果有函数调用,进入该函数内部执行
        next  <count>    单步count次,如果有函数调用,不会进入该函数
        finish    运行程序直到当前函数完成返回
        u/until    运行程序直到完成当前循环体并返回

    9,查看栈信息
        bt/backtrace    打印当前函数调用栈的所有信息
        bt <n>    打印栈顶上n层信息
        bt <-n>    打印栈低下n层信息
        f/frame  <n>    一般来说,程序停止时,当前栈就是最顶层栈,f/frame 0表示打印0层,即栈顶信息,n表示打印第n层栈信息,打印信息比bt丰富
        up  <n>    向栈的上面移动n层,如果没有n,则表示移动一层
        down  <n>    向栈的下面移动n层,如果没有n,则表示移动一层
        info  f/frame,打印更为详细的信息
        info  args    打印当前函数的参数名及值
        info  locals    打印当前函数中所有局部变量的值
        info  catch    打印当前函数中异常处理信息

    10,查看源代码
        list  <linenum>    显示程序第linenum行的周围的源程序
        list  <function>    显示函数名为function的函数的源程序     
        list    显示当前行后面的源程序
        list -   显示当前行前面的源程序
        一般是打印当前行的上5行和下5行,如果显示函数是是上2行下8行,默认是10行,当然,你也可以定制显示的范围,使用下面命令可以设置一次显示源程序的行数
        set listsize <count>    设置一次显示源代码的行数
        show listsize    查看当前listsize的设置       
    list命令还有下面的用法:
        list <first>, <last>    显示从first行到last行之间的源代码
        list , <last>    显示从当前行到last行之间的源代码  
        list +    往后显示源代码
    一般来说在list后面可以跟以下这们的参数:
        <linenum>   行号
        <+offset>   当前行号的正偏移量
        <-offset>   当前行号的负偏移量
        <filename:linenum>  哪个文件的哪一行
        <function>  函数名
        <filename:function> 哪个文件中的哪个函数
        <*address>  程序运行时的语句在内存中的地址

    11,搜索源代码
        forward-search  <regexp>
        search  <regexp>    向前面搜索
        reverse-search  <regexp>    全部搜索

    12,源代码在内存中的位置
        info  line  <test.c:function>
        info  line  <linenum>

    13,查看源代码的机器码
        disassemble  function

    14,查看运行时数据
        p/print  <expr>
        p  /<f>  <expr>    <f>是输出的格式,如果设置十六进制输出的话,就是/x
        x  按十六进制格式显示变量。
        d  按十进制格式显示变量。
        u  按十六进制格式显示无符号整型。
        o  按八进制格式显示变量。
        t  按二进制格式显示变量。
        a  按十六进制格式显示变量。
        c  按字符格式显示变量。
        f  按浮点数格式显示变量。

    15,打印数组
        int *array = (int *) malloc (len * sizeof (int));
        p  *array@len    @左边是数组地址,右边是数组长度

    16,自动显示,即程序停止或单步跟踪时,变量自动显示
        display  <expr>
        display  /<fmt>  <expr>
        display  /<fmt>  <addr>
        info  display    打印设置的自动显示的变量信息

    17,查看寄存器的值
        info  registers
        info  all-registers
        info  registers  <regname...>


        需要注意的是,如果你的程序编译时开启了优化选项,那么在用GDB调试被优化过的程序时,可能会发生某些变量不能访问,或是取值错误码的情况。这个是很正常的,因为优化程序会删改你的程序,整理你程序的语句顺序,剔除一些无意义的变量等,所以在GDB调试这种程序时,运行时的指令和你所编写指令就有不一样,也就会出现你所想象不到的结果。对付这种情况时,需要在编译程序时关闭编译优化。一般来说,几乎所有的编译器都支持编译优化的开关,例如,GNU的C/C++编译器GCC,你可以使用“-gstabs”选项来解决这个问题。



  • 相关阅读:
    【蓝桥杯】基础练习 十六进制转十进制
    【蓝桥杯】 基础练习 十六进制转八进制
    【蓝桥杯】 入门训练 序列求和
    【蓝桥杯】 入门训练 圆的面积
    【蓝桥杯】入门训练 Fibonacci数列
    6次考试小结
    搜索
    sudoku
    生日蛋糕
    木棒
  • 原文地址:https://www.cnblogs.com/yxl10/p/3838439.html
Copyright © 2020-2023  润新知