Linux程序编译+GDB调试

Ubuntu下编译第一个C程序的成功运行
对于每个新手来说,进入Ubuntu最想做的事莫过于在终端(Terminal)里运行自己的第一个C/C++程序”hello.c/hello.cpp”了。

很多语言书籍都是默认搭载好运行环境的,而Ubuntu默认是不包含编辑器vim和编译器gcc。假设你和我一样,展现在自己眼前的是一台刚安装好的Ubuntu电脑,下面我们将来实现自己的第一个程序。

1.准备工作

1.1 打开控制台:使用快捷键 Ctrl + Alt + T;

1.2 安装vim:输入 sudo apt-get install vim;

1.3 安装gcc:输入 sudo apt-get install g++。

2.编写hello.c源代码

2.1 新建文件名为hello.c的源文件:输入vim hello.c;

2.2 键入i 进入insert模式(即编辑输入模式),写入如下经典代码:

//the first program hello.c
#include<stdio.h>
int main(void)
{
printf("Hello, world!\n");
return 0;
}

2.3 输入完成后,Esc 回到normal模式,键入:wq 保存退出vim。

3.编译hello.c

在终端执行 g++ hello.c -o hello 编译。

4.运行程序hello

./hello 就看到结果:

Hello,world!

参考文档

  1. Ubuntu下编译C程序的详解 http://www.linuxidc.com/Linux/2012-11/73360.htm
  2. Ubuntu下编译和执行C程序 http://www.linuxidc.com/Linux/2009-10/22312.htm
  3. Linux下用GCC编写第一个C程序 http://www.linuxidc.com/Linux/2011-07/38415.htm
  4. 更多Ubuntu相关信息见Ubuntu 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=2
  5. 本文永久更新链接地址:http://www.linuxidc.com/Linux/2014-05/101844.htm

GDB调试

查询GDB软件版本

查看软件版本:

aptitude show xxx

如果没有安装aptitude,首先要对其进行安装

sudo apt-get install aptitude

查询软件版本,结果显示如下:
显示GDB版本
也可用apt-show-versions (要先安装sudo apt-get install apt-show-versions)

查看软件安装位置:

dpkg -L xxxx

查看软件是否安装:

dpkg -l | grep filename

调试GDB

1、编译程序

假设需要调试的文件名为:main.c,然后切换到此文件所在目录,用GCC编译之:首先对程序进行编译,命令形式如下:

gcc main.c -o main -g

在上面的命令行中,使用 -o 参数指定了编译生成的可执行文件名为main,使用参数 -g 表示将源代码信息编译到可执行文件中。如果不使用参数 -g,会给后面的GDB调试造成不便。当然,如果我们没有程序的源代码,自然也无从使用 -g 参数,调试/跟踪时也只能是汇编代码级别的调试/跟踪。

2、打开GDB

输入gdb命令,打开gdb软件

gdb
###3、加载文件 使用file命令加载生成的main文件
(gdb) file main
结果如图所示 ![这里写图片描述](https://img-blog.csdn.net/20170312143735109?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamF5YW5kY2h1eHU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 输入完成后显示
(gdb)  Reading symbols from gdb-sample…done.

程序加载成功
###4、设置断点 使用“b”命令在 main 函数开头设置一个断点(Breakpoint):显示
(gdb)  Breakpoint 1 at 0x4009d6: file main.c, line 12.
表示断点设置成功 ![这里写图片描述](https://img-blog.csdn.net/20170312144732015?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamF5YW5kY2h1eHU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
(gdb)  b 65
表示在程序第65行,添加断点 ###5、运行程序
(gdb)  r
###6、查询变量 使用”p”+变量名称,”p”是”print”的简称。比如,查询buff 变量的值:
(gdb)  p buff
显示如图所示: ![这里写图片描述](https://img-blog.csdn.net/20170312153312423?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamF5YW5kY2h1eHU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

7、删除所有断点

为了更简明,有必要先删除目前所有断点(使用“d”命令——Delete breakpoint):

(gdb) d
(Delete all breakpoints? (y or n) y
(gdb)

8、单条语句执行

(gdb) n <——————— 单条语句执行,next命令简写。

(gdb)  n

9、退出gdb

这里写图片描述

退出程序选择”q”

(gdb)  q

10、多进程调试

默认设置下,在调试多进程程序时GDB只会调试主进程。但是GDB(>V7.0)支持多进程的分别以及同时调试,换句话说,GDB可以同时调试多个程序。只需要设置follow-fork-mode(默认值:parent)和detach-on-fork(默认值:on)即可。

follow-fork-mode detach-on-fork 说明
parent on 只调试主进程(GDB默认)
child on 只调试子进程
parent off 同时调试两个进程,gdb跟主进程,子进程block在fork位置
child off 同时调试两个进程,gdb跟子进程,主进程block在fork位置

设置方法:set follow-fork-mode [parent|child] set detach-on-fork [on|off]

参考文档

  1. 用GDB调试程序(一)
  2. GDB十分钟教程
  3. gdb调试多进程和多线程命令

猜你喜欢

转载自blog.csdn.net/jayandchuxu/article/details/61415543