之前说过断点调试,但是针对的是单文件的断点调试。在实际应用中,一个项目是多目录多文件的

参考资料:gdb debugger

目录结构:

$ tree
.
├── gdbSomeFiles.cpp
├── Libs
│   ├── add.cpp
│   ├── add.h
│   └── makefile
└── makefile

add.h

  1. #pragma once
  2.  
  3. class CAdd
  4. {
  5. public:
  6. CAdd(void);
  7. int add(int &a, int &b);
  8. virtual ~CAdd(void);
  9. };

add.h

add.cpp

  1. #include "add.h"
  2.  
  3. CAdd::CAdd(void)
  4. {
  5. }
  6.  
  7. int CAdd::add(int &a, int &b)
  8. {
  9. int ret = a + b;
  10. return ret;
  11. }
  12.  
  13. CAdd::~CAdd(void)
  14. {
  15. }

add.cpp

上层makefile

  1. CFLAGS=-g -Wall -pedantic -std=c++0x
  2. xmain:$(OBJS)
  3. # g++ ${CFLAGS} -c -I. add.cpp
  4. # ar rc libadd.a add.o
  5. # g++ $(CFLAGS) gdbSomeFiles.cpp -o xmain -I./Libs -L./Libs -ladd
  6. g++ $(CFLAGS) gdbSomeFiles.cpp -o xmain -I./Libs -L. -ladd
  7. clean:
  8. rm -f xmain $(OBJS) *.o *.a *~

makefile

Libs里面的makefile

  1. #OBJS=gdbSomeFiles.o
  2. CFLAGS=-g -Wall -pedantic -std=c++0x
  3. main:
  4. g++ ${CFLAGS} -c -I. add.cpp
  5. ar rc libadd.a add.o
  6. mv libadd.a ../
  7. clean:
  8. rm -f xmain $(OBJS) *.o *.a *~

makefile

调试:

1.图形化调试

$ gdb xmain --tui

2. 普通调试

$  gdb xmain

设置和获取源代码显示数量:
默认情况下,GDB显示指定位置处以及其前后的10行代码,但是这是一个可设置的值。
set listsize count:设置list命令显示的源代码数量最多为count行,0表示不限制行数。
show listsize:显示listsize的值。

 (gdb) list add.cpp:9

如果显示找不到第九行,则说明当前调试环境没有add.cpp的源码位置,添加add.cpp所在的目录位置即可。

查看当前环境设置的调试目录:(gdb) show directories

(gdb) directory ./Libs/

或者 (gdb) dir ./Libs/

如果该程序是由很多原文件构成的,你可以在各个原文件中设置断点,而不是在当前的原文件中设置断点,其方法如下:
(gdb) break filename:line-number 
(gdb) break filename:function-name

在add.cpp的第九行打断点

(gdb) break add.cpp:9

Breakpoint 1 at 0x40180e: file add.cpp, line 9.

(gdb) break line-or-function if expr

condition bnum: 取消第bnum个breakpoint的条件

break +offset: 在程序当前停止的行向前offset行处设置breakpoint
break offset: 在程序当前停止的行向衙offset行处设置breakpoint

rbreak regex: 在所有符合正则表达式regex的函数处设置breakpoint

显示当前gdb的断点信息: 
(gdb) info break

删除指定的某个断点: 
(gdb) delete breakpoint 1 
该命令将会删除编号为1的断点,如果不带编号参数,将删除所有的断点 
(gdb) delete breakpoint 
3.禁止使用某个断点 
(gdb) disable breakpoint 1 
该命令将禁止断点 1,同时断点信息的 (Enb)域将变为 n 
4.允许使用某个断点 
(gdb) enable breakpoint 1 
该命令将允许断点 1,同时断点信息的 (Enb)域将变为 y 
5.清除原文件中某一代码行上的所有断点 
(gdb)clean number 
注:number 为原文件的某个代码行的行号

在断点处用display输出a和b的值,以后再断点处会显示变量的值。undisplay取消显示

(gdb) display a

(gdb) display a

(gdb) layout asm (显示汇编)

(gdb) layout split (同时显示源码和汇编)

