示例代码

 1 #include <iostream>
2 using namespace std;
3
4 void Print()
5 {
6 cout<<"helloworld"<<endl;
7 }
8
9 class TestDebug
10 {
11 public:
12 TestDebug()
13 {
14 cout<<"TestDebug"<<endl;
15 int temp=0;
16 ti = 0;
17 while(1)//调试自动变量
18 {
19 if(++temp==10)
20 break;
21 }
22 ti = temp;
23 }
24
25 void disPlayTi()
26 {
27 cout<<"ti:"<<ti<<endl;
28 }
29
30 private:
31 int ti;
32 };
33
34
35 int main() {
36
37 Print();
38 TestDebug tg;
39 tg.disPlayTi();
40 return 0;
41 }

使用gdb调试程序的前提是在编译程序时使用gcc -g的选项,这样才能在程序中生成调试相关的信息。下面我们就使用上面的示例代码来调试程序。

生成可调试程序

keqin@ubuntu:~/Test$ gcc -g hello.cpp -o hello -lstdc++

启动调试——gdb + 程序名

keqin@ubuntu:~/Test$ gdb hello 

#有时程序运行需要外设参数也就是main(int argc,char **argv)中的参数,可以使用 gdb --args +程序名 argv1 argv2 

启动成功后,对应如下输出,"(gdb)"开头标志着进入了可调式模式。

GNU gdb (Ubuntu 7.11.1-0ubuntu1~16.04) 7.11.1
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
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 "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from hello...done.
(gdb)

帮助:

输入help可以获得所有命令的帮助,

(gdb) help  #获取所有可用帮助指令
List of classes of commands: aliases -- Aliases of other commands
breakpoints -- Making program stop at certain points
data -- Examining data
files -- Specifying and examining files
internals -- Maintenance commands
obscure -- Obscure features
running -- Running the program
stack -- Examining the stack
status -- Status inquiries
support -- Support facilities
tracepoints -- Tracing of program execution without stopping the program
user-defined -- User-defined commands Type "help" followed by a class name for a list of commands in that class.
Type "help all" for the list of all commands.
Type "help" followed by command name for full documentation.
Type "apropos word" to search for commands related to "word".
Command name abbreviations are allowed if unambiguous.

输入help + command可以获取到某个命令的详细帮助信息,如输入help break来查看如何添加断点。其输出类似于Linux的man帮助

