使用 GNU GCC 和 GDB 开发调试应用程序

gcc 命令的使用

在使用GCC编译程序时,编译过程可以被细分为四个阶段:

  1. 预处理(Pre-Processing)
  2. 编译(Compiling)
  3. 汇编(Assembling)
  4. 链接(Linking)

如果不加任何参数, gcc 默认执行所有的操作,直接生成可执行文件。

以上四个阶段对应参数为:

1.        -E  只执行预处理

2.        –S  只编译,不汇编和链接

3.        –c  编译汇编不链接

4.        –o  链接成目标文件

GCC常用选项

-c 通知GCC取消链接步骤,即编译源码并在最后生成目标文件;

-Dmacro 定义指定的宏,使它能够通过源码中的#ifdef进行检验;

-E 不经过编译预处理程序的输出而输送至标准输出;

-g3 获得有关调试程序的详细信息,它不能与-o选项联合使用;

-Idirectory 在包含文件搜索路径的起点处添加指定目录;

-llibrary 提示链接程序在创建最终可执行文件时包含指定的库;

-O、-O2、-O3 将优化状态打开,该选项不能与-g选项联合使用;

-S 要求编译程序生成来自源代码的汇编程序输出;

-v 启动所有警报;

-Wall 在发生警报时取消编译操作,即将警报看作是错误;

-Werror 在发生警报时取消编译操作,即把报警当作是错误;

-w 禁止所有的报警。

gdb 调试工具的使用

基本gdb命令:

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

命令          简写        功能

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

file                            装入想要调试的可执行文件.

kill            k              终止正在调试的程序.

list            l              列出产生执行文件的源代码的一部分.

next          n             执行一行源代码但不进入函数内部.

step         s             执行一行源代码而且进入函数内部.

continue  c              继续执行程序,直至下一中断或者程序结束。

run            r              执行当前被调试的程序.

quit           q              终止 gdb.

watch                       使你能监视一个变量的值而不管它何时被改变.

catch                         设置捕捉点.

thread      t              查看当前运行程序的线程信息.

break       b             在代码里设置断点, 这将使程序执行到这里时被挂起.

make                        使你能不退出 gdb 就可以重新产生可执行文件.

shell                         使你能不离开 gdb 就执行 UNIXshell 命令.

print         p             打印数据内容。

examine  x              打印内存内容。

backtracebt             查看函数调用栈的所有信息。

实例分析

代码:

#define _GNU_SOURCE
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

#define info(addr) printf("%30s @ %12p\n", #addr, &addr)
int global_var = 1;
static int static_global_var = 2;

int
local_function(int var)
{
        int local_function_var = var;
        static int static_local_function_var = 6;
        info(static_local_function_var);
        info(local_function_var);
        return local_function_var;
}

int
main(int argc, char *argv[])
{
        local_function(0);
        int main_function_var = 3;
        static int static_main_var = 4;
        info(global_var);
        info(static_global_var);
        info(static_main_var);
        info(main_function_var);
        info(main);
        info(local_function);
        return 0;
}

编译可调式的目标文件并运行:

[email protected]:~/workspace/test$ gcc-o test test.c
[email protected]:~/workspace/test$./test
    static_local_function_var @    0x60102c
           local_function_var @ 0x7fffc2487a3c
                    global_var @     0x601020
            static_global_var @     0x601024
               static_main_var @     0x601028
            main_function_var @ 0x7fffc2487a6c
                          main @     0x400541
                local_function @     0x4004f4

[email protected]:~/workspace/test$ gcc-o test -g test.c

[email protected]:~/workspace/test$./test

static_local_function_var @    0x60102c

local_function_var @ 0x7fff97a0869c

global_var @     0x601020

static_global_var @     0x601024

static_main_var @     0x601028

main_function_var @ 0x7fff97a086cc

main @     0x400541

local_function @     0x4004f4

[email protected]:~/workspace/test$ gdb./test

GNU gdb (Ubuntu/Linaro7.4-2012.04-0ubuntu2) 7.4-2012.04

Copyright (C) 2012 Free SoftwareFoundation, Inc.

License GPLv3+: GNU GPL version 3 or later<http://gnu.org/licenses/gpl.html>

This is free software: you are free tochange and redistribute it.

There is NO WARRANTY, to the extentpermitted by law.  Type "showcopying"

and "show warranty" for details.