(gdb) r
Starting program: /home/zhu_ying/GDBMultiFiles/xmain

Breakpoint 1, CAdd::add (this=0x7fffffffe2d0, a=@0x7fffffffe2dc, b=@0x7fffffffe2d8) at add.cpp:9
9 int ret = a + b;
Missing separate debuginfos, use: debuginfo-install libgcc-4.4.7-4.el6.x86_64 libstdc++-4.4.7-4.el6.x86_64

显示变量的类型:

(gdb) whatis ret

ptype:比whatis的功能更强,他可以提供一个结构的定义

设置变量的值:

(gdb) set variable a = 30

(gdb) set variable b = 3

退出函数:
(gdb) finish

终止本次调试:

(gdb) kill
Kill the program being debugged? (y or n)

附加:

file FILE 装载指定的可执行文件进行调试。

clear 删除刚才停止处的断点 
commands 命中断点时,列出将要执行的命令

(gdb)list

(gdb) search add
Expression not found

有的时候,你会发现search命令总是提示“Expression not found”,这是因为当前行可能已经是最后一行了,特别是文件很短的时候。这里需要注意的是,任何list命令都会影响当前行的位置,并且由于每次都是多行输出,所以对当前行的影响并非简单地向前一行或者向后一行。
          search命令本身也会影响当前行的位置。

逆向检索add关键字:
(gdb) reverse-search .*add.*
7 int CAdd::add(int &a, int &b)

若第n行被索引到,则下次搜索会从第n行开始。

