用GDB调节和测试程序

用GDB调试C程序

gdb调节和测试文件,运维提醒没有12分文件。

GDB概述

GDB概述
————

GDB概述
————

报错During startup program exited with code 127.

————

GDB是GNU开源公司发布的二个强大的UNIX下的程序调节和测试工具。或者,各位相比较喜欢这种图形界面格局的,像VC、BCB等IDE的调节和测试,但要是您是在UNIX平台下做软件,你会发觉GDB这几个调节和测试工具有比VC、BCB的图形化调节和测试器更强硬的效率。所谓“寸有所长,尺有所短”就是以此道理。

GDB是GNU开源公司颁发的几个强有力的UNIX下的程序调节和测试工具。只怕,各位相比欣赏那种图形界面格局的,像VC、BCB等IDE的调剂,但万一你是在UNIX平台下做软件,你会发现GDB那些调节和测试工具有比VC、BCB的图形化调试器更强有力的效益。所谓“寸有所长,尺有所短”就是这几个道理。

 

GDB是GNU开源集团公布的3个强硬的UNIX下的程序调节和测试工具。或然,各位相比欣赏那种图形界面格局的,像VC、BCB等IDE的调节,但假如你是在UNIX平台下做软件,你会意识GDB这一个调节和测试工具有比VC、BCB的图形化调试器更强大的效益。所谓“寸有所长,尺有所短”正是其一道理。

貌似的话,GDB重要帮助你成功上面多个地点的功能:

貌似的话,GDB主要扶助你成功下边四个地方的功力:

澳门金沙国际 1

貌似的话,GDB主要协助你成功下边七个地点的效应:

   
一 、运转你的次序,能够依照你的自定义的供给自由的周转程序。
   
二 、可让被调剂的先后在你所钦点的调置的断点处停住。(断点能够是基准表明式)
    三 、当程序被停住时,能够检查此时您的顺序中所产生的事。
    ④ 、动态的更动你程序的推行环境。

   
① 、运维你的先后,可以根据你的自定义的渴求自由的周转程序。
   
② 、可让被调剂的程序在你所钦命的调置的断点处停住。(断点能够是规范表明式)
    三 、当程序被停住时,可以检查此时您的次第中所产生的事。
    ④ 、动态的更动你程序的执行环境。

 

① 、运营你的程序,能够遵照你的自定义的渴求自由的运营程序。

从地点看来,GDB和一般的调节和测试工具没有怎么两样,基本上也是到位这一个效能,可是在细节上,你会发现GDB那些调节和测试工具的雄强,我们大概相比习惯了图形化的调剂工具,但偶尔,命令行的调节工具却有所图形化学工业具所不可能成就的法力。让咱们每一种看来。

从地点看来,GDB和一般的调节工具没有何样两样,基本上也是成功那几个意义,可是在细节上,你会发现GDB这些调节和测试工具的无敌,我们可能比较习惯了图形化的调剂工具,但有时候,命令行的调节工具却有所图形化学工业具所不可能不负众望的意义。让我们逐条看来。

搜寻资料发现是因为文件是三十二位的,而使用的linux是六1三个人,/lib/ld-linux.so.2 不匡助叁10位文件。

二 、可让被调剂的主次在您所钦赐的调置的断点处停住。(断点能够是规则表达式)

一个调节和测试示例
——————

贰个调节示例
——————

 

③ 、当程序被停住时,能够检查此时你的程序中所发生的事。

源程序:tst.c

     1 #include <stdio.h>
     2
     3 int func(int n)
     4 {
     5         int sum=0,i;
     6         for(i=0; i<n; i++)
     7         {
     8                 sum+=i;
     9         }
    10         return sum;
    11 }
    12
    13
    14 main()
    15 {
    16         int i;
    17         long result = 0;
    18         for(i=1; i<=100; i++)
    19         {
    20                 result += i;
    21         }
    22
    23        printf("result[1-100] = %d /n", result );
    24        printf("result[1-250] = %d /n", func(250) );
    25 }

源程序:tst.c

解决办法:

四 、动态的更改您程序的推行环境。

 

     1 #include
