【Linux】gdb调试总结

在windows操作系统下,我们的运行程序有两个版本。

  1. debug开发调试版本

   得到的可执行文件.exe文件相对较大,其中包含调试信息。且不做任何优化,未开发人员提供强大的应用调试能力

  1. Release发行版本

   文件相对较小,不包含调试信息,并进行了各种优化,以期达到代码最小和速度最优。为用户的使用提供便利。

 

在linux操作系统下,我们通过gcc来完成代码的编译链接,命令:gcc -o main main.c 其生成的可执行文件与release版本下生成的可执行文件相像,均不包含调试信息,若想其包含调试信息,需要在其命令后加入命令-g,即gcc -o main main.c -g,此时生成的文件即可进行调试。Linux下调试需要借助调试工具gdb

 

Gdb调试总结

Gdb调试的对象:进程

1、进入调试

命令gcc -o main mian.c -g,产生包含调试信息的可执行文件main

命令gdb main进入调试模式

扫描二维码关注公众号,回复: 9522419 查看本文章

注意:输入命令结束并按回车键后若显示最后一个单词为done在进入调试模式,否则,可能第一次命令未输入-g导致未产生包含调试信息的可执行文件。

2、显示代码以进行加断点操作

命令 l

若代码显示不全则继续输入命令l/回车键,回车键为继续执行上一次输入的命令

  1. 断点操作

加断点 命令b 行号(l后显示的行号

显示断点信息 命令info break 

删除断点 delete 断点编号info break 后显示的编号)

  1. 启动调试/运行程序

命令 r

  1. 调试过程

单步执行 命令 n

进入函数 命令 s

退出函数 命令 finish

打印 命令 p 变量

继续执行 命令 c (遇到断点就会停止,如果想要越过断点,需要delete删除断点)

显示当前位置/函数调用栈信息(关系) 命令 bt

退出调试 命令 q 

 

注意:若想退出死循环进程。按Ctrl+c

 

调试实例

在Linux下创建普通文件main.c,内容为:

#include<stdio.h>

#include<stdlib.h>  //

#include<string.h>

 

int main()

{

        while(1)

        {
               char buff[128] = {0};

               printf("input:\n");

 

               fgets(buff,128,stdin);

        

                if(strcmp(buff,"end")==0)

                {

                        break;

               }

                printf("read:%s\n",buff);

        }

        printf("main over\n");

        exit(0);

}

调试后,可以很明显的发现其原因是在liunx环境下,在字符转结尾会自动补\n标记,这不同于window下的\0标记,所以键盘输入的“end”和代码中比较的“end”无法匹配,需要将strcmp中进行匹配的“end”改为“end\n”。

发布了20 篇原创文章 · 获赞 24 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/ifiwere/article/details/88934479