文章出處

mickole@test:~/ctest/05gdb$ gdb simple //開始gdb調試
GNU gdb (Ubuntu/Linaro 7.4-2012.04-0ubuntu2.1) 7.4-2012.04
Copyright (C) 2012 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 "i686-linux-gnu".
For bug reporting instructions, please see:
<http://bugs.launchpad.net/gdb-linaro/>...
Reading symbols from /home/mickole/ctest/05gdb/simple...done.
(gdb) list //顯示源文件也可用l簡寫
1    #include <stdio.h>
2    #include <stdlib.h>
3   
4    long func(int n);
5   
6    int main(int argc, char *argv[])
7    {
8        printf("Entering main ...\n");
9        int i;
10        for (i=0; i<argc; ++i)
(gdb) //回車鍵,繼續上一條命令
11        {
12            printf("%s ", argv[i]);
13        }
14        printf("\n");
15        long result = 0;
16        for (i=1; i<=100; ++i)
17        {
18            result += i;
19        }
20        printf("result[1-100] = %ld\n", result);
(gdb)
21        printf("result[1-10] = %ld\n", func(10));
22   
23        printf("Exiting main ...\n");
24        return 0;
25    }
26   
27    long func(int n)
28    {
29        long sum = 0;
30        int i;
(gdb)
31        for (i=1; i<=n; ++i)
32        {
33            sum += i;
34        }
35   
36        return sum;
37    }
(gdb)
Line number 38 out of range; simple.c has 37 lines.

(gdb) break 10 //設置斷點也可用b
Breakpoint 1 at 0x8048459: file simple.c, line 10.
(gdb) info b //查看所有斷點信息也可用i b代替
Num     Type           Disp Enb Address    What
1       breakpoint     keep y   0x08048459 in main at simple.c:10

(gdb) b func //也可在某個函數的入口位置設置斷點
Breakpoint 2 at 0x804850b: file simple.c, line 29.
(gdb) i b
Num     Type           Disp Enb Address    What
1       breakpoint     keep y   0x08048459 in main at simple.c:10
2       breakpoint     keep y   0x0804850b in func at simple.c:29

