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

    基本流程

    gcc -g file.c -o prog

    gdb prog

    (gdb) break function_name

    (gdb) run

    基本常用命令

    help

    后面跟命令名称可以查看相关命令的用法

    list

    1. 直接list可以列出当前所在附近的代码,连续的list会顺着上次结束的地方继续列出代码

    2. list function_name可以列出该函数附近的代码

    info

    info break:查看当前设置的断点情况

    info locals:查看当前函数内局部变量的情况

    info args:查看当前函数的参数情况

    print

    print variable:打印该变量的值

    print *ptr:打印该指针指向的结构的值

    print /FMT variable:在输出时指定数值格式,比如print /t var就是以二进制显示数值

      o(octal), x(hex), d(decimal), u(unsigned decimal),

      t(binary), f(float), a(address), i(instruction), c(char), s(string)

      z(hex, zero padded on the left)

    set

    set varibale=value:修改变量的值

    break

    break function_name:在函数入口处设置断点

    break filename:lineno:在指定文件的第几行设置断点

    delete

    delete bk1 [bk2 bk3....]:删除指定的断点,可以用info break查看断点编号然后在这里选择删除

    delete:不跟参数则可以选择删除所有的断点

    continue

    继续执行直到下一个断点

    next

    下一步,会执行整个函数,把函数当成一条语句

    step

    下一步,会进入函数内部

    where:

    有时候命令执行太多不知道当前在哪一行了,可以输入where

    进阶命令

    程序命令行参数

    可以在run后面指定

    变量

    在gdb中可以使用$varname = val的形式来定义变量,在一些语句执行后,也回显示类似$2=val,这些变量表示表达式的值,也是直接可以用的。然后这些变量可以用在如set、print这些命令中,它们可以参与运算。

    外部脚本

    source:载入gdb脚本,有些命令重复命令可以放进一个脚本然后需要执行是用source命令在当前环境里执行,和shell的source很像。

    条件断点

    break probename if condition:在条件满足下才中断程序可以和前面指定线程的形式合起来用

    退出循环和函数

    until:快速执行完当前循环

    finish:跳出当前函数

    忽略断点

    continue #num:表示继续执行并忽略几次断点

    格式化输出:

    printf:用法与C语言版本的一致,只不过在这里调用不需要括号

    结构体打印:

    set print pretty:默认情况下结构体用print输出时会挤在一起,可以使用这个设置让其按层次缩进显示。

    函数调用:

    call function_name:可以手工调用某个函数,但是不要再函数里面再打断点了

    watch:

    watch variable:跟断点有些类似,在变量发生变化时中断程序

    无敌的x命令:

    x /FMT addr:

        /FMT和上面print类似,但是x命令里可以指定其输出的连续内存位置上的个数。

        如/4w 显示从addr开始的连续4个word的值,/4i则表示下面的连续四条指令

     自定义函数:

    define printRange

        set $start=$arg0

        set $end=$arg1

        while $start < $end

            print $start

            set $start=$start+1

        end

    end

    printRanage 1 100

    多线程环境调试

    查看线程:

    info threads:查看当前程序产生的线程,每个线程有个pid和gdb内部的表示id,在命令中要使用后者。

    切换线程:

    thread #internal_thread_id

    设置断点:

    break function_name thread #internal_thread_id:只有在该线程在指定的地方才设断点

    锁定线程:

    set scheduler-locking on

    高端功能 

    layout:可以打开字符模拟的窗口,实现命令和代码同时显示,有好几个layout

    winheight:可以调整layout中不同窗口的高度,src(源码),cmd(命令,就是普通的命令行),regs(寄存器)

    fs:切换当前窗口的焦点,一般把它切换到命令窗口中,即fs cmd,这样上下箭头键可以用来翻用过的命令

  • 相关阅读:
    CSS3中的结构伪元素选择器和伪类选择器的使用
    ul li居中
    vue 点击按钮,边框变色
    vue 实现简单的遮罩层
    Vue 控制鼠标移入移出事件文字的隐藏和显示
    vue 文字点击变色
    vue v-for的用法
    使用CSS修改radio样式
    vue 点击显示隐藏,鼠标移动上去显示隐藏
    sql序列(3)基本语法
  • 原文地址:https://www.cnblogs.com/lailailai/p/4515364.html
Copyright © 2011-2022 走看看