zoukankan      html  css  js  c++  java
  • gdb调试

    最近在重构一个后台模块,原来是使用PHP脚本写的,效率比较低,现在使用C 重构,大量造轮子,很多php功能函数,

    只是简单一行的调用,用C却要很多行代码实现,确实很要命,不过逻辑是自己来控制,内存自己申请和释放,效率就是比PHP

    快多了,但是写大量C代码,调试的时候,经常Segmentation fault,这个时候就是gdb要出场的时候了,由于gdb有较多命令

    过一段时间不用,难免会忘记。索性写在博客里,备忘。

    我常用的还是几个命令,break,contiue(c),run(r),backtrace(bt),list(显示行号) ,next(n 下一行),step(s 跳入函数),finish(跳出函数),

    print(打印),frame。

    总之以上几个命令,用的细,基本上可以快速定位问题

    举个例子,目前执行main程序segmentfault

    gdb main,有类似错误提示:Program received signal SIGSEGV, Segmentation fault

    这样的错误提示基本上没用,直接backtrace 打印堆栈信息 

     

     已4层堆栈调用,前两个栈是开源的cJSON库的实现,应该不会出问题,从第3个开始我写的,所以直接frame 3  查看栈信息

     发现group结构体的name变量为空。

    定位到错误位置,然后该代码吧。查找错误就是这么简单!

    下面是gdb常用的命令列表,贴一下

    调用运行命令

    命令

    参数含义

    说明

    continue

     

    令程序继续运行

    step

     

    单步步入

    next

     

    单步步过

    finish

     

    执行到当前函数代码直到函数返回

    until

     

    跳出循环,让程序一直执行,直到到达比发出until命令时所在源代码行号更大的位置

    stdpi

     

    指令级单步步入

    nexti

     

    指令级单步步出

    print /f expr

    要打印的表达式。其中可以是x十六进制 十进制o八进制等等。

    打印表达式的值,可指定打印格式

    whatis

     

    查看变量数据类型的简要说明

    ptype

     

    查看变量数据类型的详细说明

    x/nfu addr

    要查看的内存地址

    查看指定内存地址处的数据,可指定模式、长度等

    Info registers

     

    查看CPU寄存器

    补充:

         Step命令,如果step命令将要运行的源代码行上有函数调用,那么step命令将导致GDB进入到被调用函数的内部。通常把step称为步入命令。这也是与next命令的区别。

    其它命令:

    命令

    参数含义

    说明

    display

     

    设置自动显示列表,不带参数时显示列表中所有表达式

    delete display dnums..

    自动显示列表的ID

    删除自动显示列表

    disable dislay dnums..

    自动显示列表的ID

    禁用自动显示列表

    enable display dnums..

    自动显示列表的ID

    使用自动显示列表

    info display

     

    显示自动显示列表中的表达式

    show convenience

     

    显示快捷变量

    macro expand expression

    包含宏定义的表达式

    将表达式宏展示

    info macro macroname

    宏定义的名字

    查看宏定义的信息

    generatre-core file

     

    产生转储文件

    backtrace

    n 最内层的n个函数栈帧

    -n 最外层n个函数栈帧

    栈帧回溯

    frame

    栈帧号或者内存地址

    选定栈帧,不带参数时显示栈帧简要信息

    up

    栈帧号

    选定栈帧上移

    down

    栈帧号

    选定栈帧下移

    info frame

     

    显示栈帧详细信息

    info agrs

     

    显示当前选定栈帧的函数参数

    info locals

     

    显示当前选定栈帧中的所有局部变量

    set variable expr

    赋值表达式

    给变量赋值或者修改变量的值

    print

    赋值表达式

    给变量赋值或者修改变量的值

    jump

     

    使程序从另外的地址开始执行

    signal sig

    信号值或者信号和名称

    向被调试程序发送信号

    call expr

    包含函数调用的表达式

    调用函数

    print expr

    包含函数调用的表达式

    调用函数

    list

    函数名 行号 地址 偏移等

    列出程序源码

    set listsize count

     

    设置 list默认显示的行数

    disassemble

     

    反汇编被调试程序

    set disassembly-flavor instruction-set

     

    设置反汇编格式

  • 相关阅读:
    SQLServer2008 行转列2
    SQLServer2008 行转列
    关于删除数据仓库的数据
    PowerDesign不让name和code联动
    提高SQL查询效率(SQL优化)(转载)
    SQL优化----百万数据查询优化(转载)
    运行程序向一个Java类中动态添加注解。
    开阔自己的视野,勇敢的接触新知识(转)
    [置顶] JAVA识别身份证号码,H5识别身份证号码,tesseract-ocr识别(一)(转)
    一个谷歌程序员的算法学习之路
  • 原文地址:https://www.cnblogs.com/geeker/p/4520214.html
Copyright © 2011-2022 走看看