gdb) help break
Set breakpoint at specified location.
break [PROBE_MODIFIER] [LOCATION] [thread THREADNUM] [if CONDITION]
PROBE_MODIFIER shall be present if the command is to be placed in a
probe point. Accepted values are `-probe' (for a generic, automatically
guessed probe type), `-probe-stap' (for a SystemTap probe) or
`-probe-dtrace' (for a DTrace probe).
LOCATION may be a linespec, address, or explicit location as described
below. With no LOCATION, uses current execution address of the selected
stack frame. This is useful for breaking on return to a stack frame. THREADNUM is the number from "info threads".
CONDITION is a boolean expression.

Linespecs are colon-separated lists of location parameters, such as
source filename, function name, label name, and line number.
Example: To specify the start of a label named "the_top" in the
function "fact" in the file "factorial.c", use
"factorial.c:fact:the_top". Address locations begin with "*" and specify an exact address in the
program. Example: To specify the fourth byte past the start function
"main", use "*main + 4". ---Type <return> to continue, or q <return> to quit---

例如:

添加断点:

下面列举一些打断点的方式

break + 函数名

(gdb) break Print()
Breakpoint 1 at 0x40090a: file hello.cpp, line 6.

break +文件名:函数名

(gdb) break hello.cpp:Print()
 Note: breakpoint 1 also set at pc 0x40090a.
 Breakpoint 2 at 0x40090a: file hello.cpp, line 6.

 

break 文件名:行号

(gdb) break hello.cpp:39
Breakpoint 6 at 0x400951: file hello.cpp, line 39.

调试类中的成员函数

(gdb) break TestDebug #按Tab键补全
TestDebug TestDebug::TestDebug() TestDebug::disPlayTi()
(gdb) break TestDebug::TestDebug()
Breakpoint 3 at 0x4009d8: file hello.cpp, line 14.

执行调试(run)

(gdb) run
Starting program: /home/guilin/Test/hello Breakpoint 1, Print () at hello.cpp:6
6 cout<<"helloworld"<<endl;

继续运行到下个断点(continue)

(gdb) continue
Continuing.
helloworld Breakpoint 3, TestDebug::TestDebug (this=0x7fffffffe1d0) at hello.cpp:14
14 cout<<"TestDebug"<<endl;

//如果感觉断点不够,调试过程可以继续添加加断点。

打印变量值(print)

出于调试需要,有时候我们需要查看某个变量的值。

(gdb) print temp
$1 = 0

监视某个变量(watch)——调试过程中,变量数据发生变化会自动停下来。

(gdb) break 14      #先打断点
Breakpoint 20 at 0x4009d8: file hello.cpp, line 14.
(gdb) run       #运行程序
Starting program: /home/guilin/Test/hello
helloworld Breakpoint 20, TestDebug::TestDebug (this=0x7fffffffe1a0) at hello.cpp:14
14 cout<<"TestDebug"<<endl;
(gdb) watch temp   #调试成中添加监控变量
Hardware watchpoint 21: temp
(gdb) continue    #继续执行
Continuing.
TestDebug Hardware watchpoint 21: temp Old value = 0     #变量旧值
New value = 1     #变量新值 
0x0000000000400a09 in TestDebug::TestDebug (this=0x7fffffffe1a0) at hello.cpp:19
19 if(++temp==10)

添加条件断点:

我们有时需程序自动运行到某个临界条件而在此条件满足之前不去调试它,这时可以使用条件断点。

gdb)break hello.cpp:39 if temp>8 #当TestDebug::TestDebug 中temp>8时才中止运行 
Note: breakpoint 3 also set at pc 0x4009d8. Breakpoint 32 at 0x4009d8: file hello.cpp, line 19.

单步调试(next)——一般对应IDE中的F10

(gdb) next  
helloworld
38 TestDebug tg;
(gdb) next
TestDebug
39 tg.disPlayTi();

单步进入(step)——一般对应IDE中的F11

Breakpoint 9, main () at hello.cpp:37
37 Print();
(gdb) step  #调试时会进入到函数内部
Print () at hello.cpp:6
6 cout<<"helloworld"<<endl;
(gdb)

 

执行到下个断点(continue)——一般对应IDE中F5

(gdb) continue
Continuing.
TestDebug Breakpoint 31, TestDebug::TestDebug (this=0x7fffffffe1d0) at hello.cpp:16
16 ti = 0;
(gdb) print temp
$2 = 0

修改变量值(set var 变量名=value)

有时候有些有异常处理的分支无法进入,或者我们想提前到达某个临界条件。可以去直接修改变量的值以达到目的。

(gdb) run
Starting program: /home/guilin/Test/hello
helloworld Breakpoint 20, TestDebug::TestDebug (this=0x7fffffffe1a0) at hello.cpp:14
14 cout<<"TestDebug"<<endl;
(gdb) watch temp
Hardware watchpoint 22: temp
(gdb) c
Continuing.
TestDebug Hardware watchpoint 22: temp Old value = 0
New value = 1
0x0000000000400a09 in TestDebug::TestDebug (this=0x7fffffffe1a0) at hello.cpp:19
19 if(++temp==10)
(gdb) set var temp=9
(gdb) c
Continuing. Hardware watchpoint 22: temp Old value = 9
New value = 10
0x0000000000400a09 in TestDebug::TestDebug (this=0x7fffffffe1a0) at hello.cpp:19
19 if(++temp==10)

查看堆栈调用(backtrace)

(gdb) backtrace  #简写为bt
#0 main () at hello.cpp:39

清除断点:

clear

用法与break类似,如何创建,如何删除。

delete

delete(删除所有断点)

(gdb) delete
Delete all breakpoints? (y or n)

gdb调试用命令与一般调试方法的更多相关文章

  1. 调试多线程 & 查死锁的bug & gcore命令 & gdb对多线程的调试 & gcore & pstack & 调试常用命令

    gdb thread apply all bt 如果你发现有那么几个栈停在 pthread_wait 或者类似调用上,大致就可以得出结论:就是它们几个儿女情长,耽误了整个进程. 注意gdb的版本要高于 ...

  2. gdb调试常用命令

    gdb 调试常用命令 gcc -g mian.c -o main.out -o (定制生成的可执行文件的名称,缺省时为a.out) -g 使gdb可调试,在编译的时候,产生调试信息 gdb main. ...

  3. 使用 GDB 调试需要命令行参数的程序

    使用 gdb 命令提供的 --args 选项可以调试需要命令行参数的程序,如下: gdb --args a.out arg1 arg2 arg3

  4. gdb的调试常用命令

    一.gdb常用的命令 list                       l    常看源代码 break                  b    设置断点     b  10(行号)    b ...

  5. Linux Bash命令关于程序调试详解

    转载:http://os.51cto.com/art/201006/207230.htm 参考:<Linux shell 脚本攻略>Page22-23 Linux bash程序在程序员的使 ...

  6. 调试JMETER脚本的5种方法

    如果你曾经设计过JMeter脚本,我敢打赌你至少有一次弄清楚Json Extractor无法正常工作的原因.你猜怎么着?我去过那儿! 你知道为什么最好的JMeter Performance Engin ...

  7. GDB(十)--调试正在运行的进程

    我编写了一个循环: long i;    for (i = 0; i < 999999; i++) {        mt.a += 1;        sleep(1);    }把它编译成a ...

  8. 调试python 程序的几种方法总结

    程序能一次写完并正常运行的概率很小,基本不超过1%.总会有各种各样的bug需要修正.有的bug很简单,看看错误信息就知道,有的bug很复杂,我们需要知道出错时,哪些变量的值是正确的,哪些变量的值是错误 ...

  9. [vscode] os.getcwd(),调试和命令行运行的结果不一致

    问题描述: 调试和命令行运行的时候工作目录不一致 这会导致一个问题,我想从上级目录导入模块的话,F5调试就会找不到模块,而命令行则没问题 那么我该如何调试呢? 目录结构: top  └ folder_ ...

随机推荐

  1. C语言:FILE p和FILE *p

    FILE p和FILE *p大概可以这么理解:1 . 前一个p指文件型变量,后一个p指文件地址型变量.2 . 前一个p的内存地址已定,后一个p内存地址未定. 前一个是声明类对象,后一个是声明一个可指向 ...

  2. python爬取北京政府信件信息01

    python爬取,找到目标地址,开始研究网页代码格式,于是就开始根据之前学的知识进行爬取,出师不利啊,一开始爬取就出现了个问题,这是之前是没有遇到过的,明明地址没问题,就是显示网页不存在,于是就在百度 ...

  3. 自动执行文件夹中的py文件

    写一个函数,接收一个地址,执行其中的py文件,包括子文件.path.endswith('.py') 判断以'.py'结尾,是什么类型的文件.os.system('python %s'%path) 模拟 ...

  4. .Net Core with 微服务 - Polly 服务降级熔断

    在我们实施微服务之后,服务间的调用变的异常频繁.多个服务之间可能是互相依赖的关系.某个服务出现故障或者是服务间的网络出现故障都会造成服务调用的失败,进而影响到某个业务服务处理失败.某一个服务调用失败轻 ...

  5. selenium3 + python - js&jquery操作处理

    # 推荐学习:https://www.w3school.com.cn/js/index.asp## 下面以简书登录&注册定位元素为例"""js定位 id name ...

  6. 【知识详解】Https详解

    Https详解 1.什么是Https Http + SSL = Https 一句话说:Https是身披SSL的Http,当使用了SSL后,Http先和SSL通信,再由SSL和TCP通信, 2.为什么需 ...

  7. 在Windows7/8/10 64位操作系统下安装并注册ocx控件

    例如: 先网上下载一个MtbLine.ocx控件放入C:\Windows\SysWOW64\目录下 1.首先确保你的 Windows7 账户是管理员权限 2.下载MtbLine.ocx控件,网上可搜到 ...

  8. 第六篇--MFC美化界面

    1.MFC如何设置背景颜色 首先,为对话框添加WM_CTLCOLOR消息,方法为:右击Dialog窗口 --> Class Wizard --> Messages --> WM_CT ...

  9. SQL_之 递归_START WITH id ='102' CONNECT BY PRIOR pid=id

    oracle 递归用法 SELECT * FROM menu START WITH id ='102' CONNECT BY PRIOR pid=id 一种应用 SELECT * FROM menu ...

  10. js中变量提升和函数提升

    变量提升和函数提升的总结 我们在学习JavaScript时,会遇到变量提升和函数提升的问题,为了理清这个问题,现做总结如下,希望对初学者能有所帮助 我们都知道 var 声明的变量有变量提升,而 let ...