Linux下使用gdb调试

  • 在Ubuntu下,直接用命令:apt-get install build-essential 即可安装gdb。build-essential包含gcc和gdb等工具,是C语言的开发包
  • GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。所谓“寸有所长,尺有所短”就是这个道理。

一. 常用命令

  • 在编译时要加上-g选项,生成的可执行文件才能用gdb进行源码级调试。如果没有-g,你将看不见程序的函数名、变量名,所代替的全是运行时的内存地址。当你用-g把调试信息加入之后,并成功编译目标代码以后,让我们来看看如何用gdb来调试他。
  • 一般来说,GDB主要帮忙你完成下面四个方面的功能:
    ①启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
    ②可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)
    ③当程序被停住时,可以检查此时你的程序中所发生的事。
    ④动态的改变你程序的执行环境。
  • 常用命令:
    backtrace(或bt)    查看各级函数调用及参数
    finish    连续运行到当前函数返回为止,然后停下来等待命令
    frame(或f) 帧编号    选择栈帧
    info(或i) locals    查看当前栈帧局部变量的值
    list(或l)    列出源代码,接着上次的位置往下列,每次列10行
    list 行号    列出从第几行开始的源代码
    list 函数名    列出某个函数的源代码
    next(或n)    执行下一行语句
    print(或p)    打印表达式的值,通过表达式可以修改变量的值或者调用函数
    quit(或q)    退出gdb调试环境
    set var    修改变量的值
    start    开始执行程序,停在main函数第一行语句前面等待命令
    step(或s)    执行下一行语句,如果有函数调用则进入到函数中

二. 使用例子

#include<iostream>
#include<string>
#include<sstream>
#include<algorithm>
using namespace std;

//输入一个10进制数的字符串,还有n进制数字。要求输出相应n进制的字符串

string n_trans(string in,unsigned int n) {
	int input = atoi(in.c_str());
	string ret,tmp;
	stringstream ss;
	int temp;
	while (input != 0) {
		temp = input % n;
		if (temp >= 10) {
            //16进制的字母转换
			switch (temp)
			{
			case 10:
				tmp = "A";
				break;
			case 11:
				tmp = "B";
				break;
			case 12:
				tmp = "C";
				break;
			case 13:
				tmp = "D";
				break;
			case 14:
				tmp = "E";
				break;
			case 15:
				tmp = "F";
				break;
			default:
				break;
			}
			ret += tmp;
			tmp = "";
		}
		else {
            //int转为string
			ss << temp;
			ss >> tmp;
			ret += tmp;
			tmp = "";
			ss.clear();
		}
		
		input = input / n;
	}
	reverse(ret.begin(), ret.end());
	return ret;
}

int main() {
	string in;
	unsigned int n;
	while (cin >> in >> n) {
		if (n > 16)
			cout << "Error:最多只能转换16进制" << endl;
		else
			cout << n_trans(in, n) << endl;
	}
	getchar();
	return 0;
}
  • 编译和进入 gdb调试
    g++ -g test.cpp -o test
    gdb test

1. 简单调试

  • 用命令:list 1 。从第一行开始列起,每次10行

  • 之后每次输入list 或 按下回车键(重复上一个命令,这里是list) 可以再列出后面10行
  • list可以简写为l,如果后面跟上函数名字,可以跳到有函数名的部分。如果跟上行号,跳到改行。

  • 输入quit 可以退出gdb
  • 再次进入gdb,先用start,停在main函数的第一条语句等待我们

  • 输入next(或n),单条语句运行

  • 通过break 行数,可以设置断点,然后run(或者缩写r)运行到该行

  • 遇到输入,会让你输入后才继续

  • step <count> :单步跟踪,如果有函数调用,它会进入该函数,而next不会。count 表示执行后面 count 条语句,不加则默认为 1。

  • i locals可以显示当前位置的局部变量值

  • 使用finish可以从一个函数中,在该位置一直运行到跳出函数为止

2. 进阶

  • 有时候找到bug所在,但不想退出重新编译,可以通过set var去改变变量,看看改到正确之后,是否还有其他错误。

参考文章:

Linux学习--gdb调试

gdb 跟踪调试命令整理

猜你喜欢

转载自blog.csdn.net/weixin_39731083/article/details/82227141