博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
gdb调试整理
阅读量:5142 次
发布时间:2019-06-13

本文共 1908 字,大约阅读时间需要 6 分钟。

调试环境: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,编译一下

 

转载于:https://www.cnblogs.com/yimuren/p/3927308.html

你可能感兴趣的文章
【luogu4185】 [USACO18JAN]MooTube [并查集]
查看>>
手机号脱敏处理
查看>>
CI控制器调用内部方法并载入相应模板的做法
查看>>
Hdu - 1002 - A + B Problem II
查看>>
HDU - 2609 - How many
查看>>
每天CookBook之Python-003
查看>>
每天CookBook之Python-004
查看>>
Android设置Gmail邮箱
查看>>
StringBuffer的用法
查看>>
js编写时间选择框
查看>>
PHP压缩文件操作
查看>>
Java数据结构和算法(四)--链表
查看>>
JIRA
查看>>
小技巧——直接在目录中输入cmd然后就打开cmd命令窗口
查看>>
深浅拷贝(十四)
查看>>
由级别和性格特征将程序员分类 ---看看你属于哪一种
查看>>
HDU 6370(并查集)
查看>>
BZOJ 1207(dp)
查看>>
PE知识复习之PE的导入表
查看>>
HDU 2076 夹角有多大(题目已修改,注意读题)
查看>>