Linux系统编程 34 -gdb调试其他指令

Linux系统编程 34 -gdb调试其他指令,第1张

Linux系统编程 34 -gdb调试其他指令

Linux系统编程 34 -gdb调试其他指令学习笔记

$cat gdbtest.c
#include 
#include
#include

#define N 10

char *str = "hello ";
int var = 0;

void init_arr(int *arr,int len)
{
    int i = 0;

    for(i = 0; iarr[j])
                        k =j;
        }    
        if(i != k )
        {
            temp  = arr[i];
            arr[i] = arr[k];
            arr[k] = temp;
        }    

        }
}


int print_arr(int *arr, int len)
{
    int i;
    for (i =0;i 

段错误
因为字符串常量存放在静态内存区(数据段和代码段的位置)
而程序尝试去修改这个区域,所以会报错

gdb 程序名

使用run去查找段错误的位置

(gdb)run
直接就会告诉你段错误的位置

(gdb) run
Starting program: /home/ubuntu/code/test/34gdb/gdbtest.out 
arr[0]= 14
arr[1]= 6
arr[2]= 7
arr[3]= 2
arr[4]= 16
arr[5]= 1
arr[6]= 1
arr[7]= 10
arr[8]= 11
arr[9]= 7

Program received signal SIGSEGV, Segmentation fault.
0x0000000000400842 in main () at gdbtest.c:64
64            p[3]='M';

p[3]='M';  //修改点

修改点删除。
(gdb) finish
结束当前函数调用

(gdb) b 49
Breakpoint 1 at 0x4007bf: file gdbtest.c, line 49.
(gdb) run
The program being debugged has been started already.
Start it from the beginning? (y or n) y

Starting program: /home/ubuntu/code/test/34gdb/gdbtest.out 

Breakpoint 1, print_arr (arr=0x7fffffffdee0, len=10) at gdbtest.c:50
50                    printf("arr[%d]= %dn",i,arr[i]);
(gdb) s
__printf (format=0x40090f "arr[%d]= %dn") at printf.c:28
28    printf.c: No such file or directory.
(gdb) s
32    in printf.c
(gdb) finish
Run till exit from #0  __printf (format=0x40090f "arr[%d]= %dn")
    at printf.c:32
arr[0]= 16
print_arr (arr=0x7fffffffdee0, len=10) at gdbtest.c:48
48            for (i =0;i 

gdbtest.c

$cat gdbtest.c
#include 
#include
#include

#define N 10

char *str = "hello ";
int var = 0;

void init_arr(int *arr,int len)
{
    int i = 0;

    for(i = 0; iarr[j])
                    k =j;
        }    
        if(i != k )
        {
            temp  = arr[i];
            arr[i] = arr[k];
            arr[k] = temp;
        }    

    }
}


int print_arr(int *arr, int len)
{
    int i;
    for (i =0;i 
$gcc -g gdbtest.c -o gdbtest.out
$./gdbtest.out p1 p2 p3
p1 p2 p3
arr[0]= 3
arr[1]= 19
arr[2]= 15
arr[3]= 11
arr[4]= 4
arr[5]= 8
arr[6]= 1
arr[7]= 20
arr[8]= 15
arr[9]= 3
--------------after sort----------
arr[0]= 1
arr[1]= 3
arr[2]= 3
arr[3]= 4
arr[4]= 8
arr[5]= 11
arr[6]= 15
arr[7]= 15
arr[8]= 19
arr[9]= 20


启动调试的方法
1. list 设置断点 后run
2.  (gdb)start
set args 设置main函数命令行参数

方法一:

(gdb) start
Temporary breakpoint 1 at 0x400806: file gdbtest.c, line 56.
Starting program: /home/ubuntu/code/test/34gdb/gdbtest.out 

Temporary breakpoint 1, main (argc=1, argv=0x7fffffffdff8) at gdbtest.c:56
56            printf("%s %s %sn",argv[1],argv[2],argv[3] );
(gdb) set args aa bb cc 
(gdb) n
(null) XDG_VTNR=7 XDG_SESSION_ID=c2


(null) XDG_VTNR=7 XDG_SESSION_ID=c2可以看出来设置晚了

所以进入调试之后,刚开始就要立即设置命令行参数,然后再run

$gdb gdbtest.out
GNU gdb (Ubuntu 7.7.1-0ubuntu5~14.04.2) 7.7.1
Copyright (C) 2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later 
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:
.
Find the GDB manual and other documentation resources online at:
.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from gdbtest.out...done.
(gdb) set aa bb cc dd
No symbol "aa" in current context.
(gdb) set args aa bb cc
(gdb) start
Temporary breakpoint 1 at 0x400806: file gdbtest.c, line 56.
Starting program: /home/ubuntu/code/test/34gdb/gdbtest.out aa bb cc

Temporary breakpoint 1, main (argc=4, argv=0x7fffffffdfd8)
    at gdbtest.c:56
56        printf("%s %s %sn",argv[1],argv[2],argv[3] );
(gdb) n
aa bb cc
58        char *p = "hellod";
(gdb)


方法二:
1)设置断点
2)run 命令行参数字串1 字串2 ...   

(gdb) b 47
Breakpoint 1 at 0x4007b6: file gdbtest.c, line 47.
(gdb) run xyz abc opq
Starting program: /home/ubuntu/code/test/34gdb/gdbtest.out xyz abc opq
xyz abc opq

Breakpoint 1, print_arr (arr=0x7fffffffdec0, len=10) at gdbtest.c:48
48        for (i =0;i 

(gdb)info b
用来查看调试表中有哪些断点

(gdb) b 58
Breakpoint 1 at 0x400839: file gdbtest.c, line 58.
(gdb) b 60
Breakpoint 2 at 0x400841: file gdbtest.c, line 60.
(gdb) info b
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x0000000000400839 in main 
                                                   at gdbtest.c:58
2       breakpoint     keep y   0x0000000000400841 in main 
                                                   at gdbtest.c:60

设置断点条件
(gdb) b 50 if i == 5

注意:千万不要输成i =5,否则i用于为5,后面n s finish 都退出不了该函数。

(gdb) b 50 if i ==5
Breakpoint 3 at 0x4007bf: file gdbtest.c, line 50.
(gdb) info b
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x0000000000400839 in main 
                                                   at gdbtest.c:58
2       breakpoint     keep y   0x0000000000400841 in main 
                                                   at gdbtest.c:60
3       breakpoint     keep y   0x00000000004007bf in print_arr 
                                                   at gdbtest.c:50
    stop only if i ==5


查看变量类型
(gdb) ptype i

Line number 70 out of range; gdbtest.c has 69 lines.
(gdb) b 58
Breakpoint 1 at 0x400839: file gdbtest.c, line 58.
(gdb) b 60
Breakpoint 2 at 0x400841: file gdbtest.c, line 60.
(gdb) info b
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x0000000000400839 in main 
                                                   at gdbtest.c:58
2       breakpoint     keep y   0x0000000000400841 in main 
                                                   at gdbtest.c:60
(gdb) b 50 if i ==5
Breakpoint 3 at 0x4007bf: file gdbtest.c, line 50.
(gdb) info b
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x0000000000400839 in main 
                                                   at gdbtest.c:58
2       breakpoint     keep y   0x0000000000400841 in main 
                                                   at gdbtest.c:60
3       breakpoint     keep y   0x00000000004007bf in print_arr 
                                                   at gdbtest.c:50
    stop only if i ==5
    
    


(gdb) run
Starting program: /home/ubuntu/code/test/34gdb/gdbtest.out 
(null) XDG_VTNR=7 XDG_SESSION_ID=c2

Breakpoint 1, main (argc=1, argv=0x7fffffffdff8) at gdbtest.c:58
58        char *p = "hellod";
(gdb) continue
Continuing.

Breakpoint 2, main (argc=1, argv=0x7fffffffdff8) at gdbtest.c:60
60        srand(time(NULL));
(gdb) continue 
Continuing.

Breakpoint 3, print_arr (arr=0x7fffffffdee0, len=10) at gdbtest.c:50
50            printf("arr[%d]= %dn",i,arr[i]);
(gdb) p i
 = 5
(gdb) ptype i
type = int
(gdb) ptype arr
type = int *
(gdb) 
(gdb) p p
No symbol "p" in current context.

作用域问题

int print_arr(int *arr, int len)
函数中没有p,而p在main函数的栈帧里面


栈帧的概念

栈帧:随着函数调用而在stack上开辟的一片内存空间
用于存放函数,调用时产生的局部变量和临时值

有一个函数调用,就会产生一个栈帧

函数调用的时候,一个栈帧产生
当函数调用的时候,一个栈帧结束了

如果要查看p,就要进入main栈帧中去

查看函数的调用的栈帧和层级关系
bt: backtrace
(gdb) bt

(gdb) bt
#0  print_arr (arr=0x7fffffffdee0, len=10) at gdbtest.c:50
#1  0x0000000000400874 in main (argc=1, argv=0x7fffffffdff8)
    at gdbtest.c:62
    


    
切换函数的栈帧
通过bt 查询栈帧对应的号  1 为main 函数的栈帧
(gdb) frame 栈帧号

(gdb) frame 1
#1  0x0000000000400874 in main (argc=1, argv=0x7fffffffdff8)
    at gdbtest.c:62
62        print_arr(arr,N);
(gdb) ptype p
type = char *

(gdb) p p
 = 0x400956 "hellod"


比如某个变量值一直变化,
如果想一直跟踪某个值 
用display 命令

(gdb) display 变量名

Breakpoint 1, select_sort (arr=0x7fffffffdee0, len=10) at gdbtest.c:29
29            for(j = i+1;jarr[j])
3: k = 2
2: j = 3
1: i = 2
(gdb) n
29            for(j = i+1;jarr[j])
3: k = 2
2: j = 4
1: i = 2
(gdb) n
29            for(j = i+1;j 

不在跟踪的时候

(gdb) display 变量名的编号

(gdb) undisplay 1
(gdb) n
31                if(arr[k]>arr[j])
3: k = 2
2: j = 5


 

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5665924.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存