gdb初探

写在前头
       linux下编码调试,gdb是授权工具,很多系统都内置gdb工具,如果没有,自己装一个也不是什么难事。一直以为命令行下实现诸如vs里面的单步调试,打印变量,查看堆栈等等是何其麻烦的事,所以通常都是在Windows下编码调试ok了,再移到linux下编译。最近比较闲,正好手上有个小工程在linux已经编码完成,又不想再移到window搞一把,遂来研究一下gdb调试的问题;粗略的学了下入门级的教程,发现利用gdb调试实现前述的那些基本调试技巧,也是十分方便的。下面记录下gdb基本且常用的功能。

例程

1
/* name: mian.cpp
2
*/
3
4
#include <iostream>
5
#include "func.h"
6
using namespace std;
7
8
int main()
9
{
10
    int a = 0;
11
    int b = 0;
12
    while(true)
13
    {
14
        cin >>a>>b;
15
        cin.clear();
16
        cin.sync();
17
        cin.ignore(INT_MAX, '\n');
18
        int c = test_add(a, b);
19
       cout<<c<<endl;
20
        if(c==666)
21
        {
22
            break;
23
        }
24
    }
25
    return 0;
26
}
1
/*
2
    name: func.h
3
*/
4
#ifndef _FUNC_H_
5
#define _FUNC_H_
6
#endif
7
#include <iostream>
8
int test_add(int a, int b)
9
{
10
    std::cout<<"a+b"<<a<<"+"<<b<<endl;
11
    return a+b;
12
}
13
14
上述程序包含两个文件main.cpp, func.h,主要是为了跨文件调试。
gbb调试
编译:要先启用gdb调试,需要在编译的时候添加相应的编译选项 "-g"(还有个宏开关“-DDEBUG” 不知道要不要带上),将调试信息编译到目标文件;所以编译上述文件 "g++ -g main.cpp  func.h  -o test_gdb",生成带调试信息的可执行文件"test_gdb"。
启动调试: gdb test_gdb, 会打印一堆东西
输入命令: l   -->改命令列出代码,一般没啥用;
 
设置断点:目前发现gdb可以根据行号和函数名设置断点,设置两个断点,第10行和test_add处设置,即输入 break 10,break test_add

  启动执行: 输入r ,即run命令,执行程序,程序会停在第一个断点出

  逐行执行:输入 n ,即next,逐行执行代码

 跳到下一个断点处: 输入c,即contiune,程序执行到下一个断点处停下

 单步调试:怀疑test_add函数用问题,输入step进入函数,也就实现了跨文件调试的功能

  查看变量:输入 p param, print 参数值

 退出调试: 输入quit

 至此,基本的调试就完成了。
附加功能
条件断点:设置条件断点,有时候程序在循环内部崩溃,比如循环执行到101次时挂了,单步执行要100次"n"命令,此时可以在循环处设置条件断点;例如:
1
/*xxx
*/
2

for(int i=0;i<1000;i++)
3
{
4
    do_something();
5
}
可想在xxx处设置断点,调试进入该文件或函数,然后设置条件:break if i==100,之后输入命令"c",循环执行100后停下。
程序崩溃查看调用堆栈调试时可以不设置断点,运行程序,崩溃后输入"bt ",即可看到程序调用堆栈信息,就可以很容易知道挂在哪个函数,后面直接进入该函数进行调试。
总结
暂时只了解到这些功能,后续新get到会持续更新。in a word,gdb is simple.
 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值