gdb调试的基本使用

gdb调试的基本使用https www cnblogs com HKUI p 8955443 htmlGDB 调试启动程序准备调试 GDByourpram 或者先输入 GDB 然后输入 nbsp fileyourpram 然后使用 run 或者 r 命令开始程序的执行 也可以使用 runparameter 将参数传递给该程序参数列表命令命令缩写

https://www.cnblogs.com/HKUI/p/8955443.html

然后使用run或者r命令开始程序的执行,也可以使用 run parameter将参数传递给该程序

参数列表

命令

命令缩写

命令说明

list

l

显示多行源代码

break

b

设置断点,程序运行到断点的位置会停下来

info

i

描述程序的状态

run

r

开始运行程序

display

disp

跟踪查看某个变量,每次停下来都显示它的值

step

s

执行下一条语句,如果该语句为函数调用,则进入函数执行其中的第一条语句

next

n

执行下一条语句,如果该语句为函数调用,不会进入函数内部执行(即不会一步步地调试函数内部语句)

print

p

打印内部变量值

continue

c

继续程序的运行,直到遇到下一个断点

set var name=v

 

设置变量的值

start

st

开始执行程序,main函数的第一条语句前面停下来

file

 

装入需要调试的程序

kill

k

终止正在调试的程序

watch

 

监视变量值的变化

backtrace

bt

产看函数调用信息(堆栈)

frame

f

查看栈帧

quit

q

退出GDB环境

 

  

复制代码
//e.c #include 
   
   void debug( 
   char * 
   str) { printf( 
   " 
   debug info :%s\n 
   " 
   ,str ); } main( 
   int argc, 
   char * 
   argv[]){  
   int 
    i,j; j= 
   0 
   ;  
   for(i= 
   0;i< 
   10;i++ 
   ){ j+= 
   5 
   ; printf( 
   " 
   now a=%d\n 
   " 
   , j); } } 
  
复制代码

list 命令用法

list命令显示多行源代码,从上次的位置开始显示,默认情况下,一次显示10行,第一次使用时,从代码其实位置显示

