gdb的使用教程以及gdb/pwndbg 常用命令

gdb的使用教程以及gdb/pwndbg 常用命令

1、基本使用(参考

#include <iostream>
using namespace std;
 
int func(int n){
	int sum=0;
	for(int i=0; i<n; i++){
		sum+=i;
	}
	return sum;
}
 
int main(){
	long sum2 = 0;
	for(int i=1; i<=100; i++){
		sum2 += i;
	}
	cout<<"1加到100 = "<<sum2<<endl;
	cout<<"1加到300 = "<<func(300)<<endl;
}

c++文件命名是t3st.cpp

编译生成执行文件:(gcc参考

g++ -g t3st.cpp -o t3st

使用GDB调试:

gdb t3st

GDB调试命令:

(gdb) l <-------------------- l命令相当于list,从第一行开始例出原码。

1	#include <iostream>
2	using namespace std;
3	 
4	int func(int n){
5		int sum=0;
6		for(int i=0; i<n; i++){
7			sum+=i;
8		}
9		return sum;
10	}

(gdb) <-------------------- 直接回车表示,重复上一次命令。

11	 
12	int main(){
13		long sum2 = 0;
14		for(int i=1; i<=100; i++){
15			sum2 += i;
16		}
17		cout<<"1加到100 = "<<sum2<<endl;
18		cout<<"1加到300 = "<<func(300)<<endl;
19	}

(gdb) break 16 <---------------------------- 在16行出设置断点

Breakpoint 1 at 0x9b5: file t3st.cpp, line 16.

(gdb) break func <-------------------- 设置断点,在函数func()入口处。

Breakpoint 2 at 0x961: file t3st.cpp, line 5.

(gdb) info break <-------------------- 查看断点信息。

Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x00000000000009b5 in main() at t3st.cpp:16
2       breakpoint     keep y   0x0000000000000961 in func(int) at t3st.cpp:5

(gdb) r <--------------------- 运行程序,run命令简写

Starting program: /home/linux/Desktop/test1/t3st 

Breakpoint 1, main () at t3st.cpp:17
17		cout<<"1加到100 = "<<sum2<<endl;

(gdb) n <--------------------- 单条语句执行,next命令简写。

1加到100 = 5050
18		cout<<"1加到300 = "<<func(300)<<endl;

(gdb) c <--------------------- 继续运行程序,continue命令简写。

Continuing.

Breakpoint 2, func (n=300) at t3st.cpp:5
5		int sum=0;

(gdb) n <--------------------- 单条语句执行,next命令简写。

(gdb) n
6		for(int i=0; i<n; i++){
(gdb) n
7			sum+=i;
(gdb) n
6		for(int i=0; i<n; i++){
(gdb) n
7			sum+=i;
(gdb) n
6		for(int i=0; i<n; i++){
(gdb) n
7			sum+=i;

(gdb) p i <--------------------- 打印变量i的值,print命令简写。

$1 = 2

(gdb) p sum

$2 = 1

(gdb) bt <--------------------- 查看函数堆栈。

#0  func (n=300) at t3st.cpp:7
#1  0x0000555555554a0f in main () at t3st.cpp:18

(gdb) finish <--------------------- 退出函数。

Run till exit from #0  func (n=300) at t3st.cpp:7
0x0000555555554a0f in main () at t3st.cpp:18
18		cout<<"1加到300 = "<<func(300)<<endl;
Value returned is $3 = 44850

(gdb) c <--------------------- 继续运行。

1加到300 = 44850
[Inferior 1 (process 3398) exited normally]

(gdb) q <--------------------- 退出gdb。

2、gdb/pwndbg 常用命令简单整理

1、基本指令

help : 帮助

info(简写i) : 查看一些信息,只输入info可以看可以接什么参数,下面几个比较常用
	i b : 常用,info break 查看所有断点信息(编号、断点位置)
	i r : 常用,info registers 查看各个寄存器当前的值
	i f : info function 查看所有函数名,需保留符号
	
show : 和info类似,但是查看调试器的基本信息,如:
	show args : 查看参数

backtrace : 查看调用栈

quit(简写q): 退出,常用

2、执行指令

run : 简记为 r ,其作用是运行程序,当遇到断点后,程序会在断点处停止运行,等待用户输入下一步的命令

continue (简写c ): 继续执行,到下一个断点处(或运行结束)

next(简写 n): 单步跟踪程序,当遇到函数调用时,也不进入此函数体;此命令同 step 的主要区别是,		step 遇到用户自定义的函数,将步进到函数中去运行,而 next 则直接调用函数,不会进入到函数体		内。

step (简写s): 单步调试如果有函数调用,则进入函数;与命令n不同,n是不进入调用的函数的

finish : 运行程序,直到当前函数完成返回,并打印函数返回时的堆栈地址和返回值及参数值等信息。

quit : 简记为 q ,退出gdb

3、断点指令break(缩写b)

break n (简写b n):在第n行处设置断点

break +offset : 在当前行号的后面offset行停住

break -offset : 在当前行号的前面offset行停住

break func : 在函数func()的入口处设置断点

break file_name : 15 : 给file_name的15行下断点

break file_name:func : 在file_name文件的func函数打断点

break ... if cond : 设置条件断点,... 参数用于指定生成断点的具体位置;cond 参数用于代指某个表达式。

delete n : 删除第n个断点(如果不指定 n 参数,则 delete 命令会删除当前程序中存在的所有断点。)

disable n : 暂停第n个断点

enable n : 开启第n个断点

clear n : 删除指定位置处的所有断点

可以看下这篇文章

原文链接: https://www.cnblogs.com/pengui-n3321/p/17033754.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    gdb的使用教程以及gdb/pwndbg 常用命令

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/310229

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月16日 上午11:26
下一篇 2023年2月16日 上午11:26

相关推荐