This GDB was configured as"x86_64-linux-gnu".

For bug reporting instructions, please see:

<http://bugs.launchpad.net/gdb-linaro/>...

Reading symbols from/home/jxdong/workspace/test/test...done.

(gdb) b 32

Breakpoint 1 at 0x400608: file test.c, line32.

(gdb) run

Starting program:/home/jxdong/workspace/test/test

static_local_function_var @    0x60102c

local_function_var @ 0x7fffffffe24c

global_var @     0x601020

static_global_var @     0x601024

static_main_var @     0x601028

main_function_var @ 0x7fffffffe27c

main @     0x400541

local_function @     0x4004f4

Breakpoint 1, main (argc=1,argv=0x7fffffffe368) at test.c:32

32              return 0;

(gdb) bt full

#0 main (argc=1, argv=0x7fffffffe368) at test.c:32

main_function_var = 3

static_main_var = 4

(gdb) info proc

process 32545

cmdline = ‘/home/jxdong/workspace/test/test‘

cwd = ‘/home/jxdong/workspace/test‘

exe = ‘/home/jxdong/workspace/test/test‘

(gdb)

process 32545

cmdline =‘/home/jxdong/workspace/test/test‘

cwd = ‘/home/jxdong/workspace/test‘

exe = ‘/home/jxdong/workspace/test/test‘

(gdb) info proc map

process 32545

Mapped address spaces:

Start Addr           End Addr       Size    Offset objfile

0x400000           0x401000     0x1000        0x0 /home/jxdong/workspace/test/test

0x600000           0x601000     0x1000        0x0 /home/jxdong/workspace/test/test

0x601000           0x602000     0x1000    0x1000 /home/jxdong/workspace/test/test

0x7ffff7a1a000    0x7ffff7bcf000   0x1b5000        0x0 /lib/x86_64-linux-gnu/libc-2.15.so

0x7ffff7bcf000    0x7ffff7dcf000   0x200000   0x1b5000 /lib/x86_64-linux-gnu/libc-2.15.so

0x7ffff7dcf000    0x7ffff7dd3000     0x4000   0x1b5000 /lib/x86_64-linux-gnu/libc-2.15.so

0x7ffff7dd3000     0x7ffff7dd5000     0x2000  0x1b9000 /lib/x86_64-linux-gnu/libc-2.15.so

0x7ffff7dd5000    0x7ffff7dda000     0x5000        0x0

0x7ffff7dda000    0x7ffff7dfc000    0x22000        0x0 /lib/x86_64-linux-gnu/ld-2.15.so

0x7ffff7fe9000     0x7ffff7fec000     0x3000        0x0

0x7ffff7ff8000    0x7ffff7ffb000     0x3000        0x0

0x7ffff7ffb000    0x7ffff7ffc000     0x1000        0x0 [vdso]

0x7ffff7ffc000    0x7ffff7ffd000     0x1000    0x22000 /lib/x86_64-linux-gnu/ld-2.15.so

0x7ffff7ffd000    0x7ffff7fff000     0x2000    0x23000 /lib/x86_64-linux-gnu/ld-2.15.so

0x7ffffffde000    0x7ffffffff000    0x21000        0x0 [stack]

0xffffffffff600000 0xffffffffff601000    0x1000        0x0 [vsyscall]

使用 GNU GCC 和 GDB 开发调试应用程序,布布扣,bubuko.com

时间: 2024-12-28 18:18:16

使用 GNU GCC 和 GDB 开发调试应用程序的相关文章

windows下使用MinGW的调试工具gdb.exe调试C程序

1.编译源代码 C:MinGW\bin>gcc.exe -g -o program.exe program.c 编译选项上要加上“g”,这样生成的目标程序会含有调试内容,再用gdb调试的时候才能使用.显然加上“g”选项生成的应用程序会比不加的大,但两者运行时没有差别. 2.启动调试 C:MinGW\bin>gdb.exe program.exe 3.设置断点并启动运行 (gdb)break main(gdb)start 不能直接start,因为程序运行太快了,直接start就运行到程序停止的地

使用gdb+gdbserver调试应用程序

目录 一.gdb基本使用 1. 启动gdb 2. gdb交互式命令 二.gdb + gdbserver 实现远程调试 一.gdb基本使用 ? GDB是一个由GNU开源组织发布的.UNIX/LINUX操作系统下的.基于命令行的.功能强大的程序调试工具. 对于一名Linux下工作的c++程序员,gdb是必不可少的工具: 1. 启动gdb ? 对于C/C++程序,编译的时候需要加上 -g 参数生成调试信息.如:gcc -g hello.c -o hello 调试可执行程序 $gdb 程序名称 $gdb

