zoukankan      html  css  js  c++  java
  • 使用GDB调试程序

    常用命令

    命令 描述
    start 开始执行程序,并停在main函数的第一条语句处
    run(r) arg  使用arg参数运行程序
    finish 继续运行到当前函数返回为止
    quit(q) 退出gdb调试环境
    list(l) 列出源代码,接着上次的位置,每次列10行
    list 行号   列出从第几行开始的源代码  
    list 函数名 列出某个函数的源代码    
    print(p) var 打印变量的值
    set var 修改变量的值
    break(b) 行号或函数名 设置断点
    step(s) 执行下一行语句,如果有函数则进入到函数中
    next(n) 执行下一行语句
    continue(c) 继续运行
    回车 重复执行上一次的命令

    启动GDB

    在使用gdb调试的可执行文件在编译时需要加-g选项,否则将看不见程序的函数名、变量名。

    1. gdb <program>  调试当前目录下的program程序

    2. gdb <program> core  用gdb同时调试一个运行程序和core文件,core是程序非法执行后core dump后产生的文件。

    3. gdb <program> <PID> 如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程ID。gdb会自动attach上去,并调试他。program应该在PATH环境变量中搜索得到。

    一个例子

    源代码

    #include <stdio.h>
    
    int add_range(int low,int high)
    {
        int i,sum;
        for(i=low;i<=high;++i)
            sum+=i;
        return sum;
    }  
    
    int main(void)
    {
        printf("1+2+3+...+10=%d
    ",add_range(1,10));
        return 0;
    }

    使用gcc编译程序

    gcc -g test.c -o test

    运行程序,可以得到下面的结果

    使用gdb调试程序

    gdb test

    使用start运行程序,程序将执行到printf语句

    使用step(s)执行下一步,将进入add_range函数。接着执行print(p) sum打印sum的值,可见程序出错是因为sum没有被初始化。

    使用set var修改sum的值,键入finish命令继续执行,可见该函数已经返回正确的值了。

  • 相关阅读:
    NTP时间同步
    《暗时间》
    寻找字典公共键
    maven pom.xml的execution报错
    maven安装scala插件
    html 和xml
    sparkstreaming+kafka
    zookeeper错误Error contacting service. It is probably not running.
    eclipse开发hive2程序
    eclipse开发hbase程序
  • 原文地址:https://www.cnblogs.com/runnyu/p/4947143.html
Copyright © 2011-2022 走看看