zoukankan      html  css  js  c++  java
  • 和菜鸟一起深入学习国嵌实验之gcc分步编译&&gdb调试

    gcc分步编译

     

    1、编写简单例子

    #include <stdio.h>
     
    int main(void)
    {
       printf("Hello!\n");
        return 0;
    }

     

    2、预处理生成hello.i

    eastmoon@eastmoon-virtual-machine:~/work/guoqian/1/1.2$gcc -E hello.c -o hello.i
    eastmoon@eastmoon-virtual-machine:~/work/guoqian/1/1.2$ls
    hello.c hello.i

     

    hello.i------à

    …………………………
    extern int pclose (FILE *__stream);
     
     
    extern char *ctermid (char *__s) __attribute__((__nothrow__));
    # 906 "/usr/include/stdio.h" 3 4
    extern void flockfile (FILE *__stream)__attribute__ ((__nothrow__));
     
    extern int ftrylockfile (FILE *__stream)__attribute__ ((__nothrow__)) ;
     
    extern void funlockfile (FILE *__stream)__attribute__ ((__nothrow__));
    # 936 "/usr/include/stdio.h" 3 4
     
    # 2 "hello.c" 2
     
    int main(void)
    {
       printf("Hello!\n");
        return 0;
    }

     

    2、生成汇编代码helloS

    eastmoon@eastmoon-virtual-machine:~/work/guoqian/1/1.2$gcc -S hello.i -o hello.S
    eastmoon@eastmoon-virtual-machine:~/work/guoqian/1/1.2$ls
    hello.c hello.i  hello.S

     

    hello.S----à

     

           .file  "hello.c"
           .section   .rodata
    .LC0:
           .string     "Hello!"
           .text
    .globl main
           .type       main, @function
    main:
           pushl       %ebp
           movl       %esp, %ebp
           andl $-16, %esp
           subl $16, %esp
           movl       $.LC0, (%esp)
           call  puts
           movl       $0, %eax
           leave
           ret
           .size main, .-main
           .ident      "GCC: (Ubuntu/Linaro 4.5.2-8ubuntu4)4.5.2"
           .section   .note.GNU-stack,"",@progbits

     

    3、编译汇编代码生成hello.o

    eastmoon@eastmoon-virtual-machine:~/work/guoqian/1/1.2$gcc -c hello.c -o hello.o
    eastmoon@eastmoon-virtual-machine:~/work/guoqian/1/1.2$ls
    hello.c hello.i  hello.o  hello.S

     

    4、链接,生成可执行文件hello

    eastmoon@eastmoon-virtual-machine:~/work/guoqian/1/1.2$ls
    hello hello.c  hello.i  hello.o hello.S

     

    5、运行可执行文件,输出Hello!

    eastmoon@eastmoon-virtual-machine:~/work/guoqian/1/1.2$./hello
    Hello!
     

     

    gdb调试

     

    1、  测试代码编写

    #include <stdio.h>
     
    int add(int x, int y)
    {
        return x+ y;
    }
     
    int main(void)
    {
        int a, b;
       
        a = 4;
        b = 5;
       
        a =add(a, b);
     
       printf("a+b = %d\n", a);
     
        return 0;
    }

     

    2、编译代码生成可执行文件add

    eastmoon@eastmoon-virtual-machine:~/work/guoqian/1/1.3$gcc -g add.c -o add
    eastmoon@eastmoon-virtual-machine:~/work/guoqian/1/1.3$ls
    add  add.c

     

    3、进入gdb调试

    eastmoon@eastmoon-virtual-machine:~/work/guoqian/1/1.3$gdb add
    GNU gdb (Ubuntu/Linaro 7.2-1ubuntu11) 7.2
    Copyright (C) 2010 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 andredistribute it.
    There is NO WARRANTY, to the extent permitted bylaw.  Type "show copying"
    and "show warranty" for details.
    This GDB was configured as"i686-linux-gnu".
    For bug reporting instructions, please see:
    <http://www.gnu.org/software/gdb/bugs/>...
    Reading symbols from /home/eastmoon/work/guoqian/1/1.3/add...done.
    (gdb)

     

    4、查看文件

    (gdb) l
        3   int add(int x, int y)
        4   {
           5       return x + y;
           6   }
           7  
           8   int main(void)
        9   {
           10      int a, b;
           11     
               12      a = 4;
            (gdb)
               13      b = 5;
           14     
               15      a = add(a, b);
           16 
               17      printf("a+b =%d\n", a);
           18 
                19      return 0;
           20  }
           21 

     

    5、设置断点

    (gdb) b 15
    Breakpoint 1 at 0x80483eb: file add.c, line 15.
     

    6、查看断点信息

    (gdb) info b
    Num    Type           Disp EnbAddress    What
    1      breakpoint     keep y   0x080483eb in main at add.c:15
     

    7、运行代码

    (gdb) r
    Starting program:/home/eastmoon/work/guoqian/1/1.3/add
     
    Breakpoint 1, main () at add.c:15
    15      a =add(a, b);
     

    8、查看变量值

    (gdb) p a
    $1 = 4
    (gdb) p b
    $2 = 5

     

    9、单步运行,可进入函数

    (gdb) s
    add (x=4, y=5) at add.c:5
    5      return x + y;
    (gdb) s
    6   }
    (gdb) s
    main () at add.c:17
    17     printf("a+b = %d\n", a);
     
    (gdb) p a
    $3 = 9
    (gdb) p b
    $4 = 5

     

    10、单步运行,不可进入函数

    (gdb) n
    a+b = 9
    19     return 0;

     

    11、运行程序,直到函数结束

    (gdb) finish
    "finish" not meaningful in the outermostframe.
     

    12、恢复程序运行

    (gdb) c
    Continuing.
     
    Program exited normally.
     

    13、退出gdb调试

    (gdb) q

     

  • 相关阅读:
    通过mysql命令行理解mysql
    yii2.0框架安装心得
    浅谈我的编程之路——感谢引领我的leader
    谈谈我的编程之路---WAMP(四)
    谈谈我的编程之路---WAMP(三)
    Sql语句优化之explan分析案例
    mysql技术内幕笔记
    Sql语句优化
    linux变量
    sql查询慢优化
  • 原文地址:https://www.cnblogs.com/wuyida/p/6300025.html
Copyright © 2011-2022 走看看