GDB 01、GDB入门(超详细的),包含演示代码,快速入门

01、程序

#include<iostream>
#include<vector>
#include<string>
using namespace std;

void printVector(vector<string>& v){
    cout<<"size = "<<v.size()<<endl;
    cout<<"print begin..."<<endl;
    for (int i = 0; i < v.size(); i++){
        cout<<v[i]<<" ";
    }
    cout<<endl<<"print end..."<<endl;
    cout<<endl;
}

int main(){

    vector<string> v(10, "mhzzj");

	//修改指定下标的数据
	v[6] = "MHZZJ";

	//删除尾部数据(v[n-1])
	v.pop_back();

	//添加数据到尾部(v[n-1])
	v.push_back("zzjmhz");

	printVector(v);

	//删除下标为v[0]的数据,头部
	v.erase(v.begin());
	//边迭代边删除
	vector<string>::iterator it = v.begin();
	while (it != v.end()) {
		if (*it == "zzjmhz") it = v.erase(it);
		else it++;
	}
	printVector(v);
    cout<<"++++++++++++++++++++endl+++++++++++++++++++++++"<<endl;
}

02、GDB调试

生成调试程序

mhzzj@mhzzj-virtual-machine:~/codes/C++$ g++ gdbdemo.cpp -o demo -g

如果是c语言可以使用gcc gdbdemo.cpp -o demo -g

进入gdb调试

gdb demo

mhzzj@mhzzj-virtual-machine:~/codes/C++$ gdb demo
GNU gdb (Ubuntu 7.11.1-0ubuntu1~16.5) 7.11.1
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from demo...done.

显示源码

list:现实源码,可以简写为:l