跳过断点2之后的5个断点

  1. (gdb) ignore 2 5
  2. 例如:watch a可以设置观察点watchpoint a,一旦变量a的值发生变化,程序就会停在它发生变化的那个位置
  1. . Breakpoint: 作用是让程序执行到某个特定的地方停止运行
  2.  
  3. ()设置breakpoint
  4. a. break function: 在函数funtion入口处设置breakpoint
  5. b. break +offset: 在程序当前停止的行向前offset行处设置breakpoint
  6. c. break offset: 在程序当前停止的行向衙offset行处设置breakpoint
  7. d. break linenum: 在当前源文件的第linenum行处设置breakpoint
  8. e. break filename:linenum: 在名为filename的源文件的第linenum行处设置breakpoint
  9. f. break filename:function: 在名为filename的源文件中的function函数入口处设置breakpoint
  10. g. break *address: 在程序的地址address处设置breakpoint
  11. h. break if cond: …代表上面讲到的任意一个可能的参数,在某处设置一个breakpoint, 但且仅但condtrue时,程序停下来
  12. i. tbreak args: 设置一个只停止一次的breakpoints, argsbreak命令的一样。这样的breakpoint当第一次停下来后,就会被自己删除
  13. k. rbreak regex: 在所有符合正则表达式regex的函数处设置breakpoint
  14.  
  15. ()info breakpoints [n]:
  16. 查看第nbreakpoints的相关信息,如果省略了n,则显示所有breakpoints的相关信息
  17.  
  18. ()pending breakpoints:
  19. 是指设置在程序开始调试后加载的动态库中的位置处的breakpoints
  20. a. set breakpoint pending auto: GDB缺省设置,询问用户是否要设置pending breakpoint
  21. b. set breakpoint pending on: GDB当前不能识别的breakpoint自动成为pending breakpoint
  22. c. set breakpoint pending off: GDB当前不能识别某个breakpoint时,直接报错
  23. d. show breakpoint pending: 查看GDB关于pending breakpoint的设置的行为(auto, on, off)
  24.  
  25. ()breakpoints的删除:
  26. a. clear: 清除当前stack frame中下一条指令之后的所有breakpoints
  27. b. clear function & clear filename:function: 清除函数function入口处的breakpoints
  28. c. clear linenum & clear filename:linenum: 清除第linenum行处的breakpoints
  29. d. delete [breakpoints] [range…]: 删除由range指定的范围内的breakpointsrange范围是指breakpoint的序列号的范围
  30.  
  31. ()breakpoints的禁用、启用:
  32. a. disable [breakpoints] [range…]: 禁用由range指定的范围内的breakpoints
  33. b. enable [breakpoints] [range…]: 启用由range指定的范围内的breakpoints
  34. c. enable [breakpoints] once [range…]: 只启用一次由range指定的范围内的breakpoints,等程序停下来后,自动设为禁用
  35. d. enable [breakpoints] delete [range…]: 启用range指定的范围内的breakpoints,等程序停下来后,这些breakpoints自动被删除
  36.  
  37. ()条件breakpoints相关命令:
  38. a. 设置条件breakpoints可以通过break if cond来设置,也可以通过condition bnum expression来设置,在这里首先要通过()中介绍的命令设置好breakpoints,然后用condition命令来指定某breakpoint的条件,该breakpointbnum指定,条件由expression指定
  39. b. condition bnum: 取消第bnumbreakpoint的条件
  40. c. ignore bnum count: bnumbreakpoint跳过count次后开始生效
  41.  
  42. ()指定程序在某个breakpoint处停下来后执行一串命令:
  43. a. 格式:commands [bnum]
  44. command-list
  45. end
  46. b. 用途:指定程序在第bnumbreakpoint处停下来后,执行由command-list指定的命令串,如果没有指定bnum,则对最后一个breakpoint生效
  47. c. 取消命令列表: commands [bnum]
  48. end
  49. d. 例子:
  50. break foo if x>
  51. commands
  52. silent
  53. printf x is %d\n”,x
  54. continue
  55. end
  56. 上面的例子含义:当x>0时,在foo函数处停下来,然后打印出x的值,然后继续运行程序
  57.  
  58. . Watchpoint: 它的作用是让程序在某个表达式的值发生变化的时候停止运行,达到‘监视’该表达式的目的
  59.  
  60. ()设置watchpoints:
  61. a. watch expr: 设置写watchpoint,当应用程序写expr, 修改其值时,程序停止运行
  62. b. rwatch expr: 设置读watchpoint,当应用程序读表达式expr时,程序停止运行
  63. c. awatch expr: 设置读写watchpoint, 当应用程序读或者写表达式expr时,程序都会停止运行
  64.  
  65. ()info watchpoints:
  66. 查看当前调试的程序中设置的watchpoints相关信息
  67.  
  68. ()watchpointsbreakpoints很相像,都有enable/disabe/delete等操作,使用方法也与breakpoints的类似
  69. . Catchpoint: 的作用是让程序在发生某种事件的时候停止运行,比如C++中发生异常事件,加载动态库事件
  70.  
  71. ()设置catchpoints:
  72. a. catch event: 当事件event发生的时候,程序停止运行,这里event的取值有:
  73.  
  74. throw: C++抛出异常
  75. catch: C++捕捉到异常
  76. exec: exec被调用
  77. fork: fork被调用
  78. vfork: vfork被调用
  79. load: 加载动态库
  80. load libname: 加载名为libname的动态库
  81. unload: 卸载动态库
  82. unload libname: 卸载名为libname的动态库
  83. syscall [args]: 调用系统调用,args可以指定系统调用号,或者系统名称
  84. b. tcatch event: 设置只停一次的catchpoint,第一次生效后,该catchpoint被自动删除
  85.  
  86. ()catchpointsbreakpoints很相像,都有enable/disabe/delete等操作,使用方法也与breakpoints的类似
  1.  