<stdio.h>
     2
     3 int func(int n)
     4 {
     5         int sum=0,i;
     6         for(i=0; i<n; i++)
     7         {
     8                 sum+=i;
     9         }
    10         return sum;
    11 }
    12
    13
    14 main()
    15 {
    16         int i;
    17         long result = 0;
    18         for(i=1; i<=100; i++)
    19         {
    20                 result += i;
    21         }
    22
    23        printf(“result[1-100] = %d /n”, result );
    24        printf(“result[1-250] = %d /n”, func(250) );
    25 }

sudo apt-get install libc6:i386

从上边看来,GDB和一般的调节工具没有何样两样,基本上也是水到渠成那么些职能,不过在细节上,你会发觉GDB这一个调节和测试工具的兵不血刃,大家莫不比较习惯了图形化的调节和测试工具,但神蹟,命令行的调剂工具却持有图形化学工业具所无法成功的作用。让大家每一种看来。

编写翻译生成执行文书:(Linux下)
    hchen/test> cc -g tst.c -o tst

编译生成执行文书:(Linux下)
    hchen/test> cc -g tst.c -o tst

 

一个调节示例

使用GDB调试:

使用GDB调试:

澳门金沙国际 2

——————

hchen/test> gdb
tst  <———- 启动GDB
GNU gdb 5.1.1
Copyright 2002 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you
are
welcome to change it and/or distribute copies of it under certain
conditions.
Type “show copying” to see the conditions.
There is absolutely no warranty for GDB.  Type “show warranty” for
details.
This GDB was configured as “i386-suse-linux”…
(gdb) l     <——————–
l命令相当于list,从第3行开头例出原码。
1        #include <stdio.h>
2
3        int func(int n)
4        {
5                int sum=0,i;
6                for(i=0; i<n; i++)
7                {
8                        sum+=i;
9                }
10               return sum;
(gdb)       <——————– 直接回车表示,重复上贰遍命令
11       }
12
13
14       main()
15       {
16               int i;
17               long result = 0;
18               for(i=1; i<=100; i++)
19               {
20                       result += i;    
(gdb) break 16    <——————–
设置断点,在源程序第叁6行处。
Breakpoint 1 at 0x8048496: file tst.c, line 16.
(gdb) break func  <——————–
设置断点,在函数func()入口处。
Breakpoint 2 at 0x8048456: file tst.c, line 5.
(gdb) info break  <——————– 查看断点音讯。
Num Type           Disp Enb Address    What
1   breakpoint     keep y   0x08048496 in main at tst.c:16
2   breakpoint     keep y   0x08048456 in func at tst.c:5
(gdb) r           <——————— 运维程序,run命令简写
Starting program: /home/hchen/test/tst

用GDB调节和测试程序,解决gdb运转文件报错During。hchen/test> gdb tst 
<———- 启动GDB
GNU gdb 5.1.1
Copyright 2002 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you
are
welcome to change it and/or distribute copies of it under certain
conditions.
Type “show copying” to see the conditions.
There is absolutely no warranty for GDB.  Type “show warranty” for
details.
This GDB was configured as “i386-suse-linux”…
(gdb) l     <——————–
l命令约等于list,从第3行初始例出原码。
1        #include <stdio.h>
2
3        int func(int n)
4        {
5                int sum=0,i;
6                for(i=0; i<n; i++)
7                {
8                        sum+=i;
9                }
10               return sum;
(gdb)       <——————– 直接回车表示,重复上一次命令
11       }
12
13
14       main()
15       {
16               int i;
17               long result = 0;
18               for(i=1; i<=100; i++)
19               {
20                       result += i;    
(gdb) break 16    <——————–
设置断点,在源程序第③6行处。
Breakpoint 1 at 0x8048496: file tst.c, line 16.
(gdb) break func  <——————–
设置断点,在函数func()入口处。
Breakpoint 2 at 0x8048456: file tst.c, line 5.
(gdb) info break  <——————– 查看断点音信。
Num Type           Disp Enb Address    What
1   breakpoint     keep y   0x08048496 in main at tst.c:16
2   breakpoint     keep y   0x08048456 in func at tst.c:5
(gdb) r           <——————— 运维程序,run命令简写
Starting program: /home/hchen/test/tst

 

源程序:tst.c

Breakpoint 1, main ()
at tst.c:17    <———- 在断点处停住。
17               long result = 0;
(gdb) n          <———————
单条语句执行,next命令简写。
18               for(i=1; i<=100; i++)
(gdb) n
20                       result += i;
(gdb) n
18               for(i=1; i<=100; i++)
(gdb) n
20                       result += i;
(gdb) c          <———————
继续运营程序,continue命令简写。
Continuing.
result[1-100] = 5050       <———-程序输出。

Breakpoint 1, main () at
tst.c:17    <———- 在断点处停住。
17               long result = 0;
(gdb) n          <———————
单条语句执行,next命令简写。
18               for(i=1; i<=100; i++)
(gdb) n
20                       result += i;
(gdb) n
18               for(i=1; i<=100; i++)
(gdb) n
20                       result += i;
(gdb) c          <———————
继续运营程序,continue命令简写。
Continuing.
result[1-100] = 5050       <———-程序输出。

澳门金沙国际 3

1 #include

Breakpoint 2, func
(n=250) at tst.c:5
5                int sum=0,i;
(gdb) n
6                for(i=1; i<=n; i++)
(gdb) p i        <———————
打印变量i的值,print命令简写。
$1 = 134513808
(gdb) n
8                        sum+=i;
(gdb) n
6                for(i=1; i<=n; i++)
(gdb) p sum
$2 = 1
(gdb) n
8                        sum+=i;
(gdb) p i
$3 = 2
(gdb) n
6                for(i=1; i<=n; i++)
(gdb) p sum
$4 = 3
(gdb) bt        <——————— 查看函数堆栈。
#0  func (n=250) at tst.c:5
#1  0x080484e4 in main () at tst.c:24
#2  0x400409ed in __libc_start_main () from /lib/libc.so.6
(gdb) finish    <——————— 退出函数。
Run till exit from #0  func (n=250) at tst.c:5
0x080484e4 in main () at tst.c:24
24              printf(“result[1-250] = %d /n”, func(250) );
Value returned is $6 = 31375
(gdb) c     <——————— 继续运营。
Continuing.
result[1-250] = 31375    <———-程序输出。

Breakpoint 2, func (n=250) at
tst.c:5
5                int sum=0,i;
(gdb) n
6                for(i=1; i<=n; i++)
(gdb) p i        <———————
打字与印刷变量i的值,print命令简写。
$1 = 134513808
(gdb) n
8                        sum+=i;
(gdb) n
6                for(i=1; i<=n; i++)
(gdb) p sum
$2 = 1
(gdb) n
8                        sum+=i;
(gdb) p i
$3 = 2
(gdb) n
6                for(i=1; i<=n; i++)
(gdb) p sum
$4 = 3
(gdb) bt        <——————— 查看函数堆栈。
#0  func (n=250) at tst.c:5
#1  0x080484e4 in main () at tst.c:24
#2  0x400409ed in __libc_start_main () from /lib/libc.so.6
(gdb) finish    <——————— 退出函数。
Run till exit from #0  func (n=250) at tst.c:5
0x080484e4 in main () at tst.c:24
24              printf(“result[1-250] = %d /n”, func(250) );
Value returned is $6 = 31375
(gdb) c     <——————— 继续运营。
Continuing.
result[1-250]澳门金沙国际 , = 31375    <———-程序输出。

 

2

Program exited with
code 027. <——–程序退出,调节和测试完毕。
(gdb) q     <——————— 退出gdb。
hchen/test>

Program exited with code 027.
<——–程序退出,调节和测试达成。
(gdb) q     <——————— 退出gdb。
hchen/test>

 
参考资料:c++ – gdb During startup program exited with code 127 – Stack
Overflow

3 int func(int n)

好了,有了以上的感觉认识,依然让大家来系统地认识一下gdb吧。

好了,有了以上的感性认识,依旧让大家来系统地认识一下gdb吧。

 

4 {

 

 

5         int sum=0,i;

使用GDB
————

使用GDB
————

6         for(i=0; i

相似的话GDB主要调节和测试的是C/C++的次序。要调节C/C++的次第,首先在编写翻译时,大家要求求把调节和测试消息加到可执行文件中。使用编写翻译器(cc/gcc/g++)的
-g 参数能够做到这或多或少。如:

诚如的话GDB首要调试的是C/C++的顺序。要调节C/C++的先后,首先在编写翻译时,大家亟须要把调试消息加到可执行文件中。使用编译器(cc/gcc/g++)的
-g 参数能够形成那点。如:

7         {

    > cc -g
hello.c -o hello
    > g++ -g hello.cpp -o hello

    > cc -g hello.c -o
hello
    > g++ -g hello.cpp -o hello

8                 sum+=i;

假若没有-g,你将看不见程序的函数名、变量名,所代表的全是运作时的内部存款和储蓄器地址。当你用-g把调节和测试新闻参加之后,并成功编写翻译目的代码以往,让我们来探视怎样用gdb来调节他。

若是没有-g,你将看不见程序的函数名、变量名,所取代的全是运营时的内部存款和储蓄器地址。当您用-g把调试音信参预之后,并打响编写翻译目的代码未来,让大家来探望哪些用gdb来调节他。

9         }

运维GDB的格局有以下二种:

运行GDB的主意有以下三种:

10         return sum;

    1、gdb
<program> 
       program也正是你的履行文书,一般在自然目录下。

    1、gdb <program> 
       program也正是你的履行文书,一般在本来目录下。

11 }

    2、gdb
<program> core
       用gdb同时调节和测试二个运营程序和core文件,core是先后违法执行后core
dump后发出的公文。

    2、gdb <program>
core
       用gdb同时调节和测试一个周转程序和core文件,core是程序违法执行后core
dump后发出的文书。

12

    3、gdb
<program> <PID>
      
如若你的先后是二个服务程序,那么您能够钦赐这几个服务程序运行时的经过ID。gdb会自动attach上去,并调节他。program应该在PATH环境变量中检索得到。

    3、gdb <program>
<PID>
      
倘诺你的次第是3个服务程序,那么您能够钦命这几个服务程序运维时的进度ID。gdb会自动attach上去,并调节和测试他。program应该在PATH环境变量中找找获得。

13

 

 

14 main()

GDB运转时,能够增进一些GDB的启航开关,详细的开关可以用gdb
-help查看。小编在底下只例举一些比较常用的参数:

GDB运维时,能够拉长有的GDB的运营开关,详细的开关可以用gdb
-help查看。笔者在底下只例举一些比较常用的参数:

15 {

    -symbols
<file> 
    -s <file> 
    从内定文件中读取符号表。

    -symbols <file> 
    -s <file> 
    从钦点文件中读取符号表。

16         int i;

    -se file 
    从钦点文件中读取符号表音信,并把她用在可执行文件中。

    -se file 
    从钦定文件中读取符号表音信,并把他用在可执行文件中。

17         long result = 0;

    -core
<file>
    -c <file> 
    调试时core dump的core文件。

    -core <file>
    -c <file> 
    调试时core dump的core文件。

18         for(i=1; i<=100; i++)

    -directory
<directory>
    -d <directory>
   
参预三个源文件的物色路径。暗中认可搜索路径是环境变量中PATH所定义的路子。

    -directory
<directory>
    -d <directory>
   
参预三个源文件的寻找路径。暗中同意搜索路径是环境变量中PATH所定义的门路。

19         {

 

20                 result += i;

转载: 

21         }

22

23        printf(“result[1-100] = %d /n”, result );

24        printf(“result[1-250] = %d /n”, func(250) );

25 }

编写翻译生成执行文书:(Linux下)

hchen/test> cc -g tst.c -o tst

使用GDB调试:

hchen/test> gdb tst  <———- 启动GDB

GNU gdb 5.1.1

Copyright 2002 Free Software Foundation, Inc.

GDB is free software, covered by the GNU General Public License, and you
are

welcome to change it and/or distribute copies of it under certain
conditions.

Type “show copying” to see the conditions.

There is absolutely no warranty for GDB.  Type “show warranty” for
details.

This GDB was configured as “i386-suse-linux”…

(gdb) l     <——————–
l命令也就是list,从第贰行开首例出原码。

1        #include

2

3        int func(int n)

4        {

5                int sum=0,i;

6                for(i=0; i

7                {

8                        sum+=i;

9                }

10               return sum;

(gdb)       <——————– 直接回车表示,重复上3回命令

11       }

12

13

14       main()

15       {

16               int i;

17               long result = 0;

18               for(i=1; i<=100; i++)

19               {

20                       result += i;

(gdb) break 16    <——————– 设置断点,在源程序第②6行处。

Breakpoint 1 at 0x8048496: file tst.c, line 16.

(gdb) break func  <——————–
设置断点,在函数func()入口处。

Breakpoint 2 at 0x8048456: file tst.c, line 5.

(gdb) info break  <——————– 查看断点信息。

Num Type           Disp Enb Address    What

1   breakpoint     keep y   0x08048496 in main at tst.c:16

2   breakpoint     keep y   0x08048456 in func at tst.c:5

(gdb) r           <——————— 运转程序,run命令简写

Starting program: /home/hchen/test/tst

Breakpoint 1, main () at tst.c:17    <———- 在断点处停住。

17               long result = 0;

(gdb) n          <——————— 单条语句执行,next命令简写。

18               for(i=1; i<=100; i++)

(gdb) n

20                       result += i;

(gdb) n

18               for(i=1; i<=100; i++)

(gdb) n

20                       result += i;

(gdb) c          <———————
继续运转程序,continue命令简写。

Continuing.

result[1-100] = 5050       <———-程序输出。

Breakpoint 2, func (n=250) at tst.c:5

5                int sum=0,i;

(gdb) n

6                for(i=1; i<=n; i++)

(gdb) p i        <———————
打字与印刷变量i的值,print命令简写。

$1 = 134513808

(gdb) n

8                        sum+=i;

(gdb) n

6                for(i=1; i<=n; i++)

(gdb) p sum

$2 = 1

(gdb) n

8                        sum+=i;

(gdb) p i

$3 = 2

(gdb) n

6                for(i=1; i<=n; i++)

(gdb) p sum

$4 = 3

(gdb) bt        <——————— 查看函数堆栈。

#0  func (n=250) at tst.c:5

#1  0x080484e4 in main () at tst.c:24

#2  0x400409ed in __libc_start_main () from /lib/libc.so.6

(gdb) finish    <——————— 退出函数。

Run till exit from #0  func (n=250) at tst.c:5

0x080484e4 in main () at tst.c:24

24              printf(“result[1-250] = %d /n”, func(250) );

Value returned is $6 = 31375

(gdb) c     <——————— 继续运维。

Continuing.

result[1-250] = 31375    <———-程序输出。

Program exited with code 027. <——–程序退出,调节和测试实现。

(gdb) q     <——————— 退出gdb。

hchen/test>

好了,有了以上的感觉认识,如故让大家来系统地认识一下gdb吧。

使用GDB

————

诚如的话GDB首要调节和测试的是C/C++的次序。要调节C/C++的次序,首先在编写翻译时,大家务须求把调节和测试消息加到可执行文件中。使用编写翻译器(cc/gcc/g++)的
-g 参数可以做到那或多或少。如:

> cc -g hello.c -o hello

> g++ -g hello.cpp -o hello

若果没有-g,你将看不见程序的函数名、变量名,所代表的全是运作时的内部存款和储蓄器地址。当您用-g把调节和测试音讯参预之后,并成功编写翻译指标代码以往,让我们来看看哪些用gdb来调节他。

开发银行GDB的法子有以下两种:

1、gdb

program也正是您的实施文书,一般在本来目录下。

2、gdb core

用gdb同时调节和测试3个运转程序和core文件,core是程序非法执行后core
dump后产生的公文。

3、gdb

只要您的主次是多少个服务程序,那么你可以钦命那么些服务程序运营时的历程ID。gdb会自动attach上去,并调节和测试他。program应该在PATH环境变量中寻找获得。

GDB运营时,能够添加一些GDB的启航开关,详细的开关能够用gdb
-help查看。小编在底下只例举一些比较常用的参数:

-symbols

-s

从钦命文件中读取符号表。

-se file

从钦赐文件中读取符号表音信,并把她用在可执行文件中。

-core

-c

调试时core dump的core文件。

-directory

-d

进入贰个源文件的搜寻路径。私下认可搜索路径是环境变量中PATH所定义的路径。

相关文章