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 : 删除指定位置处的所有断点
标签:break,int,t3st,gdbpwndbg,gdb,常用命令,cpp,断点
From: https://www.cnblogs.com/pengui-n3321/p/17033754.html