gdb调试5--工程项目的断点调试的更多相关文章

  1. eclipse断点调试时不能进入断点调试

    页面JavaScript代码有错误!!!F12调试.

  2. pycharm 调试django 服务端断点调试

    django  runserver 服务端断电调试 D:\model\gitlab\eebo.ehr.analysis\venv\Scripts\python.exe "C:\Program ...

  3. ###Android 断点调试和高级调试###

    转自:http://www.2cto.com/kf/201506/408358.html 有人说Android 的调试是最坑的,那我只能说是你不会用而已,我可以说Android Studio的调试是我 ...

  4. IDEA调试总结(设置断点进行调试)

    IDEA调试总结(设置断点进行调试) 黑背景版: 先编译好要调试的程序.1.设置断点

  5. android studio学习----android studio断点调试

    先编译好要调试的程序. 1.设置断点 选定要设置断点的代码行,在行号的区域后面单击鼠标左键即可. 2.开启调试会话 点击红色箭头指向的小虫子,开始进入调试. IDE下方出现Debug视图,红色的箭头指 ...

  6. android studio学习----调试---断点调试

    Android Studio调试其实也非常方便,一般问题直接通过AS的DDMS的Logcat就可以搞定.AS支持类似Eclipse的DDMS的所有功能.这里要说的是疑难问题的调试方式,即断点调试. 首 ...

  7. JS谷歌浏览器断点调试

    1.找到对应的文件 按F12打开网页调试工具,默认打开的是Elements,显示的是网页标签元素.选择Source,在左侧找到对应的js代码文件(这里是在page标签上找到的) 1.1.如何找到web ...

  8. linux下的gdb调试工具--断点调试

    到目前为止我们的调试手段只有一种: 根据程序执行时的出错现象假设错误原因,然后在代码中适当的位置插入printf,执行程序并分析打印结果,如果结果和预期的一样,就基本上证明了自己假设的错误原因,就可以 ...

  9. Lua中如何实现类似gdb的断点调试--01最小实现

    说到Lua代码调试,最常用的方法应该就是加一堆print进行打印.print大法虽好,但其缺点也是显而易见的.比如效率低下,需要修改原有函数内部代码,在每个需要的地方添加print语句,运行一次只能获 ...

随机推荐

  1. M1/M2阶段总结

    之前提问的博客 问题解答 问题 1 关于代码复审,复审者是否应该参与编码?如果复审者也参与编码的话,那么难免任务量较多,但如果不参与编码的话,工作分配的似乎不太均衡. 我们的团队项目在M1和M2阶段没 ...

  2. 【读书笔记】Linux内核设计与实现(第三章)

    3.1 进程 处于执行期的程序. 进程就是正在执行的程序代码的实时结果.内核需要有效而又透明地管理所有细节. 执行线程(简称线程):在进程中活动的对象.每个线程都拥有一个独立的程序计数器.进程栈和一组 ...

  3. 《Linux内核设计与实现》读书笔记 3

    第三章 进程管理 3.1进程 概念: 进程:处于执行期的程序.但不仅局限于程序,还包含其他资源(打开的文件,挂起的信号,内核内部数据,处理器状态,一个或多个具有内催音社的内存地址空间及一个或多个执行线 ...

  4. 同步手绘板——关于/dev/graphics/fb0权限的获取

    需要先将手机进行root,接着通过代码将/dev/graphics/fb0文件修改为可读的权限

  5. 广商博客冲刺第三天new

    第二天沖刺傳送門 第三四天沖刺傳送門 这一天我们主要是弄网页前台设计跟框架设计,这方面主要是由张奇聪负责.我们在amaze ui,smart ui,angularjs+bootstrap中挑选,最终选 ...

  6. Activiti启动某个流程失败,页面报500

    现象:Activiti启动某个流程失败,页面报500,错误日志如下. 2017-06-19 10:50:09 [org.activiti.engine.impl.interceptor.Command ...

  7. FTP Download File By Some Order List

    @Echo Off REM -- Define File Filter, i.e. files with extension .RBSet FindStrArgs=/E /C:".asp&q ...

  8. 小程序的wx.onAccelerometerChange

    https://www.2cto.com/kf/201802/724174.html(copy) 也许有人会问,小程序中都是竖直app形态,要横竖屏判断有什么用?即使判断出了横屏状态,你能把小程序横过 ...

  9. 解决从pip上下载的最新flask版本不能运行flaskr和最新特性的问题

    由于在测试flask的单元测试.所以准备弄个环境,查询官方文档发现flask源码里面有一个example文件夹里面有个flaskr应用 可供测试 看了一下readme文档,大致是这样 / Flaskr ...

  10. 浅谈cpu.idle和cpu.load

    1.概述 大家经常对一个系统的容量进行评估时,会参考cpu.idle和cpu.load指标,但是这两个指标到底在什么区间,表示系统是正常或者异常呢,业内有不同的说法.因此本文搜集一些资料,并对一个系统 ...