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
编译生成执行文件:(g++参考)
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/17033711.html