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

    调试环境:linux
    调试工具:gdb

    调试类别

    1、调试core文件  gdb 应用程序名 core文件名
    2、调试正在执行的程序 gdb 应用程序名 pid
    3、gdb 应用程序名         
    4、gdb --args 应用程序名 应用程序的运行参数


    常用命令

    * list 显示程序中的代码,常用使用格式有 l (+/-)n
    * break :在程序中设置断点,当程序运行到指定行上时,会暂停执行。使用格式:break 要设置断点的行号
    * clear :和break相反,clear用于清除断点。使用格式:clear 要清除的断点所在的行号
    * run :启动程序,在run后面带上参数可以传递给正在调试的程序。
    * whatis :显示某个变量或表达式的数据类型。使用格式:whatis 变量或表达式
    * print :打印变量或表达式的值。使用格式:print
    * frame :打印栈帧。使用格式: frame 栈帧号
    * info frame :显示当前栈帧的详细信息。
    * until(u) : 一直执行到当前行或指定位置,或是当前函数返回 until + 行号

    * c (cont / continue) :  断点A到断点B,run程序后再A断点停止,如果想一步执行到断点B(能命中情况下),可以用改命令   (2014-09-15补充)

    线程操作:

    info threads    #   查看所有线程信息
    thread 线程id   #   切换到指定线程
    thread apply [threadno | all ] 参数     #   对所有线程都应用某个命令

    子进程调试:

    set follow-fork-mode child|parent   #   fork后,需要跟踪谁
    show follow-fork-mode
    set detach-on-flow on|off           #   fork后,需要两个都跟踪吗

    info forks                          #   显示所有进程信息
    fork 进程id                         #   切换到某个进程
    detach-fork 进程id                  #   不再跟踪某个进程
    delete fork 进程id                  #   kill某个进程并停止对它的跟踪

    检查点:     checkpoint/restart
    查看停止原因:  info program

    //--2014-09-03 补充-----------------------------

    1、查看全局变量 (局部变量和全局变量重名)

        符号: "::"
        格式: file::变量名  function::变量名
        实例: gdb) print 'file.c'::val

    2、查看连续的内存空间,例如数组

        符号: "@"
        格式:  p *array@len
        说明: @左边是数组的首地址,@的右边是要查看数组的长度,静态数组可以直接p 数组名

    3、查看格式

        x 按十六进制格式显示变量。
        d 按十进制格式显示变量。
        u 按十六进制格式显示无符号整型。
        o 按八进制格式显示变量。
        t 按二进制格式显示变量。
        a 按十六进制格式显示变量。
        c 按字符格式显示变量。
        f 按浮点数格式显示变量。

        使用方法实例: p/x 变量

    4、查看内存

        使用examine (简写 x)查看
        参数:
            n:内存长度  
            f: 显示格式,(x,d...)
            u:单前地址完后请求的字节数,默认4个字节  b表示单字节,h表示双字节,w表示四字节,g表示八字节
        实例: x/3xh

    5、查看历史记录

        print 查看变量的时候,历史记录被保存到 $1, $2 .. 中,可以用$1 去访问历史变量


    //------------------------------------------------------------------------------------

    GDB打印void*类型变量

    由于path.etls的的类型是void*类型,所以不能直接打印出来,那么则强制转换一下,赋值给另一个变量,再把另一个变量值打印出来。

    (gdb) set $path=((ngx_path_t     **)ngx_cycle->paths.elts)[2]
    (gdb) print *$path 

    //------------------------------------------------------------------------------------

    调试代码如果是静态库,尝试

    layout asm

    s

    进不去的话,尝试将静态库 加-g,编译一下

  • 相关阅读:
    TIOBE2017榜单公布_PHP还会是世界上最好的语言吗?
    一个优秀的程序猿应该具备哪些技能?
    7月10日云栖精选夜读:看阿里云窄带高清如何支援优酷 让《楚乔传》更清晰
    如何修复Kindle频繁自动锁屏和解锁
    CentOS 7 配置nginx的service 脚本例子
    Linux系统磁盘分区(逻辑卷LVM)的扩充
    CentOS6.7配置软raid5(模拟故障增加硬盘)
    运行软件显示:缺少packet.dll文件
    《需求工程——软件建模》06
    《需求工程——软件建模》05
  • 原文地址:https://www.cnblogs.com/yimuren/p/3927308.html
Copyright © 2011-2022 走看看