(gdb) l
2	#include<vector>
3	#include<string>
4	using namespace std;
5	
6	void printVector(vector<string>& v){
7	    cout<<"size = "<<v.size()<<endl;
8	    cout<<"print begin..."<<endl;
9	    for (int i = 0; i < v.size(); i++){
10	        cout<<v[i]<<" ";
11	    }
(gdb) 

如果想查看第n行前后的代码,可以使用l n命令

设置断点

break设置断点,可以简写为:b

(gdb) b 29 #在第29行设置断点
Breakpoint 1 at 0x4011e5: file gdbdemo.cpp, line 29.
(gdb) b printVector
Breakpoint 2 at 0x401003: file gdbdemo.cpp, line 7.

查看断点

info b

(gdb) info b
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x00000000004011e5 in main() at gdbdemo.cpp:29
2       breakpoint     keep y   0x0000000000401003 in printVector(std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >&) at gdbdemo.cpp:7

删除断点

d 序号

(gdb) d 2 #删除第2个断点
(gdb) info b
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x00000000004011e5 in main() at gdbdemo.cpp:29

启动程序

启动程序run,可以简写为:r

(gdb) r
Starting program: /home/mhzzj/codes/C++/demo 

Breakpoint 1, main () at gdbdemo.cpp:29
29		printVector(v);

使用run命令可以直接运行到断点的位置,如果想从mian函数开始执行,可以使用start指令

查看变量

查看变量指令为print,可以简写为p

Breakpoint 1, main () at gdbdemo.cpp:29
29		printVector(v);
(gdb) p v
$1 = std::vector of length 10, capacity 10 = {"mhzzj", "mhzzj", "mhzzj", "mhzzj", "mhzzj", "mhzzj", "MHZZJ", "mhzzj", "mhzzj", "zzjmhz"}

监控某个变量

display 变量名

(gdb) display v
1: v = std::vector of length 8, capacity 10 = {"mhzzj", "mhzzj", "mhzzj", "mhzzj", "mhzzj", "MHZZJ", "mhzzj", "mhzzj"}
(gdb) n
size = 8
8	    cout<<"print begin..."<<endl;
1: v = std::vector of length 8, capacity 10 = {"mhzzj", "mhzzj", "mhzzj", "mhzzj", "mhzzj", "MHZZJ", "mhzzj", "mhzzj"}
(gdb) 

可以使用undispla命令取消监控

执行下一行

执行下一行next,可简写为:n

Breakpoint 1, main () at gdbdemo.cpp:29
29		printVector(v);
(gdb) display v
1: v = std::vector of length 10, capacity 10 = {"mhzzj", "mhzzj", "mhzzj", "mhzzj", "mhzzj", "mhzzj", "MHZZJ", "mhzzj", "mhzzj", "zzjmhz"}
(gdb) n
size = 10
print begin...
mhzzj mhzzj mhzzj mhzzj mhzzj mhzzj MHZZJ mhzzj mhzzj zzjmhz 
print end...

32		v.erase(v.begin());
1: v = std::vector of length 10, capacity 10 = {"mhzzj", "mhzzj", "mhzzj", "mhzzj", "mhzzj", "mhzzj", "MHZZJ", "mhzzj", "mhzzj", "zzjmhz"}
(gdb) n
34		vector<string>::iterator it = v.begin();
1: v = std::vector of length 9, capacity 10 = {"mhzzj", "mhzzj", "mhzzj", "mhzzj", "mhzzj", "MHZZJ", "mhzzj", "mhzzj", "zzjmhz"}
(gdb) 

执行到下一个断点

continue 继续运行程序,停在下一个断点的位置,可简写为:c

(gdb) b 39 #在第39行设置断点
Breakpoint 3 at 0x40128f: file gdbdemo.cpp, line 39.
(gdb) c #执行到下一个断点
Continuing.

Breakpoint 3, main () at gdbdemo.cpp:39
39		printVector(v);

进入函数内部

如果执行到某个函数,想进入函数内部,可以使用step指令,简写为s

如果在改行为函数调用,则进入函数内部,否则为执行下一行,效果如图n指令

Breakpoint 3, main () at gdbdemo.cpp:39
39		printVector(v);

(gdb) s
printVector (v=std::vector of length 8, capacity 10 = {...}) at gdbdemo.cpp:7
7	    cout<<"size = "<<v.size()<<endl;

查看栈帧

bt

(gdb) bt
#0  printVector (v=std::vector of length 8, capacity 10 = {...}) at gdbdemo.cpp:7
#1  0x000000000040129b in main () at gdbdemo.cpp:39

切换栈帧

frame 序号

(gdb) frame 1
#1  0x000000000040129b in main () at gdbdemo.cpp:39
39		printVector(v);
(gdb) 

退出进入的函数

退出进入的函数:finish

(gdb) frame 1
#1  0x000000000040129b in main () at gdbdemo.cpp:39
39		printVector(v);
(gdb) frame 0
#0  printVector (v=std::vector of length 8, capacity 10 = {...}) at gdbdemo.cpp:7
7	    cout<<"size = "<<v.size()<<endl;
(gdb) finish
Run till exit from #0  printVector (v=std::vector of length 8, capacity 10 = {...}) at gdbdemo.cpp:7
size = 8
print begin...
mhzzj mhzzj mhzzj mhzzj mhzzj MHZZJ mhzzj mhzzj 
print end...

main () at gdbdemo.cpp:40
40	    cout<<"++++++++++++++++++++endl+++++++++++++++++++++++"<<endl;
1: v = std::vector of length 8, capacity 10 = {"mhzzj", "mhzzj", "mhzzj", "mhzzj", "mhzzj", "MHZZJ", "mhzzj", "mhzzj"}

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我将为你讲解如何利用 gdb 调试代码。 首先,需要确保你的代码已经被编译成可执行文件,并且在编译时加上了调试信息,例如: ```bash gcc -g -o myprogram myprogram.c ``` 这里的 `-g` 参数表示加入调试信息,`myprogram.c` 是你的源代码文件,`myprogram` 是生成的可执行文件。 接下来,启动 gdb 调试器,将可执行文件作为参数传入,例如: ```bash gdb myprogram ``` 这时,你将看到 gdb 的命令行提示符,输入 `run` 命令运行可执行文件,例如: ```bash (gdb) run ``` 如果程序在某处崩溃, gdb 会显示崩溃的位置和原因,例如: ```bash Program received signal SIGSEGV, Segmentation fault. 0x00000000004004d2 in main () at myprogram.c:6 6 *p = 0; ``` 这表示程序在第 6 行处出现了段错误。 你可以使用 `backtrace` 命令查看函数的调用堆栈,例如: ```bash (gdb) backtrace #0 0x00000000004004d2 in main () at myprogram.c:6 ``` 这表示 `main` 函数是导致程序崩溃的原因。 你可以使用 `print` 命令查看变量的值,例如: ```bash (gdb) print p $1 = (int *) 0x0 ``` 这表示指针变量 `p` 的值是 `0x0`,即空指针。 你可以使用 `break` 命令设置断点,例如: ```bash (gdb) break myprogram.c:8 ``` 这表示在第 8 行处设置一个断点。 你可以使用 `next` 命令执行下一行代码,例如: ```bash (gdb) next ``` 这将执行下一行代码,并在命令行中显示该行代码。 你可以使用 `step` 命令进入函数内部,例如: ```bash (gdb) step ``` 这将进入当前行所调用的函数内部执行。 你可以使用 `watch` 命令监视变量的值,例如: ```bash (gdb) watch p ``` 这将在变量 `p` 的值发生改变时自动暂停程序执行。 最后,使用 `quit` 命令退出 gdb 调试器,例如: ```bash (gdb) quit ``` 这里只是介绍了一些常用的 gdb 命令,还有很多其他的命令可以帮助你调试代码。在使用 gdb 调试代码时,需要对程序的控制流程和变量修改情况进行仔细的观察和分析,以便找到程序的问题所在。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值