gdb调试实战

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chengqiuming/article/details/90141150

一 代码

#include<iostream>
using namespace std;
int func(int n){
    int result=0;
    for(int i=1;i<=n;i++){
        result+=i;
    }
    return result;
}
int main(){
    int arr[10];
    arr[0]=0;
    arr[1]=1;
    for(int i=2;i<10;i++){
        arr[i]=arr[i-1]+arr[i-2];
    }
    cout<<"arr[9]"<<arr[9]<<endl;
    cout<<"func(9)"<<func(9)<<endl;
    return 0;
}

二 编译运行

[root@localhost charpter05]# g++ -g -o test 0504.cpp
[root@localhost charpter05]# ./test
arr[9]34
func(9)45

三 gdb调试

1 输入gdb test命令,启动gdb

[root@localhost charpter05]# gdb test
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-100.el7_4.1
Copyright (C) 2013 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-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /root/omc++/charpter05/test...done.
(gdb)

2 输入l,列出源码

(gdb) l
3    int func(int n){
4        int result=0;
5        for(int i=1;i<=n;i++){
6            result+=i;
7        }
8        return result;
9    }
10    int main(){
11        int arr[10];
12        arr[0]=0;

3 按下Enter,表示重复上一次命令

(gdb)
13        arr[1]=1;
14        for(int i=2;i<10;i++){
15            arr[i]=arr[i-1]+arr[i-2];
16        }
17        cout<<"arr[9]"<<arr[9]<<endl;
18        cout<<"func(9)"<<func(9)<<endl;
19        return 0;
20    }

4 执行 b 15,表示在源码15行处设置断点

(gdb) b 15
Breakpoint 1 at 0x40090b: file 0504.cpp, line 15.

5 执行 b func ,表示设置断点在函数func的入口处

(gdb) b func
Breakpoint 2 at 0x4008c4: file 0504.cpp, line 4.

6 执行info break,表示查看断点信息

(gdb) info break
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x000000000040090b in main() at 0504.cpp:15
2       breakpoint     keep y   0x00000000004008c4 in func(int) at 0504.cpp:4

7 执行r命令,表示运行程序,run命令的简写

(gdb) r
Starting program: /root/omc++/charpter05/test

Breakpoint 1, main () at 0504.cpp:15
15            arr[i]=arr[i-1]+arr[i-2];
Missing separate debuginfos, use: debuginfo-install glibc-2.17-196.el7_4.2.x86_64 libgcc-4.8.5-16.el7_4.1.x86_64 libstdc++-4.8.5-16.el7_4.1.x86_64

程序停在断点处。

8 输入 n ,表示单条语句执行,next命令的简写

(gdb) n
14        for(int i=2;i<10;i++){

8 输入 p i 和 p arr[i] ,分别打印变量i 和变量 arr[i]的值。

(gdb) p i
$1 = 2
(gdb) p arr[i]
$2 = 1

9 输入 bt,查看函数堆栈

(gdb) bt
#0  func (n=9) at 0504.cpp:5
#1  0x000000000040096b in main () at 0504.cpp:18

10 输入finish ,退出函数

(gdb) finish
Run till exit from #0  func (n=9) at 0504.cpp:5
0x000000000040096b in main () at 0504.cpp:18
18        cout<<"func(9)"<<func(9)<<endl;
Value returned is $3 = 45

11 输入 q,结束调试

(gdb) q
A debugging session is active.

    Inferior 1 [process 1095] will be killed.

Quit anyway? (y or n) y

猜你喜欢

转载自blog.csdn.net/chengqiuming/article/details/90141150