搭建Hadoop2.5.2+Eclipse开发调试环境

一.简介 为了开发调试方便,本文介绍在Eclipse下搭建开发环境,连接和提交任务到Hadoop集群. 二.安装前准备: 1)Eclipse:Luna 4.4.1 2)eclipse插件:hadoop-eclipse-plugin-2.6.0.jar 3)hadoop版本:hadoop-2.6.0.tar.gz 三.环境搭建 1.安装eclipse 2.安装插件 将插件hadoop-eclipse-plugin-2.5.2.jar,下载后放到eclipse/plugins目录即可 3.配置had

windows下使用eclipse调试C程序

一.环境描述 Eclipse IDE for C/C++ Developers version 4.4.0 MinGW  gcc/g++ version 4.8.1;gdb version 7.6.1 二.操作步骤 1.新建工程 2.编译源程序 3.调试设置 Run-->Debug Configurations-->Debugger,设置调试器目标 4.启动调试 三.说明 windows下Eclipse调试C程序时,会出现无法使用printf和scanf的情况:console没有输出.原因是由

使用VS+VisualGDB编译调试Linux程序

Linux程序开发变得越来越多,越来越多的程序.产品需要跨平台,甚至有些开源项目只支持Linux平台,所以掌握Linux开发变得越来越重要. 但是对于习惯了Windows下的开发,使用了VS这个宇宙第一IDE后,觉得Linux下的纯命令行开发调试,还是有些不习惯,效率有些低(大神除外).那么能不能用VS来开发调试Linux程序呢,经过各种查找,找到了VisualGDB这个神奇的插件,通过VS+VisualGDB就可以编译调试Linux程序. 下面我们来看一下创建demo的过程吧. 配置虚拟机 V

软件开发--调试器GDB

一.GDB介绍 A.GDB1.GNU项目中的调试器2.能够追踪程序的执行,也能够恢复程序崩溃前的状态B.GDB的重要性1.软件不是一次性开发完成的(是软件就有bug,是程序就有问题)2.调试时软件开发过程中不可或缺的技术C.GDB的常规应用1.自定义程序的启动方式(指定影响程序运行的参数)2.设置条件断点(在条件满足时暂停程序的执行)3.回溯检查导致程序异常结束的原因4.动态改变程序执行流(定位问题的辅助方式)D.GDB的启动方式1.直接启动--gdb ,gdb test.out ,gdb te

20150502 调试分析之 使用gdb远程调试ARM开发板

20150502 调试分析之 使用gdb远程调试ARM开发板 2015-05-02 Lover雪儿 今天我们要学习的是使用gdb和gdbserver来远程调试开发板程序. 下面是本人的一些具体步骤: 下载gdb-7.9.tar.gz地址: http://ftp.gnu.org/gnu/gdb/gdb-7.9.tar.gz 安装gdb tar -jxvf gdb-7.9.tar.bz2 ./configure -target=arm-none-linux-gnueabi --prefix=/hom

使用GDB在ARM上进行开发调试

一.安装GDB及GDB server 1.1 GDB简介 GDB调试环境由宿主机GDB和目标开发板的GDB server共同构成,两者通过串口或TCP连接.使用GDB标准串行协议协同工作,实现对目标机的系统内核和上层应用的监控和调试功能. GdbServer是GDB的一个组件,但通常不随发行版本的GDB一同发布,需要用户自行编译GDB的源代码包得到相应的GDB和GDBServer,可以从下载地址:http://ftp.gnu.org/gnu/gdb/,或者百度获取下载地址. 1.2 安装GDB

使用gcc编译gdb调试

gcc 在linux系统中,默认是没有安装gcc编译器的,可以通过命令 rpm -q | grep gcc 来查看.安装命令为: yum -y install gcc 安装后,编写一个.c结尾的文件. gcc test.c 就会默认输出一个a.out的输出文件,这个输出文件就是可执行文件. 如果加上-o选项,则可以自定目标文件. gcc -o test test.c test就是它的可执行文件. 一般都默认加上-Wall 选项,可以自动提示一些出错警告的信息. gcc -Wall -o test