0%

gdb note

启动命令

  • gdb调试主要是c和c++,要使用gdb,在编译时要在加编译条件

    1
    2
    gcc -g hello.c -o hello 
    g++ -g hello.cpp -o hello
  • 启动gdb的几种方法

    1
    2
    3
    4
    5
    6
    7
    gdb program #program就是可执行文件,一般在当前目录下
    gdb program core #用gdb同时调试一个运行程序和core文件,core是程序非法执行后core dump后产生的文件
    gdb program 1234 #程序如果是服务程序,可以指定这个服务程序运行时的进程ID,gdb会自动attach上去,并调试他。gdb启动时候可以加一些gdb启动开关
    --symbols=SYSFILE #从指定文件中读取符号表
    --se=FILE #从指定文件中读取符号表信息,并把他用在可执行文件中
    --core=COREFILE #调试时core dump的core文件
    --directory=DIR #加入一个源文件的搜索路径,默认搜索路径是环境变量中PATH所定义的路径

基本命令

  • help查看所有gdb命令

    1
    2
    help 列出gdb命令种类
    help breakpoints 查看设置断点的所有命令
  • 查看源代码

    1
    2
    3
    4
    list(简写l) #查看源程序代码,默认显示10行,按回车继续查看剩余
    list行号 #将显示当前文件以“行号”为中心的前后10行代码
    list 函数名 #将显示“函数名所在函数的源代码”
    list #不带参数,将接着上一次list命令,输出下边的内容
  • 断点相关

    1
    2
    3
    4
    5
    6
    7
    8
    b 行号 #在某行设置断点
    info b #显示所有断点信息
    delete b #清除所有断点
    clear 行号n #清除第n行的断点
    b func #在函数入口处设置断点
    delete 断点号n #删除第n个断点
    disable 断点号n #暂停第n个断点
    enable 断点号n #开启第n个断点
  • 调试相关

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    r #运行程序
    n #单步执行,跳过函数,不进入函数
    s #单步执行程序,进入程序
    until #跳出循环
    until+行号 #运行至某行,不仅仅用来跳出循环
    finish #运行程序,直到当前函数完成返回,并打印函数返回时的堆栈地址和返回值及参数值等信息
    call func(arg) #call 函数(参数):调用程序中可见的函数,并传递参数 call gdb _myfunc(44)
    q #退出
    disassemble /r main #反汇编代码,/r选项表示显示原始的机器码
    x/[n][f][u] address#查看内存 n要显示的单位数量,f显示格式 xduotfaics u 单位大小 b(字节)h(2字节)w(4字节)g(8字节)
  • 打印表达式

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    p a #将显示整数a 的值
    p ++a #将把a中的值加1,并显示出来
    p name #将显示字符串name的值
    p test(22) #将以整数22作为参数调用test()函数
    p test(a) #将以变量a作为参数调用test()函数
    display 表达式 #使用display命令设置一个表达式后,将在每次单步进行指令后,接着会输出被设置的表达式及值
    watch 表达式 #设置一个监视点,一旦被监视的表达式的值改变,gdb将强行终止正在被调试的程序
    whatis #查询变量或函数
    info function #查询函数
    info locals #显示当前堆栈页的所有变量
  • 查看运行信息

    1
    2
    3
    4
    5
    6
    where/bt #当前运行的堆栈列表
    bt backtrace #显示当前调用堆栈
    up/down #改变堆栈显示的深度
    set args #指定运行时的参数
    show args #查看设置好的参数
    info program #来查看程序是否在运行,进程号,被暂停的原因
  • 分割窗口

    1
    2
    3
    4
    5
    6
    layout #用于分割窗口,可以一边查看代码,一边测试
    layout #显示源代码窗口
    layout asm #显示反汇编窗口
    layout regs #显示源代码/反汇编和CPU寄存器窗口
    layout split #显示源代码和反汇编窗口
    Ctrl+L #刷新窗口