GDB 基本用法

1、带着调试选项编译、构建调试对象

    在原来的的选项上再加上 -g 选项,如 gcc -g -Wall -O2 -o test test.c 或者 gcc -g -o test test.c。有一点需要注意的是调试时最好去掉优化选项,比如内联(inline)函数优化(去掉函数调用,而将函数代码在调用的位置展开),该函数名上就无法设置断点。这是因为内联函数优化从目标文件中去掉了该函数的入口点,符号表中也没有该函数的名称。优化还会将局部变量保存到寄存器中,因此无法显示该局部变量的内容,必须直接查看寄存器的值。当然,如果程序确实需要优化那么还是应该直接调试带有优化选项的可执行文件版本,因为只管理优化了的版本的可执行文件比管理优化的+没有优化的两个版本的可执行文件更加简单。

2、启动调试

    2、1    gdb 可执行文件名。 如,gdb test 或 gdb test.exe
    2、2    先键入 gdb 然后 file test 或 file test.exe

3、调试

3、1断点

3、1、1设置断点

    设置断点命令为 break ,可以简写为  b  。格式:
       break 函数名,如 break main
       break 行号,如 break 100
       break 文件名:行号,如 break test.c:100
       break 文件名:函数名,如 break test.c:tet
       break +偏移量 如 break +100
       break -偏移量 如 break -100
       break *地址 如 break *0x08116fd6
       break (即不指定断点位置),在下一行代码上设置断点,如 break

3、1、2查看断点信息

    info break

3、1、3删除断点

    delete 3//删除第三个断点
    clear //清楚所有断点

3、2运行

    没有参数时: run
    有参数时: run 参数,如 run hello 。注意,此时参数从 argv[1] 开始,因为在运行 gdb test 或 file test时就传入了第一个参数argv[0]。

3、3显示栈

    backtrace命令可以在遇到断点而暂停执行时显示栈帧,可简写为bt。此外backtrace的别名还有where和info stack。

3、3、1显示所有栈帧

    backtrace

3、3、2只显示开头 N 个栈帧

    backtrace N,如 backtrace 3 只显示前3个栈帧

3、3、3只显示最后 N 个栈帧

    backtrace -N,如backtrace -3 只显示最后3个栈帧

3、3、4同时显示栈帧及其局部变量

    backtrace full//显示所有栈帧及其局部变量
    backtrace full N//显示前 N 个栈帧及其局部变量
    backtrace full -N//显示最后 N 栈帧及其局部变量

3、4显示变量

    print命令可以显示变量,同时可以简写为 p 。用法如下:
        p argv
        p *argv
        p argv[0]
        p argv[1]

3、5显示寄存器

3、5、1显示所用寄存器

    info reg

3、5、2显示单个寄存器

    p $eax//即在寄存器名前面加上$即可

3、6显示内存

    用 x 命令可以显示内存中内容。其一般格式为:
            x/nfu addr。
    nfu是可选的,如果采用默认的nfu就可以不需要加斜线“\”
            n,重复的次数
    重复数是十进制整数,默认为1。他确定显示多少单元内存(单元由 u 确定)
            f,显示格式
   显示格式是被print命令使用众多格式之一('x','d','u','o','t','a','c','f','s')另外还有'i'(机器指令)。最初默认的是'x'(16进制)。在你每次使用 x 或者 print 命令之后默认值都会随之发生改变。
            u,单位大小
单位大小可以是一下任何之一:
   bBytes
   hHalfwords(two bytes)
   wWords(four bytes).最初的默认值。
   gGiant words(eight bytes)
对于格式 'i' ,单位大小是被忽视了的而且通常不写。
            addr,开始显示的地址
    addr是你想GDB显示内存内容的开始地址。该表达式没必要必须是一个指针值(虽然他可能是);他始终被表述为一个字节内存的整型地址。
    例如'x/3uh 0x54320'命令表示显示从地址0x54320开始的以无符号十进制数的3个半字的内容。

3、7反汇编

    反汇编命令为disassemble,简写为disas。
       disassemble。---- 反汇编当前整个函数。
       disassemble 程序计数器。--- 反汇编以程序计数器值为地址所在的函数。
       disassemble 开始地址 结束地址。--- 反汇编从开始地址到结束地址之前的部分。执行时可能想执行到函数内部,此时可以使用 (step 简写为 p)命令。

3、8单步执行

    单步执行的意思是根据源代码一行一行的执行。执行源代码中一行的命令为 next (简写为n)

3、9 继续执行

    调试时,可以使用continue(简写为 c )命令继续运行程序。程序在遇到断点后再次暂停运行。如果没有断点就会一直运行到就会一直运行到结束。格式:
    continue
    continue 次数 //忽略断点的次数

3、10 监视点

    大型软件或者大量使用指针的程序中,很难弄清楚变量在什么地方被改变。想要找到变量在何处被改变,可以使用watch命令(监视点,watchpoint)。
   wath <表达式>。<表达式>发生变化时暂停运行。此处<表达式>的意思是常量或者变量。
   awatch <表达式>。<表达式>被访问、改变时暂停运行。
   rwatch <表达式>。<表达式>被访问是暂停运行。

3、11 改变变量的值

格式:
    set variable <变量>=<表达式>。例如,set variable i = 0 。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值