复制代码
gdb) list 1 #include 
   
   2 
   void debug( 
   char * 
   str)  
   3 
    {  
   4 printf( 
   " 
   debug info :%s\n 
   " 
   ,str );  
   5 
    }  
   6 main( 
   int argc, 
   char * 
   argv[]){  
   7 
   int 
    i,j;  
   8 j= 
   0 
   ;  
   9 
   for(i= 
   0;i< 
   10;i++ 
   ){  
   10 j+= 
   5 
   ; (gdb)  
  
复制代码

list n显示已第n行未中心的10行代码

复制代码
(gdb) list 8 3 { 4 printf("debug info :%s\n",str ); 5 } 6 main(int argc,char *argv[]){ 7 int i,j; 8 j=0; 9 for(i=0;i<10;i++){ 10 j+=5; 11 printf("now a=%d\n", j); 12 } (gdb) 
复制代码

list functionname显示以functionname的函数为中心的10行代码

复制代码
(gdb) list main 1 #include 
   
   2 
   void debug( 
   char * 
   str)  
   3 
    {  
   4 printf( 
   " 
   debug info :%s\n 
   " 
   ,str );  
   5 
    }  
   6 main( 
   int argc, 
   char * 
   argv[]){  
   7 
   int 
    i,j;  
   8 j= 
   0 
   ;  
   9 
   for(i= 
   0;i< 
   10;i++ 
   ){  
   10 j+= 
   5 
   ; (gdb)  
  
复制代码

list – 显示刚才打印过的源代码之前的代码

复制代码
(gdb) list 10 5 } 6 main(int argc,char *argv[]){ 7 int i,j; 8 j=0; 9 for(i=0;i<10;i++){ 10 j+=5; 11 printf("now a=%d\n", j); 12 } 13 }(gdb) list - 1 #include 
   
   2 
   void debug( 
   char * 
   str)  
   3 
    {  
   4 printf( 
   " 
   debug info :%s\n 
   " 
   ,str ); (gdb)  
  
复制代码
gdb调试的基本使用

复制代码
gdb) list
1    #include 
    
   
    
    
    
    
    

     
    
     
     
     
     
     2    
     
    
     
     
     
     
     void debug(
     
    
     
     
     
     
     char *
     
    
     
     
     
     
     str) 
     
    
     
     
     
     
     3
     
    
     
     
     
     
      { 
     
    
     
     
     
     
     4        printf(
     
    
     
     
     
     
     "
     
    
     
     
     
     
     debug info :%s\n
     
    
     
     
     
     
     "
     
    
     
     
     
     
     ,str ); 
     
    
     
     
     
     
     5
     
    
     
     
     
     
      } 
     
    
     
     
     
     
     6    main(
     
    
     
     
     
     
     int argc,
     
    
     
     
     
     
     char *
     
    
     
     
     
     
     argv[]){ 
     
    
     
     
     
     
     7        
     
    
     
     
     
     
     int
     
    
     
     
     
     
      i,j; 
     
    
     
     
     
     
     8        j=
     
    
     
     
     
     
     0
     
    
     
     
     
     
     ; 
     
    
     
     
     
     
     9        
     
    
     
     
     
     
     for(i=
     
    
     
     
     
     
     0;i<
     
    
     
     
     
     
     10;i++
     
    
     
     
     
     
     ){ 
     
    
     
     
     
     
     10            j+=
     
    
     
     
     
     
     5
     
    
     
     
     
     
     ; (gdb) 
     
    
     
     
     
     
     11            printf(
     
    
     
     
     
     
     "
     
    
     
     
     
     
     now a=%d\n
     
    
     
     
     
     
     "
     
    
     
     
     
     
     , j); 
     
    
     
     
     
     
     12
     
    
     
     
     
     
      } 
     
    
     
     
     
     
     13    }(gdb) 
     
    
     
     
     
     
     break 
     
    
     
     
     
     
     10
     
    
     
     
     
     
      Breakpoint 
     
    
     
     
     
     
     1 at 
     
    
     
     
     
     
     0x40050a: file e.c, line 
     
    
     
     
     
     
     10
     
    
     
     
     
     
     . (gdb) r Starting program: /mnt/hgfs/www/c/gcc/
     
    
     
     
     
     
     e Breakpoint 
     
    
     
     
     
     
     1, main (argc=
     
    
     
     
     
     
     1, argv=
     
    
     
     
     
     
     0x7fffffffe548) at e.c:
     
    
     
     
     
     
     10

     
    
     
     
     
     
     10            j+=
     
    
     
     
     
     
     5
     
    
     
     
     
     
     ; (gdb) c Continuing. now a=
     
    
     
     
     
     
     5
     
    
     
     
     
     
      Breakpoint 
     
    
     
     
     
     
     1, main (argc=
     
    
     
     
     
     
     1, argv=
     
    
     
     
     
     
     0x7fffffffe548) at e.c:
     
    
     
     
     
     
     10

     
    
     
     
     
     
     10            j+=
     
    
     
     
     
     
     5
     
    
     
     
     
     
     ; (gdb) c Continuing. now a=
     
    
     
     
     
     
     10
     
    
     
     
     
     
      Breakpoint 
     
    
     
     
     
     
     1, main (argc=
     
    
     
     
     
     
     1, argv=
     
    
     
     
     
     
     0x7fffffffe548) at e.c:
     
    
     
     
     
     
     10

     
    
     
     
     
     
     10            j+=
     
    
     
     
     
     
     5
     
    
     
     
     
     
     ; (gdb) 
    
   
    
    
    
    
    
复制代码

使用delete breakpoints 断点号 删除断点
这里的断点号表示的是第几个断点,刚才执行break 10返回 reakpoint 1 at 0x40050a: file e.c, line 10.
中的1表示该断点的标号,因此使用 delete breakpoints 1表示删除第10行所定义的断点
clear n表示清除第n行的断点,因此clear 10等同于delete breakpoints 1
disable/enable n表示使得编号为n的断点暂时失效或有效
可使用info查看断点相关的信息
info breakpoints












复制代码
gdb) info breakpoints No breakpoints or watchpoints. (gdb) break 10 Breakpoint 2 at 0x40050a: file e.c, line 10. (gdb) break 9 Breakpoint 3 at 0x: file e.c, line 9. (gdb) info breakpoints Num Type Disp Enb Address What 2 breakpoint keep y 0x000000000040050a in main at e.c:10 3 breakpoint keep y 0x0000000000 in main at e.c:9
复制代码

display命令
查看参数的值

gdb调试的基本使用

复制代码
(gdb) break 10
Breakpoint 1 at 0x40050a: file e.c, line 10.
(gdb) r
Starting program: /mnt/hgfs/www/c/gcc/e 

Breakpoint 1, main (argc=1, argv=0x7fffffffe548) at e.c:10
10            j+=5;
(gdb) display j
1: j = 0
(gdb) c
Continuing.
now a=5

Breakpoint 1, main (argc=1, argv=0x7fffffffe548) at e.c:10
10            j+=5;
1: j = 5
(gdb) display
1: j = 5
(gdb) display i
2: i = 1
(gdb) display j
3: j = 5
(gdb) display j*2
4: j*2 = 10
(gdb) info display
Auto-display expressions now in effect:
Num Enb Expression
4:   y  j*2
3:   y  j
2:   y  i
1:   y  j
复制代码

也可以使用disable,enable,delete,info命令修改及查看其状态,用法与对断点的一样

step及next命令
step可使得程序逐条执行,即执行完一条语句然后在吓一跳语句前停下来,等待用户的命令
一般使用step命令是,可使用display或者watch命令查看变量的变化,从而判断程序行为是否符合要求
当下一条指令为函数时,s进入函数内部,在其第一条语句前停下来
step n,next n 表示连续但不执行n条指令,如果期间遇到断点,则停下来








gdb调试的基本使用

复制代码
(gdb) list
1    #include 
    
   
    
    
    
    
    

     
    
     
     
     
     
     2    
     
    
     
     
     
     
     void debug(
     
    
     
     
     
     
     char *
     
    
     
     
     
     
     str) 
     
    
     
     
     
     
     3
     
    
     
     
     
     
      { 
     
    
     
     
     
     
     4        printf(
     
    
     
     
     
     
     "
     
    
     
     
     
     
     debug info :%s\n
     
    
     
     
     
     
     "
     
    
     
     
     
     
     ,str ); 
     
    
     
     
     
     
     5
     
    
     
     
     
     
      } 
     
    
     
     
     
     
     6    

     
    
     
     
     
     
     7    main(
     
    
     
     
     
     
     int argc,
     
    
     
     
     
     
     char *
     
    
     
     
     
     
     argv[]){ 
     
    
     
     
     
     
     8        
     
    
     
     
     
     
     int
     
    
     
     
     
     
      i,j; 
     
    
     
     
     
     
     9        j=
     
    
     
     
     
     
     0
     
    
     
     
     
     
     ; 
     
    
     
     
     
     
     10        
     
    
     
     
     
     
     for(i=
     
    
     
     
     
     
     0;i<
     
    
     
     
     
     
     10;i++
     
    
     
     
     
     
     ){ (gdb) 
     
    
     
     
     
     
     11            j+=
     
    
     
     
     
     
     5
     
    
     
     
     
     
     ; 
     
    
     
     
     
     
     12            printf(
     
    
     
     
     
     
     "
     
    
     
     
     
     
     now j=%d\n
     
    
     
     
     
     
     "
     
    
     
     
     
     
     , j); 
     
    
     
     
     
     
     13            debug(
     
    
     
     
     
     
     "
     
    
     
     
     
     
     x=======x
     
    
     
     
     
     
     "
     
    
     
     
     
     
     ); 
     
    
     
     
     
     
     14
     
    
     
     
     
     
      } 
     
    
     
     
     
     
     15
     
    
     
     
     
     
      }(gdb) Line number 
     
    
     
     
     
     
     16 
     
    
     
     
     
     
     out of range; e.c has 
     
    
     
     
     
     
     15
     
    
     
     
     
     
      lines. (gdb) 
     
    
     
     
     
     
     break 
     
    
     
     
     
     
     11
     
    
     
     
     
     
      Breakpoint 
     
    
     
     
     
     
     1 at 
     
    
     
     
     
     
     0x40050a: file e.c, line 
     
    
     
     
     
     
     11
     
    
     
     
     
     
     . (gdb) r Starting program: /mnt/hgfs/www/c/gcc/
     
    
     
     
     
     
     e1 Breakpoint 
     
    
     
     
     
     
     1, main (argc=
     
    
     
     
     
     
     1, argv=
     
    
     
     
     
     
     0x7fffffffe538) at e.c:
     
    
     
     
     
     
     11

     
    
     
     
     
     
     11            j+=
     
    
     
     
     
     
     5
     
    
     
     
     
     
     ; (gdb) s 
     
    
     
     
     
     
     12            printf(
     
    
     
     
     
     
     "
     
    
     
     
     
     
     now j=%d\n
     
    
     
     
     
     
     "
     
    
     
     
     
     
     , j); (gdb) s __printf (format=
     
    
     
     
     
     
     0x400648 
     
    
     
     
     
     
     "
     
    
     
     
     
     
     now j=%d\n
     
    
     
     
     
     
     ") at printf.c:
     
    
     
     
     
     
     30

     
    
     
     
     
     
     30
     
    
     
     
     
     
      { (gdb) bt #
     
    
     
     
     
     
     0  __printf (format=
     
    
     
     
     
     
     0x400648 
     
    
     
     
     
     
     "
     
    
     
     
     
     
     now j=%d\n
     
    
     
     
     
     
     ") at printf.c:
     
    
     
     
     
     
     30
     
    
     
     
     
     
      #
     
    
     
     
     
     
     1  
     
    
     
     
     
     
     0x0000000000400525 
     
    
     
     
     
     
     in main (argc=
     
    
     
     
     
     
     1, argv=
     
    
     
     
     
     
     0x7fffffffe538) at e.c:
     
    
     
     
     
     
     12
     
    
     
     
     
     
      (gdb) n 
     
    
     
     
     
     
     34
     
    
     
     
     
     
      va_start (arg, format); (gdb) n 
     
    
     
     
     
     
     35      done =
     
    
     
     
     
     
      vfprintf (stdout, format, arg); (gdb) n now j=
     
    
     
     
     
     
     5

     
    
     
     
     
     
     39
     
    
     
     
     
     
      } (gdb) bt #
     
    
     
     
     
     
     0  __printf (format=
     
    
     
     
     
     
     
       out>) at printf.c: 
      39 
       # 
      1 
      0x0000000000400525 
      in main (argc= 
      1, argv= 
      0x7fffffffe538) at e.c: 
      12 
       (gdb) n main (argc= 
      1, argv= 
      0x7fffffffe538) at e.c: 
      13 
      13 debug( 
      " 
      x=======x 
      " 
      ); (gdb) n debug info :x======= 
      x  
      10 
      for(i= 
      0;i< 
      10;i++ 
      ){ (gdb) s Breakpoint  
      1, main (argc= 
      1, argv= 
      0x7fffffffe538) at e.c: 
      11 
      11 j+= 
      5 
      ; (gdb) s  
      12 printf( 
      " 
      now j=%d\n 
      " 
      , j); (gdb) n now j= 
      10 
      13 debug( 
      " 
      x=======x 
      " 
      ); (gdb) n debug info :x======= 
      x  
      10 
      for(i= 
      0;i< 
      10;i++ 
      ){ (gdb)  
     
    
   
    
    
    
    
    
复制代码

watch
watch可设置观察点(watchpoint)。使用观察点可以使得当某表达式的值发生变化时,程序暂停执行。
执行该命令前,必须保证程序已经运行




gdb调试的基本使用

复制代码
(gdb) list 
1    #include 
    
   
    
    
    
    
    

     
    
     
     
     
     
     2    
     
    
     
     
     
     
     void debug(
     
    
     
     
     
     
     char *
     
    
     
     
     
     
     str) 
     
    
     
     
     
     
     3
     
    
     
     
     
     
      { 
     
    
     
     
     
     
     4        printf(
     
    
     
     
     
     
     "
     
    
     
     
     
     
     debug info :%s\n
     
    
     
     
     
     
     "
     
    
     
     
     
     
     ,str ); 
     
    
     
     
     
     
     5
     
    
     
     
     
     
      } 
     
    
     
     
     
     
     6    

     
    
     
     
     
     
     7    main(
     
    
     
     
     
     
     int argc,
     
    
     
     
     
     
     char *
     
    
     
     
     
     
     argv[]){ 
     
    
     
     
     
     
     8        
     
    
     
     
     
     
     int
     
    
     
     
     
     
      i,j; 
     
    
     
     
     
     
     9        j=
     
    
     
     
     
     
     0
     
    
     
     
     
     
     ; 
     
    
     
     
     
     
     10        
     
    
     
     
     
     
     for(i=
     
    
     
     
     
     
     0;i<
     
    
     
     
     
     
     10;i++
     
    
     
     
     
     
     ){ (gdb) 
     
    
     
     
     
     
     11            j+=
     
    
     
     
     
     
     5
     
    
     
     
     
     
     ; 
     
    
     
     
     
     
     12            printf(
     
    
     
     
     
     
     "
     
    
     
     
     
     
     now j=%d\n
     
    
     
     
     
     
     "
     
    
     
     
     
     
     , j); 
     
    
     
     
     
     
     13            debug(
     
    
     
     
     
     
     "
     
    
     
     
     
     
     x=======x
     
    
     
     
     
     
     "
     
    
     
     
     
     
     ); 
     
    
     
     
     
     
     14
     
    
     
     
     
     
      } 
     
    
     
     
     
     
     15
     
    
     
     
     
     
      }(gdb) Line number 
     
    
     
     
     
     
     16 
     
    
     
     
     
     
     out of range; e.c has 
     
    
     
     
     
     
     15
     
    
     
     
     
     
      lines. (gdb) b main Breakpoint 
     
    
     
     
     
     
     1 at 
     
    
     
     
     
     
     0x4004fa: file e.c, line 
     
    
     
     
     
     
     9
     
    
     
     
     
     
     . (gdb) r Starting program: /mnt/hgfs/www/c/gcc/
     
    
     
     
     
     
     e1 Breakpoint 
     
    
     
     
     
     
     1, main (argc=
     
    
     
     
     
     
     1, argv=
     
    
     
     
     
     
     0x7fffffffe538) at e.c:
     
    
     
     
     
     
     9

     
    
     
     
     
     
     9        j=
     
    
     
     
     
     
     0
     
    
     
     
     
     
     ; (gdb) watch j Hardware watchpoint 
     
    
     
     
     
     
     2
     
    
     
     
     
     
     : j (gdb) c Continuing. Hardware watchpoint 
     
    
     
     
     
     
     2
     
    
     
     
     
     
     : j Old value = 
     
    
     
     
     
     
     0
     
    
     
     
     
     
      New value = 
     
    
     
     
     
     
     5
     
    
     
     
     
     
      main (argc=
     
    
     
     
     
     
     1, argv=
     
    
     
     
     
     
     0x7fffffffe538) at e.c:
     
    
     
     
     
     
     12

     
    
     
     
     
     
     12            printf(
     
    
     
     
     
     
     "
     
    
     
     
     
     
     now j=%d\n
     
    
     
     
     
     
     "
     
    
     
     
     
     
     , j); (gdb) c Continuing. now j=
     
    
     
     
     
     
     5
     
    
     
     
     
     
      debug info :x=======
     
    
     
     
     
     
     x Hardware watchpoint 
     
    
     
     
     
     
     2
     
    
     
     
     
     
     : j Old value = 
     
    
     
     
     
     
     5
     
    
     
     
     
     
      New value = 
     
    
     
     
     
     
     10
     
    
     
     
     
     
      main (argc=
     
    
     
     
     
     
     1, argv=
     
    
     
     
     
     
     0x7fffffffe538) at e.c:
     
    
     
     
     
     
     12

     
    
     
     
     
     
     12            printf(
     
    
     
     
     
     
     "
     
    
     
     
     
     
     now j=%d\n
     
    
     
     
     
     
     ", j);
    
   
    
    
    
    
    
复制代码

print命令

gdb调试的基本使用

复制代码
(gdb) list
1    #include 
    
   
    
    
    
    
    

     
    
     
     
     
     
     2    
     
    
     
     
     
     
     void debug(
     
    
     
     
     
     
     char *
     
    
     
     
     
     
     str) 
     
    
     
     
     
     
     3
     
    
     
     
     
     
      { 
     
    
     
     
     
     
     4        printf(
     
    
     
     
     
     
     "
     
    
     
     
     
     
     debug info :%s\n
     
    
     
     
     
     
     "
     
    
     
     
     
     
     ,str ); 
     
    
     
     
     
     
     5
     
    
     
     
     
     
      } 
     
    
     
     
     
     
     6    

     
    
     
     
     
     
     7    main(
     
    
     
     
     
     
     int argc,
     
    
     
     
     
     
     char *
     
    
     
     
     
     
     argv[]){ 
     
    
     
     
     
     
     8        
     
    
     
     
     
     
     int
     
    
     
     
     
     
      i,j; 
     
    
     
     
     
     
     9        j=
     
    
     
     
     
     
     0
     
    
     
     
     
     
     ; 
     
    
     
     
     
     
     10        
     
    
     
     
     
     
     for(i=
     
    
     
     
     
     
     0;i<
     
    
     
     
     
     
     10;i++
     
    
     
     
     
     
     ){ (gdb) 
     
    
     
     
     
     
     11            j+=
     
    
     
     
     
     
     5
     
    
     
     
     
     
     ; 
     
    
     
     
     
     
     12            printf(
     
    
     
     
     
     
     "
     
    
     
     
     
     
     now j=%d\n
     
    
     
     
     
     
     "
     
    
     
     
     
     
     , j); 
     
    
     
     
     
     
     13            debug(
     
    
     
     
     
     
     "
     
    
     
     
     
     
     x=======x
     
    
     
     
     
     
     "
     
    
     
     
     
     
     ); 
     
    
     
     
     
     
     14
     
    
     
     
     
     
      } 
     
    
     
     
     
     
     15
     
    
     
     
     
     
      }(gdb) Line number 
     
    
     
     
     
     
     16 
     
    
     
     
     
     
     out of range; e.c has 
     
    
     
     
     
     
     15
     
    
     
     
     
     
      lines. (gdb) 
     
    
     
     
     
     
     break 
     
    
     
     
     
     
     12
     
    
     
     
     
     
      Breakpoint 
     
    
     
     
     
     
     1 at 
     
    
     
     
     
     
     0x40050e: file e.c, line 
     
    
     
     
     
     
     12
     
    
     
     
     
     
     . (gdb) r Starting program: /mnt/hgfs/www/c/gcc/
     
    
     
     
     
     
     e1 Breakpoint 
     
    
     
     
     
     
     1, main (argc=
     
    
     
     
     
     
     1, argv=
     
    
     
     
     
     
     0x7fffffffe538) at e.c:
     
    
     
     
     
     
     12

     
    
     
     
     
     
     12            printf(
     
    
     
     
     
     
     "
     
    
     
     
     
     
     now j=%d\n
     
    
     
     
     
     
     "
     
    
     
     
     
     
     , j); (gdb) p j $
     
    
     
     
     
     
     1 = 
     
    
     
     
     
     
     5
     
    
     
     
     
     
      (gdb) c Continuing. now j=
     
    
     
     
     
     
     5
     
    
     
     
     
     
      debug info :x=======
     
    
     
     
     
     
     x Breakpoint 
     
    
     
     
     
     
     1, main (argc=
     
    
     
     
     
     
     1, argv=
     
    
     
     
     
     
     0x7fffffffe538) at e.c:
     
    
     
     
     
     
     12

     
    
     
     
     
     
     12            printf(
     
    
     
     
     
     
     "
     
    
     
     
     
     
     now j=%d\n
     
    
     
     
     
     
     "
     
    
     
     
     
     
     , j); (gdb) p i,j $
     
    
     
     
     
     
     2 = 
     
    
     
     
     
     
     10
     
    
     
     
     
     
      (gdb) p j $
     
    
     
     
     
     
     3 = 
     
    
     
     
     
     
     10
     
    
     
     
     
     
      (gdb) 
    
   
    
    
    
    
    
复制代码

set var name=value
在程序运行中动态改变变量的值

gdb调试的基本使用

复制代码
(gdb) list
1    #include 
    
   
    
    
    
    
    

     
    
     
     
     
     
     2    
     
    
     
     
     
     
     void debug(
     
    
     
     
     
     
     char *
     
    
     
     
     
     
     str) 
     
    
     
     
     
     
     3
     
    
     
     
     
     
      { 
     
    
     
     
     
     
     4        printf(
     
    
     
     
     
     
     "
     
    
     
     
     
     
     debug info :%s\n
     
    
     
     
     
     
     "
     
    
     
     
     
     
     ,str ); 
     
    
     
     
     
     
     5
     
    
     
     
     
     
      } 
     
    
     
     
     
     
     6    

     
    
     
     
     
     
     7    main(
     
    
     
     
     
     
     int argc,
     
    
     
     
     
     
     char *
     
    
     
     
     
     
     argv[]){ 
     
    
     
     
     
     
     8        
     
    
     
     
     
     
     int
     
    
     
     
     
     
      i,j; 
     
    
     
     
     
     
     9        j=
     
    
     
     
     
     
     0
     
    
     
     
     
     
     ; 
     
    
     
     
     
     
     10        
     
    
     
     
     
     
     for(i=
     
    
     
     
     
     
     0;i<
     
    
     
     
     
     
     10;i++
     
    
     
     
     
     
     ){ (gdb) 
     
    
     
     
     
     
     11            j+=
     
    
     
     
     
     
     5
     
    
     
     
     
     
     ; 
     
    
     
     
     
     
     12            printf(
     
    
     
     
     
     
     "
     
    
     
     
     
     
     now j=%d\n
     
    
     
     
     
     
     "
     
    
     
     
     
     
     , j); 
     
    
     
     
     
     
     13            debug(
     
    
     
     
     
     
     "
     
    
     
     
     
     
     x=======x
     
    
     
     
     
     
     "
     
    
     
     
     
     
     ); 
     
    
     
     
     
     
     14
     
    
     
     
     
     
      } 
     
    
     
     
     
     
     15
     
    
     
     
     
     
      }(gdb) Line number 
     
    
     
     
     
     
     16 
     
    
     
     
     
     
     out of range; e.c has 
     
    
     
     
     
     
     15
     
    
     
     
     
     
      lines. (gdb) 
     
    
     
     
     
     
     break
     
    
     
     
     
     
      main Breakpoint 
     
    
     
     
     
     
     1 at 
     
    
     
     
     
     
     0x4004fa: file e.c, line 
     
    
     
     
     
     
     9
     
    
     
     
     
     
     . (gdb) r Starting program: /mnt/hgfs/www/c/gcc/
     
    
     
     
     
     
     e1 Breakpoint 
     
    
     
     
     
     
     1, main (argc=
     
    
     
     
     
     
     1, argv=
     
    
     
     
     
     
     0x7fffffffe538) at e.c:
     
    
     
     
     
     
     9

     
    
     
     
     
     
     9        j=
     
    
     
     
     
     
     0
     
    
     
     
     
     
     ; (gdb) watch i Hardware watchpoint 
     
    
     
     
     
     
     2
     
    
     
     
     
     
     : i (gdb) watch j Hardware watchpoint 
     
    
     
     
     
     
     3
     
    
     
     
     
     
     : j (gdb) c Continuing. Hardware watchpoint 
     
    
     
     
     
     
     3
     
    
     
     
     
     
     : j Old value = 
     
    
     
     
     
     
     0
     
    
     
     
     
     
      New value = 
     
    
     
     
     
     
     5
     
    
     
     
     
     
      main (argc=
     
    
     
     
     
     
     1, argv=
     
    
     
     
     
     
     0x7fffffffe538) at e.c:
     
    
     
     
     
     
     12

     
    
     
     
     
     
     12            printf(
     
    
     
     
     
     
     "
     
    
     
     
     
     
     now j=%d\n
     
    
     
     
     
     
     "
     
    
     
     
     
     
     , j); (gdb) c Continuing. now j=
     
    
     
     
     
     
     5
     
    
     
     
     
     
      debug info :x=======
     
    
     
     
     
     
     x Hardware watchpoint 
     
    
     
     
     
     
     2
     
    
     
     
     
     
     : i Old value = 
     
    
     
     
     
     
     0
     
    
     
     
     
     
      New value = 
     
    
     
     
     
     
     1

     
    
     
     
     
     
     0x0000000000400533 
     
    
     
     
     
     
     in main (argc=
     
    
     
     
     
     
     1, argv=
     
    
     
     
     
     
     0x7fffffffe538) at e.c:
     
    
     
     
     
     
     10

     
    
     
     
     
     
     10        
     
    
     
     
     
     
     for(i=
     
    
     
     
     
     
     0;i<
     
    
     
     
     
     
     10;i++
     
    
     
     
     
     
     ){ (gdb) c Continuing. Hardware watchpoint 
     
    
     
     
     
     
     3
     
    
     
     
     
     
     : j Old value = 
     
    
     
     
     
     
     5
     
    
     
     
     
     
      New value = 
     
    
     
     
     
     
     10
     
    
     
     
     
     
      main (argc=
     
    
     
     
     
     
     1, argv=
     
    
     
     
     
     
     0x7fffffffe538) at e.c:
     
    
     
     
     
     
     12

     
    
     
     
     
     
     12            printf(
     
    
     
     
     
     
     "
     
    
     
     
     
     
     now j=%d\n
     
    
     
     
     
     
     "
     
    
     
     
     
     
     , j); (gdb) c Continuing. now j=
     
    
     
     
     
     
     10
     
    
     
     
     
     
      debug info :x=======
     
    
     
     
     
     
     x Hardware watchpoint 
     
    
     
     
     
     
     2
     
    
     
     
     
     
     : i Old value = 
     
    
     
     
     
     
     1
     
    
     
     
     
     
      New value = 
     
    
     
     
     
     
     2

     
    
     
     
     
     
     0x0000000000400533 
     
    
     
     
     
     
     in main (argc=
     
    
     
     
     
     
     1, argv=
     
    
     
     
     
     
     0x7fffffffe538) at e.c:
     
    
     
     
     
     
     10

     
    
     
     
     
     
     10        
     
    
     
     
     
     
     for(i=
     
    
     
     
     
     
     0;i<
     
    
     
     
     
     
     10;i++
     
    
     
     
     
     
     ){ (gdb) c Continuing. Hardware watchpoint 
     
    
     
     
     
     
     3
     
    
     
     
     
     
     : j Old value = 
     
    
     
     
     
     
     10
     
    
     
     
     
     
      New value = 
     
    
     
     
     
     
     15
     
    
     
     
     
     
      main (argc=
     
    
     
     
     
     
     1, argv=
     
    
     
     
     
     
     0x7fffffffe538) at e.c:
     
    
     
     
     
     
     12

     
    
     
     
     
     
     12            printf(
     
    
     
     
     
     
     "
     
    
     
     
     
     
     now j=%d\n
     
    
     
     
     
     
     "
     
    
     
     
     
     
     , j); (gdb) c Continuing. now j=
     
    
     
     
     
     
     15
     
    
     
     
     
     
      debug info :x=======
     
    
     
     
     
     
     x Hardware watchpoint 
     
    
     
     
     
     
     2
     
    
     
     
     
     
     : i Old value = 
     
    
     
     
     
     
     2
     
    
     
     
     
     
      New value = 
     
    
     
     
     
     
     3

     
    
     
     
     
     
     0x0000000000400533 
     
    
     
     
     
     
     in main (argc=
     
    
     
     
     
     
     1, argv=
     
    
     
     
     
     
     0x7fffffffe538) at e.c:
     
    
     
     
     
     
     10

     
    
     
     
     
     
     10        
     
    
     
     
     
     
     for(i=
     
    
     
     
     
     
     0;i<
     
    
     
     
     
     
     10;i++
     
    
     
     
     
     
     ){ (gdb) c Continuing. Hardware watchpoint 
     
    
     
     
     
     
     3
     
    
     
     
     
     
     : j Old value = 
     
    
     
     
     
     
     15
     
    
     
     
     
     
      New value = 
     
    
     
     
     
     
     20
     
    
     
     
     
     
      main (argc=
     
    
     
     
     
     
     1, argv=
     
    
     
     
     
     
     0x7fffffffe538) at e.c:
     
    
     
     
     
     
     12

     
    
     
     
     
     
     12            printf(
     
    
     
     
     
     
     "
     
    
     
     
     
     
     now j=%d\n
     
    
     
     
     
     
     "
     
    
     
     
     
     
     , j); (gdb) c Continuing. now j=
     
    
     
     
     
     
     20
     
    
     
     
     
     
      debug info :x=======
     
    
     
     
     
     
     x Hardware watchpoint 
     
    
     
     
     
     
     2
     
    
     
     
     
     
     : i Old value = 
     
    
     
     
     
     
     3
     
    
     
     
     
     
      New value = 
     
    
     
     
     
     
     4

     
    
     
     
     
     
     0x0000000000400533 
     
    
     
     
     
     
     in main (argc=
     
    
     
     
     
     
     1, argv=
     
    
     
     
     
     
     0x7fffffffe538) at e.c:
     
    
     
     
     
     
     10

     
    
     
     
     
     
     10        
     
    
     
     
     
     
     for(i=
     
    
     
     
     
     
     0;i<
     
    
     
     
     
     
     10;i++
     
    
     
     
     
     
     ){ (gdb) 
     
    
     
     
     
     
     set 
     
    
     
     
     
     
     var i=
     
    
     
     
     
     
     8
     
    
     
     
     
     
      (gdb) c Continuing. Hardware watchpoint 
     
    
     
     
     
     
     3
     
    
     
     
     
     
     : j Old value = 
     
    
     
     
     
     
     20
     
    
     
     
     
     
      New value = 
     
    
     
     
     
     
     25
     
    
     
     
     
     
      main (argc=
     
    
     
     
     
     
     1, argv=
     
    
     
     
     
     
     0x7fffffffe538) at e.c:
     
    
     
     
     
     
     12

     
    
     
     
     
     
     12            printf(
     
    
     
     
     
     
     "
     
    
     
     
     
     
     now j=%d\n
     
    
     
     
     
     
     "
     
    
     
     
     
     
     , j); (gdb) c Continuing. now j=
     
    
     
     
     
     
     25
     
    
     
     
     
     
      debug info :x=======
     
    
     
     
     
     
     x Hardware watchpoint 
     
    
     
     
     
     
     2
     
    
     
     
     
     
     : i Old value = 
     
    
     
     
     
     
     8
     
    
     
     
     
     
      New value = 
     
    
     
     
     
     
     9

     
    
     
     
     
     
     0x0000000000400533 
     
    
     
     
     
     
     in main (argc=
     
    
     
     
     
     
     1, argv=
     
    
     
     
     
     
     0x7fffffffe538) at e.c:
     
    
     
     
     
     
     10

     
    
     
     
     
     
     10        
     
    
     
     
     
     
     for(i=
     
    
     
     
     
     
     0;i<
     
    
     
     
     
     
     10;i++
     
    
     
     
     
     
     ){ (gdb) c Continuing. Hardware watchpoint 
     
    
     
     
     
     
     3
     
    
     
     
     
     
     : j Old value = 
     
    
     
     
     
     
     25
     
    
     
     
     
     
      New value = 
     
    
     
     
     
     
     30
     
    
     
     
     
     
      main (argc=
     
    
     
     
     
     
     1, argv=
     
    
     
     
     
     
     0x7fffffffe538) at e.c:
     
    
     
     
     
     
     12

     
    
     
     
     
     
     12            printf(
     
    
     
     
     
     
     "
     
    
     
     
     
     
     now j=%d\n
     
    
     
     
     
     
     "
     
    
     
     
     
     
     , j); (gdb) c Continuing. now j=
     
    
     
     
     
     
     30
     
    
     
     
     
     
      debug info :x=======
     
    
     
     
     
     
     x Hardware watchpoint 
     
    
     
     
     
     
     2
     
    
     
     
     
     
     : i Old value = 
     
    
     
     
     
     
     9
     
    
     
     
     
     
      New value = 
     
    
     
     
     
     
     10

     
    
     
     
     
     
     0x0000000000400533 
     
    
     
     
     
     
     in main (argc=
     
    
     
     
     
     
     1, argv=
     
    
     
     
     
     
     0x7fffffffe538) at e.c:
     
    
     
     
     
     
     10

     
    
     
     
     
     
     10        
     
    
     
     
     
     
     for(i=
     
    
     
     
     
     
     0;i<
     
    
     
     
     
     
     10;i++
     
    
     
     
     
     
     ){ (gdb) c Continuing. Watchpoint 
     
    
     
     
     
     
     2 deleted because the program has left the block 
     
    
     
     
     
     
     in
     
    
     
     
     
     
      which its expression 
     
    
     
     
     
     
     is
     
    
     
     
     
     
      valid. Watchpoint 
     
    
     
     
     
     
     3 deleted because the program has left the block 
     
    
     
     
     
     
     in
     
    
     
     
     
     
      which its expression 
     
    
     
     
     
     
     is
     
    
     
     
     
     
      valid. __libc_start_main (main=
     
    
     
     
     
     
     0x4004eb 
     
    
     
     
     
     
     
, argc= 1, ubp_av= 0x7fffffffe538, init= out>, fini= out>, rtld_fini= out> , stack_end= 0x7fffffffe528) at libc-start.c: 258 258 exit (result); (gdb) c Continuing. Program exited with code 026.
复制代码

gdb调试的基本使用

复制代码
(gdb) list
1    #include 
    
   
    
    
    
    
    

     
    
     
     
     
     
     2    
     
    
     
     
     
     
     void debug(
     
    
     
     
     
     
     char *
     
    
     
     
     
     
     str) 
     
    
     
     
     
     
     3
     
    
     
     
     
     
      { 
     
    
     
     
     
     
     4        printf(
     
    
     
     
     
     
     "
     
    
     
     
     
     
     debug info :%s\n
     
    
     
     
     
     
     "
     
    
     
     
     
     
     ,str ); 
     
    
     
     
     
     
     5
     
    
     
     
     
     
      } 
     
    
     
     
     
     
     6    

     
    
     
     
     
     
     7    main(
     
    
     
     
     
     
     int argc,
     
    
     
     
     
     
     char *
     
    
     
     
     
     
     argv[]){ 
     
    
     
     
     
     
     8        
     
    
     
     
     
     
     int
     
    
     
     
     
     
      i,j; 
     
    
     
     
     
     
     9        j=
     
    
     
     
     
     
     0
     
    
     
     
     
     
     ; 
     
    
     
     
     
     
     10        
     
    
     
     
     
     
     for(i=
     
    
     
     
     
     
     0;i<
     
    
     
     
     
     
     10;i++
     
    
     
     
     
     
     ){ (gdb) 
     
    
     
     
     
     
     11            j+=
     
    
     
     
     
     
     5
     
    
     
     
     
     
     ; 
     
    
     
     
     
     
     12            printf(
     
    
     
     
     
     
     "
     
    
     
     
     
     
     now j=%d\n
     
    
     
     
     
     
     "
     
    
     
     
     
     
     , j); 
     
    
     
     
     
     
     13            debug(
     
    
     
     
     
     
     "
     
    
     
     
     
     
     x=======x
     
    
     
     
     
     
     "
     
    
     
     
     
     
     ); 
     
    
     
     
     
     
     14
     
    
     
     
     
     
      } 
     
    
     
     
     
     
     15
     
    
     
     
     
     
      }(gdb) Line number 
     
    
     
     
     
     
     16 
     
    
     
     
     
     
     out of range; e.c has 
     
    
     
     
     
     
     15
     
    
     
     
     
     
      lines. (gdb) b 
     
    
     
     
     
     
     13
     
    
     
     
     
     
      Breakpoint 
     
    
     
     
     
     
     1 at 
     
    
     
     
     
     
     0x400525: file e.c, line 
     
    
     
     
     
     
     13
     
    
     
     
     
     
     . (gdb) r Starting program: /mnt/hgfs/www/c/gcc/
     
    
     
     
     
     
     e1 now j=
     
    
     
     
     
     
     5
     
    
     
     
     
     
      Breakpoint 
     
    
     
     
     
     
     1, main (argc=
     
    
     
     
     
     
     1, argv=
     
    
     
     
     
     
     0x7fffffffe538) at e.c:
     
    
     
     
     
     
     13

     
    
     
     
     
     
     13            debug(
     
    
     
     
     
     
     "
     
    
     
     
     
     
     x=======x
     
    
     
     
     
     
     "
     
    
     
     
     
     
     ); (gdb) s debug (str=
     
    
     
     
     
     
     0x400652 
     
    
     
     
     
     
     "
     
    
     
     
     
     
     x=======x
     
    
     
     
     
     
     ") at e.c:
     
    
     
     
     
     
     4

     
    
     
     
     
     
     4        printf(
     
    
     
     
     
     
     "
     
    
     
     
     
     
     debug info :%s\n
     
    
     
     
     
     
     "
     
    
     
     
     
     
     ,str ); (gdb) bt #
     
    
     
     
     
     
     0  debug (str=
     
    
     
     
     
     
     0x400652 
     
    
     
     
     
     
     "
     
    
     
     
     
     
     x=======x
     
    
     
     
     
     
     ") at e.c:
     
    
     
     
     
     
     4
     
    
     
     
     
     
      #
     
    
     
     
     
     
     1  
     
    
     
     
     
     
     0x000000000040052f 
     
    
     
     
     
     
     in main (argc=
     
    
     
     
     
     
     1, argv=
     
    
     
     
     
     
     0x7fffffffe538) at e.c:
     
    
     
     
     
     
     13
     
    
     
     
     
     
      (gdb) s __printf (format=
     
    
     
     
     
     
     0x400638 
     
    
     
     
     
     
     "
     
    
     
     
     
     
     debug info :%s\n
     
    
     
     
     
     
     ") at printf.c:
     
    
     
     
     
     
     30

     
    
     
     
     
     
     30
     
    
     
     
     
     
      { (gdb) bt #
     
    
     
     
     
     
     0  __printf (format=
     
    
     
     
     
     
     0x400638 
     
    
     
     
     
     
     "
     
    
     
     
     
     
     debug info :%s\n
     
    
     
     
     
     
     ") at printf.c:
     
    
     
     
     
     
     30
     
    
     
     
     
     
      #
     
    
     
     
     
     
     1  
     
    
     
     
     
     
     0x00000000004004e9 
     
    
     
     
     
     
     in debug (str=
     
    
     
     
     
     
     0x400652 
     
    
     
     
     
     
     "
     
    
     
     
     
     
     x=======x
     
    
     
     
     
     
     ") at e.c:
     
    
     
     
     
     
     4
     
    
     
     
     
     
      #
     
    
     
     
     
     
     2  
     
    
     
     
     
     
     0x000000000040052f 
     
    
     
     
     
     
     in main (argc=
     
    
     
     
     
     
     1, argv=
     
    
     
     
     
     
     0x7fffffffe538) at e.c:
     
    
     
     
     
     
     13
     
    
     
     
     
     
      (gdb) s 
     
    
     
     
     
     
     34
     
    
     
     
     
     
      va_start (arg, format); (gdb) bt #
     
    
     
     
     
     
     0  __printf (format=
     
    
     
     
     
     
     0x400638 
     
    
     
     
     
     
     "
     
    
     
     
     
     
     debug info :%s\n
     
    
     
     
     
     
     ") at printf.c:
     
    
     
     
     
     
     34
     
    
     
     
     
     
      #
     
    
     
     
     
     
     1  
     
    
     
     
     
     
     0x00000000004004e9 
     
    
     
     
     
     
     in debug (str=
     
    
     
     
     
     
     0x400652 
     
    
     
     
     
     
     "
     
    
     
     
     
     
     x=======x
     
    
     
     
     
     
     ") at e.c:
     
    
     
     
     
     
     4
     
    
     
     
     
     
      #
     
    
     
     
     
     
     2  
     
    
     
     
     
     
     0x000000000040052f 
     
    
     
     
     
     
     in main (argc=
     
    
     
     
     
     
     1, argv=
     
    
     
     
     
     
     0x7fffffffe538) at e.c:
     
    
     
     
     
     
     13
     
    
     
     
     
     
      (gdb) s 
     
    
     
     
     
     
     35      done =
     
    
     
     
     
     
      vfprintf (stdout, format, arg); (gdb) s _IO_vfprintf_internal (s=
     
    
     
     
     
     
     0x333a58f040, format=
     
    
     
     
     
     
     0x400638 
     
    
     
     
     
     
     "
     
    
     
     
     
     
     debug info :%s\n
     
    
     
     
     
     
     ", ap=
     
    
     
     
     
     
     0x7fffffffe330) at vfprintf.c:
     
    
     
     
     
     
     236

     
    
     
     
     
     
     236      
     
    
     
     
     
     
     int save_errno =
     
    
     
     
     
     
      errno; (gdb) bt #
     
    
     
     
     
     
     0  _IO_vfprintf_internal (s=
     
    
     
     
     
     
     0x333a58f040, format=
     
    
     
     
     
     
     0x400638 
     
    
     
     
     
     
     "
     
    
     
     
     
     
     debug info :%s\n
     
    
     
     
     
     
     ", ap=
     
    
     
     
     
     
     0x7fffffffe330) at vfprintf.c:
     
    
     
     
     
     
     236
     
    
     
     
     
     
      #
     
    
     
     
     
     
     1  
     
    
     
     
     
     
     0x000000333a24effa 
     
    
     
     
     
     
     in __printf (format=
     
    
     
     
     
     
     
       out>) at printf.c: 
      35 
       # 
      2 
      0x00000000004004e9 
      in debug (str= 
      0x400652 
      " 
      x=======x 
      ") at e.c: 
      4 
       # 
      3 
      0x000000000040052f 
      in main (argc= 
      1, argv= 
      0x7fffffffe538) at e.c: 
      13 
       (gdb) c Continuing. debug info :x======= 
      x now j= 
      10 
       Breakpoint  
      1, main (argc= 
      1, argv= 
      0x7fffffffe538) at e.c: 
      13 
      13 debug( 
      " 
      x=======x 
      " 
      ); (gdb) bt # 
      0 main (argc= 
      1, argv= 
      0x7fffffffe538) at e.c: 
      13 
     
    
   
    
    
    
    
    
复制代码

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/202923.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午11:00
下一篇 2026年3月19日 下午11:00


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号