(gdb) l 10 //查看指定行源代碼
5   
6    int main(int argc, char *argv[])
7    {
8        printf("Entering main ...\n");
9        int i;
10        for (i=0; i<argc; ++i)
11        {
12            printf("%s ", argv[i]);
13        }
14        printf("\n");
(gdb) l 29
24        return 0;
25    }
26   
27    long func(int n)
28    {
29        long sum = 0;
30        int i;
31        for (i=1; i<=n; ++i)
32        {
33            sum += i;

(gdb) r //開始運行調試run ,停在第一個斷點處
Starting program: /home/mickole/ctest/05gdb/simple
Entering main ...

Breakpoint 1, main (argc=1, argv=0xbffff3f4) at simple.c:10
10        for (i=0; i<argc; ++i)
(gdb) step //單步調試
12            printf("%s ", argv[i]);
(gdb) s
10        for (i=0; i<argc; ++i)
(gdb)
14        printf("\n");
(gdb)
/home/mickole/ctest/05gdb/simple
15        long result = 0;
(gdb)
16        for (i=1; i<=100; ++i)
(gdb)
18            result += i;
(gdb)
16        for (i=1; i<=100; ++i)
(gdb) p i //打印i變量值print i
$1 = 1
(gdb) s
18            result += i;
(gdb)
16        for (i=1; i<=100; ++i)
(gdb)
18            result += i;
(gdb) p i
$2 = 3

(gdb) until //如果不想再繼續循環可用until跳出循環,此處跳出for循環
20        printf("result[1-100] = %ld\n", result);
(gdb) l 20
15        long result = 0;
16        for (i=1; i<=100; ++i)
17        {
18            result += i;
19        }
20        printf("result[1-100] = %ld\n", result);
21        printf("result[1-10] = %ld\n", func(10));
22   
23        printf("Exiting main ...\n");
24        return 0;

(gdb) p result //跳出循環后打印result值
$4 = 5050
(gdb) s //繼續單步跟蹤
result[1-100] = 5050
21        printf("result[1-10] = %ld\n", func(10));
(gdb) c//continue繼續跟蹤,直接跳到下一個斷點處
Continuing.

Breakpoint 2, func (n=10) at simple.c:29
29        long sum = 0;
(gdb) l 29
24        return 0;
25    }
26   
27    long func(int n)
28    {
29        long sum = 0;
30        int i;
31        for (i=1; i<=n; ++i)
32        {
33            sum += i;
(gdb) s //單步跟蹤
31        for (i=1; i<=n; ++i)
(gdb)
33            sum += i;
(gdb)
31        for (i=1; i<=n; ++i)
(gdb)
33            sum += i;
(gdb)
31        for (i=1; i<=n; ++i)
(gdb)
33            sum += i;
(gdb)
31        for (i=1; i<=n; ++i)
(gdb) p sum
$5 = 6
(gdb) s
33            sum += i;
(gdb)
31        for (i=1; i<=n; ++i)
(gdb) finish //如果想跳出函數,可用finish
Run till exit from #0  func (n=10) at simple.c:31
0x080484e1 in main (argc=1, argv=0xbffff3f4) at simple.c:21
21        printf("result[1-10] = %ld\n", func(10));
Value returned is $6 = 55
(gdb) s
result[1-10] = 55
23        printf("Exiting main ...\n");
(gdb) s
Exiting main ...
24        return 0;
(gdb) c //繼續跟蹤,直至正常結束
Continuing.
[Inferior 1 (process 4450) exited normally]

(gdb) quit //退出調試
mickole@test:~/ctest/05gdb$

以下是單個命令解析:

run: 開始調試,后面可接程序運行所需參數,如:

mickole@test:~/ctest/05gdb$ gdb simple
GNU gdb (Ubuntu/Linaro 7.4-2012.04-0ubuntu2.1) 7.4-2012.04
Copyright (C) 2012 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 "i686-linux-gnu".
For bug reporting instructions, please see:
<http://bugs.launchpad.net/gdb-linaro/>...
Reading symbols from /home/mickole/ctest/05gdb/simple...done.
(gdb) r a b c
Starting program: /home/mickole/ctest/05gdb/simple a b c
Entering main ...
/home/mickole/ctest/05gdb/simple a b c
result[1-100] = 5050
result[1-10] = 55
Exiting main ...
[Inferior 1 (process 4476) exited normally]
(gdb)

 

list: 列出源代碼:

list 默認列出前十行

list 10 列出指定行

list 2,10 列出2到10行

list ,15 列出第15行包括第15行前面十行,如:

(gdb) l ,15
6    int main(int argc, char *argv[])
7    {
8        printf("Entering main ...\n");
9        int i;
10        for (i=0; i<argc; ++i)
11        {
12            printf("%s ", argv[i]);
13        }
14        printf("\n");
15        long result = 0;

 

list main :列出指定函數的前十行,如

(gdb) l main
2    #include <stdlib.h>
3   
4    long func(int n);
5   
6    int main(int argc, char *argv[])
7    {
8        printf("Entering main ...\n");
9        int i;
10        for (i=0; i<argc; ++i)
11        {

list hello.c:func  :查看指定文件中的指定函數源碼

 

設置斷點和查看斷點:

break 行號

break fun

break file:行號

break file:fun

break if <condition> - 條件成立時程序停住。

info break(i b) - 查看斷點

watch expr - 一量expr值發生改變,程序停住。

delete n - 刪除斷點,如:

(gdb) i b
Num     Type           Disp Enb Address    What
1       breakpoint     keep y   0x08048459 in main at simple.c:10
2       breakpoint     keep y   0x0804850b in func at simple.c:29
(gdb) d 1
(gdb) d 2

 

單步調試:

continue(c) - 運行至下一個斷點

step(s) - 單步跟蹤,進入函數,類似于VC中的step in

next(n) - 單步跟蹤,不進入函數,類似于VC中的step out

finish - 運行程序,直到當前函數完成返回。并打印函數返回時的堆棧地址和返回值及參數值等信息。

until - 當厭倦了在一個循環體內單步跟蹤時,這個命令可以運行程序直到退出循環體。

 

gdb常用命令總結:

QQ截圖20130929161119

 

現在利用gdb查看運行時數據:

print - 查看變量值

ptype - 查看類型

print array - 查看數組

print arr1  -查看整個數組元素

print arr[2] -查看指定數組元素

print &arr1[2] -查看指定下標元素地址

print &arr1 - 查看數組首地址

print *array@len - 查看動態內存

print x=5 - 改變運行時數據

 

gdb調試段錯誤:

段錯誤是由于訪問非法地址而產生的錯誤。

  • 訪問系統數據區,尤其是往系統保護的內存地址寫數據。最常見就是給一個指針以0地址
  • 內存越界(數組越界,變量類型不一致等) 訪問到不屬于你的內存區域

示例:

mickole@test:~/ctest/06gdb$ gdb bugging
GNU gdb (Ubuntu/Linaro 7.4-2012.04-0ubuntu2.1) 7.4-2012.04
Copyright (C) 2012 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 "i686-linux-gnu".
For bug reporting instructions, please see:
<http://bugs.launchpad.net/gdb-linaro/>...
Reading symbols from /home/mickole/ctest/06gdb/bugging...done.
(gdb) r //如果程序出現段錯誤,最好的定位方式就是直接運行,它會自動停在段錯誤處
Starting program: /home/mickole/ctest/06gdb/bugging

Program received signal SIGSEGV, Segmentation fault.
0x080483c4 in segfault () at bugging.c:7
7        *p = 100;
(gdb) bt  //利用棧回溯
#0  0x080483c4 in segfault () at bugging.c:7
#1  0x080483d4 in main () at bugging.c:12
(gdb) l 7 //定位到第7行
2    #include <stdlib.h>
3   
4    void segfault()
5    {
6        int *p = NULL;
7        *p = 100;
8    }
9   
10    int main(void)
11    {
(gdb)

 

利用core文件進行調試:

1、core文件

在程序崩潰時,一般會生成一個文件叫core文件。core文件記錄的是程序崩潰時的內存映像,并加入調試信息。

core文件生成的過程叫做core dump

2、設置生成core文件

ulimit -c 查看core-dump狀態即是否會產生core文件,如:

mickole@test:~/ctest/06gdb$ ulimit -a
core file size          (blocks, -c) 0 //塊大小為0,表示不會產生core文件
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 7895
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 7895
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
mickole@test:~/ctest/06gdb$ ulimit -c
0

mickole@test:~/ctest/06gdb$ ulimit -c 1024 //設置core文件塊大小
mickole@test:~/ctest/06gdb$ ulimit -c
1024

ulimit -c 數字(如:ulimit -c 1024)

ulimit -c unlimited

3、gdb利用core文件調試

gdb 文件名 core文件

bt

 

示例:

mickole@test:~/ctest/06gdb$ ./bugging
Segmentation fault (core dumped)
mickole@test:~/ctest/06gdb$ ls
bugging  bugging.c  core  Makefile  reverse  reverse.c  simple  simple.c

以上出現段錯誤,產生core文件,現在利用core文件進行調試:

mickole@test:~/ctest/06gdb$ gdb bugging core
GNU gdb (Ubuntu/Linaro 7.4-2012.04-0ubuntu2.1) 7.4-2012.04
Copyright (C) 2012 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 "i686-linux-gnu".
For bug reporting instructions, please see:
<http://bugs.launchpad.net/gdb-linaro/>...
Reading symbols from /home/mickole/ctest/06gdb/bugging...done.
[New LWP 4582]

warning: Can't read pathname for load map: Input/output error.
Core was generated by `./bugging'.
Program terminated with signal 11, Segmentation fault.
#0  0x080483c4 in segfault () at bugging.c:7
7        *p = 100;
(gdb) bt
#0  0x080483c4 in segfault () at bugging.c:7
#1  0x080483d4 in main () at bugging.c:12
(gdb) l 7
2    #include <stdlib.h>
3   
4    void segfault()
5    {
6        int *p = NULL;
7        *p = 100;
8    }
9   
10    int main(void)
11    {
(gdb)


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()