linux下的C语言开发(gdb调试)

原文: http://blog.csdn.net/feixiaoxing/article/details/7199643

gdb调试多进程的程序会遇到困难,gdb只能跟踪一个进程(默认是跟踪父进程),而不能同时跟踪多个进程,但可以设置gdbfork之后跟踪父进程还是子进程。以上面的程序为

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#define MAXLINE 80

int main(void)
{
    int n;
    int fd[2];
    pid_t pid;
    char line[MAXLINE];

    if (pipe(fd) < 0)
    {
        perror("pipe");
        exit(1);
    }
    if ((pid = fork()) < 0)
    {
        perror("fork");
        exit(1);
    }
    if (pid > 0)   /* parent */
    {
        close(fd[0]);
        write(fd[1], "hello world\n", 12);
        wait(NULL);
    }
    else           /* child */
    {
        close(fd[1]);
        n = read(fd[0], line, MAXLINE);
        printf("---------------in-----------");
        write(STDOUT_FILENO, line, n);
    }
    return 0;
}

  

$ gcc main.c -g
$ gdb a.out
GNU gdb 6.8-debian
Copyright (C) 2008 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 and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i486-linux-gnu"...
(gdb) l
2	#include <unistd.h>
3	#include <stdio.h>
4	#include <stdlib.h>
5
6	int main(void)
7	{
8		pid_t pid;
9		char *message;
10		int n;
11		pid = fork();
(gdb)
12		if(pid<0) {
13			perror("fork failed");
14			exit(1);
15		}
16		if(pid==0) {
17			message = "This is the child\n";
18			n = 6;
19		} else {
20			message = "This is the parent\n";
21			n = 3;
(gdb) b 17
Breakpoint 1 at 0x8048481: file main.c, line 17.
(gdb) set follow-fork-mode child
(gdb) r
Starting program: /home/akaedu/a.out
This is the parent
[Switching to process 30725]

Breakpoint 1, main () at main.c:17
17			message = "This is the child\n";
(gdb) This is the parent
This is the parent

 

---------------------------------------------------------------------

编写代码过程中少不了调试。在windows下面,我们有visual studio工具。在Linux下面呢,实际上除了gdb工具之外,你没有别的选择。那么,怎么用gdb进行调试呢?我们可以一步一步来试试看。

[cpp] view plain copy

  1. #include <stdio.h>
  2. int iterate(int value)
  3. {
  4. if(1 == value)
  5. return 1;
  6. return iterate(value - 1) + value;
  7. }
  8. int main()
  9. {
  10. printf("%d\n", iterate(10));
  11. return 1;
  12. }

既然需要调试,那么生成的可执行文件就需要包含调试的信息,这里应该怎么做呢?很简单,输入 gcc test.c -g -o test。输入命令之后,如果没有编译和链接方面的错误,你就可以看到 可执行文件test了。

调试的步骤基本如下所示,

(01) 首先,输入gdb test
(02) 进入到gdb的调试界面之后,输入list,即可看到test.c源文件
(03) 设置断点,输入 b main 
(04) 启动test程序,输入run 
(05) 程序在main开始的地方设置了断点,所以程序在printf处断住  
(06) 这时候,可以单步跟踪。s单步可以进入到函数,而n单步则越过函数
(07) 如果希望从断点处继续运行程序,输入c
(08) 希望程序运行到函数结束,输入finish
(09) 查看断点信息,输入 info break
(10) 如果希望查看堆栈信息,输入bt
(11) 希望查看内存,输入 x/64xh + 内存地址
(12) 删除断点,则输入delete break + 断点序号
(13) 希望查看函数局部变量的数值,可以输入print + 变量名

(14)希望修改内存值,直接输入 print  + *地址 = 数值
(15) 希望实时打印变量的数值,可以输入display + 变量名
(16) 查看函数的汇编代码,输入 disassemble + 函数名
(17) 退出调试输入quit即可

时间: 2024-08-09 10:43:01

linux下的C语言开发(gdb调试)的相关文章

linux下的C语言开发

在很多人的眼里,C语言和linux常常是分不开的.这其中的原因很多,其中最重要的一部分我认为是linux本身就是C语言的杰出作品.当然,linux操作系统本身对C语言的支持也是相当到位的.作为一个真正的程序员来说,如果没有在linux下面用C语言编写过完整的程序,那么只能说他对C语言本身的理解还相关肤浅,对系统本身的认识也不够到位.作为程序员来说,linux系统为我们提供了很多理想的环境,这其中包括了下面几个方面,        (1)完善的编译环境,包括gcc.as.ld等编译.链接工具   

Linux下的栈溢出案例分析-GDB调试操练

摘要:  本文主要演示linux平台下的栈溢出,首先根据理论对示例代码进行溢出攻击:结果是溢出攻击成立,但是与设想的有差别:然后采用GDB调试工具对发生的意外,进行深入的分析. 测试的平台: 1.  ubuntu 9;   gcc 4.4.1;   Gdb 7.0-ubuntu 2.  ubuntu系统安装在virtual box 3.2.8虚拟机上: 示例代码如下: #include<string.h> void overflow(char* arg) { char buf[12]; str

[原理分析]Linux下的栈溢出案例分析-GDB调试操练-加强版

摘要: 原来的版本:http://blog.csdn.net/bigbug_zju/article/details/39892129 原版本中的问题主要在于调试过程中,蛮力的痕迹太重,没有很好地体现常用的调试准则:本文在原版本的基础上,融入参考文献中提及的调试原则,重新审视和操练该问题,希望尽量体现出调试中常用的思维法则. 测试的平台: 1.  ubuntu 9;   gcc 4.4.1;   Gdb 7.0-ubuntu 2.  ubuntu系统安装在virtual box 3.2.8虚拟机上

[原理分析]Linux下的栈溢出案例分析-GDB调试操练[4]

摘要: 本系列的3介绍了现有的linux系统对栈的保护,在那种栈保护措施下,要修改SIP(saved instruction pointer)不可能:但是栈保护对象有限,对程序中的数据不一定都能保护到.本文就是探讨程序中有内存操作漏洞时,如何利用漏洞改写数据,达到控制的目的. 测试平台: 1. ubuntu 9, gcc4.4.1, gdb 7.0 2. ubuntu系统安装在virtualBox 3.2.8系统上: 正文: 首先看个如下的示例代码: #include<stdio.h> #in

[原理分析]Linux下的栈溢出案例分析-GDB调试操练[3]

摘要: 本文主要在之前版本的代码基础上,分析下gcc如何进行栈保护以避免栈溢出攻击的. 测试的平台: 1.  ubuntu 9;   gcc 4.4.1;   Gdb 7.0-ubuntu 2.  ubuntu系统安装在virtual box 3.2.8虚拟机上: 正文: #include<string.h> void overflow(char* arg) { char buf[12]; strcpy(buf, arg); } int main(int argc, char *argv[])

linux应用开发-gdb调试

linux应用开发-gdb调试 一 gdb概念 gdb是GNU开发的linux下的调试工具 二 基本使用过程 1 进入调试程序的模式: gcc -g test.c -o test.out 2 开启gdb:            gdb test.out 3 运行程序:           run(r) 4 退出:               quit(q) 5 也可以先进入gdb在执行file装载要调试的文件 三 基本命令 1 设置断点:break(b) 行号 或 break(b)文件名:行号

Windows下搭建go语言开发环境 以及 开发IDE (附下载链接)

1.下载 并且 安装 Go安装包 =========================================================== 在CSDN上传了我的版本,供大家下载: =========================================================== go1.2.windows-386.msi : http://download.csdn.net/detail/shuideyidi/7718563 go1.2.1.windows-am

Win7下搭建Go语言开发环境

Win7下搭建Go语言开发环境 1 下载适合window版本的Go安装包,下载地址http://code.google.com/p/go/downloads/list 2 下载适合window本本的LiteIDE,下载后解压即可使用 下载地址http://code.google.com/p/golangide/downloads/list 3 解压下载的Go安装包,开始配置环境变量 4 新建一个名为GOROOT的环境变量 5 在系统的Path环境变量中添加go的bin目录 6 打开LiteIDE

Linux下快速搭建php开发环境

php开发环境快速搭建 一.Linux下快速搭建php开发环境 1.安装XAMPP for Linux XAMPP(Apache+MySQL+PHP+PERL)是一个功能强大的建站集成软件包,使用XAMPP可快速搭建PHP开发环境.下载链接:https://www.apachefriends.org/download.html  进入下载界面选择XAMPP for Linux下载 启动终端输入命令  cd /下载xampp保存的路径.我的保存路径是:/home/coderose/下载.更改安装程