示例代码

 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. 个人博客开发之blog-api 项目全局日志拦截记录

    前言 大型完善项目中肯定是需要一个全局日志拦截,记录每次接口访问相关信息,包括: 访问ip,访问设备,请求参数,响应结果,响应时间,开始请求时间,访问接口描述,访问的用户,接口地址,请求类型,便于项目 ...

  2. bootstrap栅格布局-v客学院知识分享

    今天主要跟大家讲解下bootstrap的栅格布局,以及使用过程中应该注意的问题 首先我们要使用bootstrp的栅格布局就必须使用HTML正确的基本结构 如下图: 必须给要使用栅格布局的盒子定义cla ...

  3. Javascript闭包解析----------------v客学院技术分享

    跟java,php等编程语言一样,javascript也采用词法作用域,简单的来说就是函数的执行依赖于变量的作用域,这个作用域是在函数定义时决定的,而不是函数调用时决定的.为了实现这种词法作用域,还必 ...

  4. CSP-S 2020

    游记 Day# 游记个鬼啊就在自家学校=-= 早上宿舍待不了,去机房颓废,看了几集猫和老鼠,并且把看门狗军团的流程看完了(真棒),甚至在考试之前把老师给的巧克力也吃完了. 期间zyt学长来摸鱼.他们今 ...

  5. POJ3264线段树求最值

    刚开始还觉得有点怪怪的.因为想着如果每个树只是单纯地记录它所在的区间的话会不会有不在区间内的数据给更新了,但是我好像是傻掉了因为如果有这种情况出现的话在父亲节点就会分成l,mid和mid+1,r两个区 ...

  6. String类型转成int类型

    在将String类型转换成int类型时: int n = Interger.parseInt(Stringnum); 如果报错,可以改成 int n = Interger.parseInt(Strin ...

  7. 开发工具IDE从入门到爱不释手(四)高级进阶

    代码生成Alt+Insert set/get生成 构造方法生成 toString生成 hashCode,equals 代码重构Refactor 不改变原有逻辑,让IDE帮助代码美观 重命名 Shift ...

  8. Python3.9安装PySpider步骤及问题解决

    先写一些前言吧,自己感觉python已经有一定的基础了,但是在安装这个过程居然用了一下午,感觉有些收货,特地写下来与大家分享一下. PySpider是一个强大的网络爬虫系统,GitHub地址:http ...

  9. JS_点击事件_弹出窗口_自动消失

    <!doctype html> <html> <head> <meta charset="utf-8"/> <title> ...

  10. Python3中datetime时区转换介绍与踩坑

    最近的项目需要根据用户所属时区制定一些特定策略,学习.应用了若干python3的时区转换相关知识,这里整理一部分记录下来. 下面涉及的几个概念及知识点: GMT时间:Greenwich Mean Ti ...