zoukankan      html  css  js  c++  java
  • Linux下C程序的编译,运行,及调试

    先查看linux有没有gcc 和 gdb

    $ gcc -v

    $ gdb -v

    如果没有安装gcc,可以 $ yum install gcc

    要获取管理员权限才能安装软件,$ su root (有的linux是sudo root)

    gdb的安装和gcc一样。

    编译命令:

    $ gcc -o <输出文件名> <源文件名>

    执行命令:

    $ ./<输出文件名>

    调试命令:

    1.  在编译的时候:gcc -o <输出文件名> -g <源文件名>

    2.  $ gdb <输出文件名>

    查看源代码 :(gdb) l <第几行开始>

    增加断点:(gdb) b <第几行>

    运行:(gdb) run

    查看变量:(gdb) p <变量名>

    继续:(gdb) c

    退出:(gdb) q

    帮助:(gdb) help

    /************************************如果你还是有疑惑************************************************/

    下面通过一个很简单的例子来说明。

    1 .编写C程序:$ vim test.c

    进入vim后,按 i 进入编辑模式

    输入如下代码:

     1    #include<stdio.h>
     2    #define N 10
     3    int main(void){
     4      int a[N] = {1,2,3,4,5,6,7,8,9,10};
     5      int i;
     6      for(i=0;i<=N;i++){
     7        printf("%d ",a[i]);
     8      }
     9      printf("
    ");
    10     return 0;
    11   }

    完成之后,按ESC ,然后按 shift+: 进入vim命令行模式 输入 wq保存并退出vim 回到 shell

    2. 编译:

    $ gcc -o test test.c (其中-o 表示将编译后的可执行文件命名为test)

    3. 执行:

    $ ./test

    得到的结果是:1 2 3 4 5 6 7 8 9 10 0

    怎么多了一个0?

    源代码的本意是打印从a[0]到a[N-1]的值,但是某个初学C语言的同学粗心了,怎么也得不到正确结果,程序出现了问题,对着代码看了许久都没有发现问题所在。

    所以他决定调试,但是他不知道在Linux命令行下怎么调试。

    4. 调试

      首先,重新编译C程序:

      $ gcc -o test -g test.c

      和刚才编译的命令多了一个 “-g” 这个表示生成的文件可用gdb来调试。

      $ gdb test

      进入调试界面

      (gdb) l 1                         //(字母“L”的小写 和 1) 会输出从第一行开始的源代码。

      (gdb) b 7                       //(在源代码的第7行加断点,b是breakpoint的缩写)

      (gdb) run                      // 这时候程序会在第七行停止。

      (gdb) p i                       // 表示打印i的值,p是print的缩写,这时会输出 :$1 = 0 ,即 i == 0

      (gdb) p a[i]                   // 表示打印a[i]的值,p是print的缩写 这时会输出:$2 = 1 ,即 a[i] == 1

      (gdb) c                       // 继续执行,程序会在第七行停止,这时候可以用p命令来查看相应的值。

      最后当程序运行到 i == 9的时候,发现a[9]已经等于10了,该同学觉得下一步程序应该要正常退出才对,于是,他输入了 (gdb) c

      结果发现 程序继续停在第七行,他非常纳闷,于是 (gdb) p i ,发现 i == 10,(gdb)p a[i] == 0,这时他才猛然想起老师教的内容:数组大小为10,范围是从0到9

      然后

      (gdb) l 7                     // 打印第七行前后几行的源代码

      这时他发现他的代码第六行:for(i=0;i<=N;i++)

      原来问题出在这个'='上,他发现了问题所在。

      于是

      (gdb) q                       //结束当前调试,返回shell命令行界  

      再次用 vim test.c 打开源文件 修改了代码

      最后他重新编译了一遍

      gcc -o test test.c

      这一次,他终于得到了正确的答案,然后他顺便学会了gdb来调试C程序。

  • 相关阅读:
    【2019】微软Power BI 每月功能更新系列——Power BI 10月版本功能完整解读
    教你写一个含信息的汇编程序
    为安卓手机刷上手机kali系统Nethunter
    多年珍藏的55w御剑字典
    netsh命令获取wifi历史连接密码
    win7/10获取本地wifi密码明文
    Wordpress综合检测和爆破工具
    那些年我们一起追逐过的安全工具
    大部分政府网站U-mail存在直接拿shell漏洞
    无需密码攻击 Microsoft SQL Server
  • 原文地址:https://www.cnblogs.com/iceseal/p/3597507.html
Copyright © 2011-2022 走看看