• Linux环境下的GCC编译器与GDB调试工具介绍


    假如现在我们有如下代码需要编译运行和调试。文件名为:test.c

    #include <stdio.h>
    int main()
    {
    	int day, month, year, sum, leap;
    	printf("input year month day:
    ");
    	scanf("%d%d%d",&year,&month,&day);
    	switch(month)
    	{
    		case 1: sum = 0; break;
    		case 2: sum = 31; break;
    		case 3: sum = 59; break;
    		case 4: sum = 90; break;
    		
    		//case 5: sum += 90; break;
    		//case 6: sum += 90; break;
    		//case 7: sum += 90; break;
    		//case 8: sum += 90; break;
    	}
    	sum += day;
    	if(year%400==0 || (year%4==0 && year%100!=0))
    	{
    		leap = 1;
    		
    	}
    	else{
    		leap = 0;	
    	}
    	if(leap == 1 && month>2)
    	{
    		sum++;
    	}
    	printf("it is the &dth day!
    ",sum);
    	return 0;
    }

    1GCC编译器介绍

    在使用GCC编译器时,需要给出一些列的调用参数,其基本的调用格式如下:

    gcc [options] [filenames]

    其中options就是GCC所需的参数,filenames便是要编译的文件名

    options 的常用的参数有:

    -C :只编译,不链接生成可执行文件。输入.c等源代码文件,输出.o为后缀的目标文件。通常用于编译不包含主程序的子程序文件。

    -o output_filename:确定输出文件的名称为output_filename,并且这个名称不能与源文件同名。默认情况下为:a.out

    -g : 产生符号调试工具所必须的符号信息。若想对源代码进行调试,就需要加入该选项

    -O对程序进行优化编译、链接。

    -O2-O更好的优化编译、链接,但整个编译和链接过程会比较慢。


    其中比较常用的编译代码的命令:(-Wall能够使得GCC产生尽可能多的警告信息)

    gcc -Wall test.c -o test


    运行代码的命令为:(test是上面生成的目标文件test)

    ./test


    2GDB调试工具介绍

    1) 在使用GDB编译程序时必须要让GDB可以获得程序的信息,故而需要在编译时加入参数-g,编译命令如下:

    gcc -g -o可执行文件名 源文件名

    如:gcc -g -o test test.c


    2) 在生成带有调试信息的可执行文件后,可使用如下命令加载可执行程序到GDB调试工具中

    gdb 可执行文件

    如:gdb test

    当然也可以先输入gdb命令,然后在输入命令:

    file 可执行文件名

    如:file test


    3) 在进入调试工具GDB后,可以使用break命令设置断点,如:

    break line5                          //运行到第五行停止

    break function1                   //运行到函数function1后停止

    break line/function if xx      //符合if条件时,运行到指定位置


    4) 在程序运行到第一个断点停止后,可以对接下来的代码进行单步跟踪,使用命令:

    step

    当然也可以使用continue命令继续运行程序,使得程序运行至下一个断点或运行完成。


    5) 在逐步追踪的过程中,可以使用如下命令查看变量值:

    print 变量名/表达式

    print $                                 //表示输出当前序号的前一个序号的值

    print $$                               //表示输出当前序号向前第二个序号

    假如当前序号为3,则print $ 表示输出序号为2中的数据,print $$ 输出序号为1中的数据。


    print还可用户给变量赋值和打印连续的空间

    print var = 5                                      //给变量var赋值为5

    print 开始表达式@连续空间大小             //printarr[2]@5


    6) display用户显示表达式的值。与print不同的是程序每步运行都会显示表达式的值。

    若想使display暂时不能显示可以使用命令:

    disable display

    恢复display命令为:

    enable display

    直接删除display命令为:

    delete display [显示数据的序号]


    当设置的程序断点不再需要暂停运行时,可以使用deleteclear命令清除断点,二者的区别在于:

    delete 断点编号

    clear 断点所在行号


    显示代码使用命令list

    list[+] :显示当前行后面的代码

    list-:显示当前行前面的代码

    list n: 显示程序第n行周围的代码

    list function: 显示函数名为function的功能函数代码

    list first, last: 显示第first行代码到last行代码

    list , last:显示从当前行到last行之间的代码

    list filename:n :显示文件filename的第n行代码

    list filename:function:显示文件名为filename中的函数名为function的函数代码


    set listsize count :设置list显示的行数为count

    show listsize: 查看当前源代码的显示行数


    参考文献:

    明日科技,linux C 从入门到精通, 清华大学出版社, 2012.12






  • 相关阅读:
    JavaScript 之 typeof
    Octotree Chrome安装与使用方法
    支持主流MySQL中间件的数据迁移工具ora2mysql
    Eclipse搭建SpringBoot之HelloWorld
    Spring Boot插件spring tool suite安装及使用
    树的前中后序遍历非递归实现
    判断是否是完全二叉树
    Leetcode 437_path sum III todo
    DFS回溯只在递归基回溯————leetcode112
    Leetcode 94 Binary Tree Inorder
  • 原文地址:https://www.cnblogs.com/liuwu265/p/4032139.html
Copyright © 2020-2023  润新知