博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
GDB调试笔记
阅读量:6224 次
发布时间:2019-06-21

本文共 7725 字,大约阅读时间需要 25 分钟。

参考资料:

# 调试实例

1 #include 
2 #include
3 using namespace std; 4 int f[100][100]; 5 int ax,ay; 6 int bx,by; 7 int dx[4]={
1,0,-1,0}; 8 int dy[4]={
0,1,0,-1}; 9 int _count=0;10 int _min=9999999;11 int n,m,k;12 13 void dfs(int d,int t,int curx,int cury)14 {15 if(t>_min)16 return ;17 if(curx<0 || cury<0 || cury>n-1 || curx>m-1)18 return ;19 if(f[cury][curx])20 return ;21 if(curx==by && cury==bx){22 if(t<_min){23 _count=0;24 _min=t;25 }26 else{27 _count++;28 }29 return ;30 }31 f[cury][curx]=true;32 if(d==-1){33 for(int i=0;i<4;i++){34 bool bt = f[cury+dy[i]][curx+dx[i]];35 if(!bt){36 dfs(i,t+1,curx+dx[i],cury+dy[i]);37 if( !(bx==cury+dy[i] && by==curx+dx[i] ))38 f[cury+dy[i]][curx+dx[i]]=false;39 }40 }41 }42 else{43 for(int i=0;i<4;i++){44 bool bt = f[cury+dy[i]][curx+dx[i]];45 int tt=d^2;46 if(tt==i) continue;47 if(!bt){48 dfs(i,t+1,curx+dx[i],cury+dy[i]);49 if( !(bx==cury+dy[i] && by==curx+dx[i] ))50 f[cury+dy[i]][curx+dx[i]]=false;51 }52 }53 }54 return ;55 }56 57 int main()58 {59 while(cin>>n>>m>>k){60 _count=0;61 _min=99999999;62 memset(f,0,sizeof(f));63 for(int i=1;i<=k;i++){64 int a,b;65 cin>>a>>b;66 f[a][b]=true;67 }68 cin>>ax>>ay;69 cin>>bx>>by;70 dfs(-1,0,ay,ax);71 cout<<_min<

  这是一道“”的代码,是道搜索题,要求输出矩阵内a到b的最短路的长度以及最短路的条数。这道题的第一遍代码写完之后,运行后发现堆栈溢出了程序没有输出直接结束。用codeblocks自带的调试debug了一会,发现不是很好用,遂转入下编译原程序启动gdb调试。顺便也复习了一下gdb的命令。

  下面是我以此程序为例,学习gdb的笔记:

Administrator@PC-201311180010 /cygdrive/d/bin/小鼠迷宫问题$ g++ -o xs -ggdb main.cpp
-- 编译原程序,并产生调试信息,便于之后进行gdb调试。
•$ g++ -o ex1 -g  ex1.cpp
利用操作系统的native format生成调试信息。GDB 可以直接利用这个信息,其它调试器也可以使用这个调试信息。
•$ g++ -o ex1 -ggdb  ex1.cpp
为 GDB 生成专用的更为丰富的调试信息,但是,此时就不能用其他的调试器来进行调试了 (如 ddx)
(引自L老师课件)

 

Administrator@PC-201311180010 /cygdrive/d/bin/小鼠迷宫问题$ gdb xs

-- 启动gdb调试原程序。

-- 启动之后会刷出以下内容:

Administrator@PC-201311180010 /cygdrive/d/bin/小鼠迷宫问题$ gdb xsGNU gdb (GDB) 7.6.50.20130728-cvs (cygwin-special)Copyright (C) 2013 Free Software Foundation, Inc.License GPLv3+: GNU GPL version 3 or later 
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 "i686-pc-cygwin".Type "show configuration" for configuration details.For bug reporting instructions, please see:
.Find the GDB manual and other documentation resources online at:
.For help, type "help".Type "apropos word" to search for commands related to "word"...Reading symbols from /cygdrive/d/bin/小鼠迷宫问题/xs...done.(gdb)

-- 最后一行(gdb)后面会有一个光标“_”在闪,表示可以输入命令。

 

(gdb) l46                      f[cury+dy[i]][curx+dx[i]]=false;47                  }48              }49          }50          return ;51      }5253      int main()54      {55          while(cin>>n>>m>>k){

-- list(可简写为 l):显示代码

 

(gdb) l 11       #include 
2 #include
3 using namespace std;4 int f[100][100];5 int ax,ay;6 int bx,by;7 int dx[4]={
1,0,-1,0};8 int dy[4]={
0,1,0,-1};9 int _count=0;10 int _min=9999999;

-- list 1:从第一行显示代码

 

(gdb) l11      int n,m,k;1213      void dfs(int d,int t,int curx,int cury)14      {15          if(curx<0 || cury<0 || cury>n-1 || curx>m-1)16              return ;17          if(f[cury][curx])18              return ;19          if(curx==by && cury==bx){20              if(t<_min){

-- 继续显示代码

 

=============== 插入一下 ================

这个时候我看命令行里代码有堆起来了,想清理一下,结果尝试性的输入命令“cls”和“clear”,发现这两个命令是行不通的。

(gdb) clsUndefined command: "cls".  Try "help".(gdb) clearNo source file specified.

好吧,既然不行,我们继续。

======================================

 

(gdb) b dfsBreakpoint 1 at 0x401186: file main.cpp, line 15.

-- breakpoint dfs:在函数dfs入口处设置断点

-- breakpoint 1 表示这是第一个断点

 

(gdb) rStarting program: /cygdrive/d/bin/小鼠迷宫问题/xs[New Thread 2144.0xdc0][New Thread 2144.0x155c]4 4 1 1 1 0 0 2 2Breakpoint 1, dfs (d=-1, t=0, curx=0, cury=0) at main.cpp:1515          if(curx<0 || cury<0 || cury>n-1 || curx>m-1)

-- run:运行程序。

-- run 命令运行之后,光标会停下来闪烁,表示在等待输入数据。输入数据之后会直接运行到第一个断点处停止,并显示相关信息。

 

(gdb) cContinuing.Breakpoint 1, dfs (d=0, t=1, curx=1, cury=0) at main.cpp:1515          if(curx<0 || cury<0 || cury>n-1 || curx>m-1)

-- continue:继续运行。

 

========== 小问题 ============

(gdb) b dfs if curx==3 && cury==3Note: breakpoint 1 also set at pc 0x401186.Breakpoint 2 at 0x401186: file main.cpp, line 15.(gdb) cContinuing.Breakpoint 1, dfs (d=0, t=1, curx=1, cury=0) at main.cpp:1515          if(curx<0 || cury<0 || cury>n-1 || curx>m-1)

第一条gdb命令设置一个条件断点为第二个断点,第二条gdb命令为继续运行,为何继续运行后不是跳到刚设置的第二个断点处呢?

===========================

 

(gdb) p curx$1 = 1

-- print:显示一个变量的值

 

========== 小例子 ==========

(gdb) p curx$1 = 1(gdb) p$2 = 1(gdb) p$3 = 1(gdb) p cury$4 = 0(gdb) p$5 = 0

连续输入p会持续显示上一次观察的变量的值。

==========================

 

====== 小问题:这时候连续输入“continue”会发生什么呢? =======

(gdb) cContinuing.Breakpoint 1, dfs (d=0, t=2, curx=2, cury=0) at main.cpp:1515          if(curx<0 || cury<0 || cury>n-1 || curx>m-1)(gdb) cContinuing.Breakpoint 1, dfs (d=0, t=3, curx=3, cury=0) at main.cpp:1515          if(curx<0 || cury<0 || cury>n-1 || curx>m-1)(gdb) cContinuing.Breakpoint 1, dfs (d=0, t=4, curx=4, cury=0) at main.cpp:1515          if(curx<0 || cury<0 || cury>n-1 || curx>m-1)(gdb) cContinuing.Breakpoint 1, dfs (d=1, t=4, curx=3, cury=1) at main.cpp:1515          if(curx<0 || cury<0 || cury>n-1 || curx>m-1)

会连续显示第一个断点处的变化。

===========================================

 

还有其它常用命令:

(gdb) s17          if(f[cury][curx])(gdb) s19          if(curx==by && cury==bx){(gdb) ss20             if(t<_min){(gdb) s21                  _count=0;(gdb) s22                  _min=t;(gdb) s27              return ;

-- step:单步执行,等效于step into(可进入函数)。

与之相对的

-- next(n):单步执行,等效于step over(只在当前函数中执行)。

-- finish(f):跳出当前函数,等效于step out。

 

(gdb) b dfs if curx==2 && cury==2Breakpoint 1 at 0x401186: file main.cpp, line 15.

-- b dfs if curx==2 && cury==2:设置条件断点,程序执行到符合条件处停止。

 

(gdb) watch iHardware watchpoint 2: i(gdb) s45                  if(!bt){(gdb) s41              for(int i=0;i<4;i++){(gdb) sHardware watchpoint 2: iOld value = 1New value = 20x00401443 in dfs (d=0, t=11, curx=1, cury=2) at main.cpp:41

-- watch:设置一个监测点(数据断点),被检测变量在程序中出现时,显示其变化。

 

(gdb) i bNum     Type           Disp Enb Address    What1       breakpoint     keep y   0x00401186 in dfs(int, int, int, int)                                           at main.cpp:15        stop only if curx==2 && cury==2        breakpoint already hit 1 time5       breakpoint     keep y   0x00401186 in dfs(int, int, int, int)                                           at main.cpp:146       breakpoint     keep y   0x004011bc in dfs(int, int, int, int)                                           at main.cpp:17

-- info breakpoint:显示当前所有断点信息。

 

(gdb) d b 1Ambiguous delete command "b 1": bookmark, breakpoints.(gdb) d breakpoint 1(gdb) i bNum     Type           Disp Enb Address    What5       breakpoint     keep y   0x00401186 in dfs(int, int, int, int)                                           at main.cpp:146       breakpoint     keep y   0x004011bc in dfs(int, int, int, int)                                           at main.cpp:17

-- delete breakpoint 断点号:删除指定断点

 

(gdb) dDelete all breakpoints? (y or n) y(gdb) i bNo breakpoints or watchpoints.

-- delete:删除当前所有断点

 

 

Freecode :

转载地址:http://xouna.baihongyu.com/

你可能感兴趣的文章
第十四章:监测和维护活动目录(一)(译自WindowsServer2008ActiveDirectoryResourceKit)
查看>>
Jackson序列化实例
查看>>
Flex入门
查看>>
docker常用的命令(持续更新)
查看>>
LoRa联盟主席:聚焦标准规范+产业生态,全球物联网事实标准初显
查看>>
继承性
查看>>
【ItemizedOverlay的ArrayIndexOutOfBoundsException/NullPointerException异常解决办法】
查看>>
ubuntu无法激活输入法,Zendstudio无法激活中文输入法问题
查看>>
linux下删除文件恢复方法
查看>>
Linux下如何识别IDER的软驱和光驱
查看>>
TreeView控件应用(包含递归调用)
查看>>
Android中文API(95)——SimpleExpandableListAdapter
查看>>
国内的机器视觉技术行业发展趋势分析
查看>>
Oracle中的nvl函数
查看>>
云场景实践研究第86期:美甲帮
查看>>
使用Windows远程桌面(mstsc)通过RDP协议访问Ubuntu/Debian服务器
查看>>
LeetCode - 4. Median of Two Sorted Arrays
查看>>
浅谈活动目录域名称空间设计
查看>>
如何写好一封邮件
查看>>
CUDA学习(十八)
查看>>