程序的编译与调试
gcc (gnu c compiler)
gcc所支持的后缀名
.c c原始程序
.C/.cc/.cxx c++原始程序
.i 已经预处理的c原始程序
.ii 已经预处理的c++原始程序
.s/.S 汇编语言原始程序
.h 预处理文件
.o 目标文件
.a/.so 编译后的库文件
gcc的编译流程
预处理
编译
汇编
链接
gcc 的总体选项
-c 只编译不链接,生成目标文件.o
-S 只编译不汇编,生成汇编代码
-E 只进行预编译
-g 在可执行程序中包含标准调试信息
-o file 把输出文件输出到file中
-v 打印出编译器内部编译各过程的命令行信息和编译器版本
-I 在头文件的搜索路径列表中添加dir目录
-static 链接静态库
-llibrary 链接名为 library的库文件
gcc的安装
[root@localhost Server]#yun install gcc
示例代码如下
[retacn@localhost tmp]$ vi hello.c
#include <stdio.h>
int main (void){
printf("hello world\n");
return 0;
}
使用gcc编译命令
[retacn@localhost tmp]$ gcc hello.c -o hello
运行程序
[retacn@localhost tmp]$ ./hello
hello world
只进行预编译不作其他处理
[retacn@localhost tmp]$ gcc -E hello.c -o hello.i
[retacn@localhost tmp]$ cat hello.i
extern char *ctermid (char *__s) __attribute__ ((__nothrow__));
# 814 "/usr/include/stdio.h" 3 4
extern void flockfile (FILE *__stream) __attribute__ ((__nothrow__));
extern int ftrylockfile (FILE *__stream) __attribute__ ((__nothrow__)) ;
extern void funlockfile (FILE *__stream) __attribute__ ((__nothrow__));
# 844 "/usr/include/stdio.h" 3 4
# 2 "hello.c" 2
int main (void){
printf("hello world\n");
return 0;
}
只编译不汇编,生成汇编代码
[retacn@localhost tmp]$ gcc -S hello.i -o hello.s
[retacn@localhost tmp]$ cat hello.s
.file "hello.c"
.section .rodata
.LC0:
.string "hello world"
.text
.globl main
.type main, @function
main:
leal 4(%esp), %ecx
andl $-16, %esp
pushl -4(%ecx)
pushl %ebp
movl %esp, %ebp
pushl %ecx
subl $4, %esp
movl $.LC0, (%esp)
call puts
movl $0, %eax
addl $4, %esp
popl %ecx
popl %ebp
leal -4(%ecx), %esp
ret
.size main, .-main
.ident "GCC: (GNU) 4.1.2 20080704 (Red Hat 4.1.2-52)"
.section .note.GNU-stack,"",@progbits
只编译不链接,生成目标文件.o
[retacn@localhost tmp]$ gcc -c hello.s -o hello.o
[retacn@localhost tmp]$ gcc hello.o -o hello
[retacn@localhost tmp]$ ./hello
hello world
在可执行程序中包含标准调试信息
[retacn@localhost tmp]$ gcc -g hello.c -o hello2
完成程序的优化工作
[retacn@localhost tmp]$ gcc -O2 hello.c -o hello3
[retacn@localhost tmp]$ ll
总计 288
-rwxrw-r-- 1 retacn retacn 158 01-04 03:45 function.main
-rwxrwxr-x 1 retacn retacn 4941 01-10 04:23 hello
-rwxrwxr-x 1 retacn retacn 6105 01-10 04:26 hello2
-rwxrwxr-x 1 retacn retacn 4957 01-10 04:27 hello3
=============================================================
gdb程序调试
启动被调试程序
让被调用的程序在指定的位置停住(有点像断点)
当程序停住时,可以检查程序状态
g++安装
[root@localhost ~]# yum install gdb
程序调试示例代码如下:
#include <stdio.h>
int main(void){
int i;
long result=0;
for(i=1;i<=100;i++){
result+=i;
}
printf("result=%d\n",result);
return 0;
}
编译程序
[root@localhost tmp]# gcc -g tst.c -o tst
启动gdb
[root@localhost tmp]# gdb tst
也可以使用
[root@localhost tmp]# gdb
(gdb) file 文件名
设置断点
(gdb) b main
Breakpoint 1 at 0x80483b5: file tst.c, line 4.
运行程序
(gdb) run
Starting program: /home/retacn/tmp/tst
warning: .dynamic section for "/lib/libc.so.6" is not at the expected address
warning: difference appears to be caused by prelink, adjusting expectations
Breakpoint 1, main () at tst.c:4
4 long result=0;
单步执行
(gdb) next
5 for(i=1;i<=100;i++){
安成执行
(gdb) c
Continuing.
result=5050
Program exited normally.
gdb命令
list(l)查看程序
break(b) 函数名 在函数入口添加断点
break(b) 行号 在指定行添加断点
break(b) 文件名:行号 在指定文件的指定行添加断点
break(b) 行号 if 条件 当条件为真时,在指定行添加断点
inf break 查看所有设置断点
delete 断点编号 删除段点
run(r) 开始执行程序
next(n) 单步运行程序(不进入子函数)
step(s) 单步运行程序(进入子函数)
continue(c) 继续运行程序
print(p)变量名 查看指定变量值
finish 运行程序,直到当前函数结束
watch 变量名 对指定变量进行监控
quit(q) 退出
- 浏览: 260843 次
- 性别:
- 来自: 济南
文章分类
- 全部博客 (303)
- c (31)
- c++ (16)
- java (18)
- c# (1)
- python (3)
- java web (6)
- oracle (7)
- sqlserver (2)
- mysql (2)
- android (24)
- android系统 (15)
- android多媒体部分 (15)
- android游戏 (12)
- linux (26)
- javaScript (1)
- ajax (1)
- node JS (2)
- html (5)
- apache (3)
- jboss (1)
- weblogic (0)
- 通信协议 (10)
- 云计算 (1)
- 分布式 (5)
- ejb (1)
- webservice (5)
- 设计模式 (16)
- JNI (6)
- swing (13)
- 版本控制 (1)
- UML (1)
- xml (4)
- spring (5)
- hibernate (5)
- struts1 (3)
- struts2 (4)
- ibatis (0)
- tomcat (2)
- 心得体会 (1)
- css (1)
- 嵌入式 (41)
- arm体系结构 (10)
发表评论
-
u-boot Makefile 文件分析
2013-06-01 21:44 2422Makefile文件分析 # #(C)Copyri ... -
uboot start.S文件分析
2013-06-03 22:18 1319U-boot第一个开始文件arch\arm\cpu\arm1 ... -
u-boot mkconfig文件分析
2013-05-31 21:29 1133Mkconfig文件分析 #!/bin/ ... -
链接地址学习笔记
2013-05-05 12:40 1282链接地址 启动过程 示例代码如下: ... -
DDR学习笔记
2013-05-11 14:19 1036DDR 15条地址线32k 128M*2(20)=2(2 ... -
nand flash学习笔记一
2013-05-13 21:05 958Nandflash 原理图上有data0-data7 ... -
openJTAG学习笔记一
2013-05-22 21:45 2173安装软件 光盘Windows\install目录下的 01.O ... -
linux进程管理学习笔记
2013-03-28 20:57 1355linux 进程管理 1 linux进程控制 进程的四个要素: ... -
字符设备驱动程序学习笔记一
2013-04-01 21:55 879linux 驱动程序 字符设备驱动程序 网络接口驱动程序 块设 ... -
字符设备驱动程序学习笔记二
2013-04-04 10:29 751字符驱动程序 1 设备号 字符设备通过字符设备文件来存取 ls ... -
字符设备驱动程序学习笔记三
2013-04-04 14:03 780memdev.h文件示例代码如下: #ifndef _MEM ... -
字符设备驱动程序学习笔记四
2013-04-05 11:12 582竟争与互斥 程序调试 1 ... -
GPIO学习笔记
2013-04-14 19:50 809用汇编点亮一个led 1看原理图GPK4=0,led亮G ... -
系统时钟学习笔记
2013-05-04 21:59 83312m晶振----->pll------>cpu ... -
UART学习笔记
2013-05-04 22:00 1150串口(UART) DIV_VAL=(PCLK/(bpsx1 ... -
linux内存管理学习笔记
2013-03-12 20:50 10651 linux内存管理 地址类型 物理地址 出现在cpu地址 ... -
嵌入式linux系统学习笔记
2013-03-06 21:39 964嵌入式linux内核制作 1 清除原有配置文件与中间文件 x8 ... -
原理图学习笔记一
2013-02-17 22:24 400画个草图也挺过瘾 -
进程间通信学习笔记一(管道通信)
2013-02-01 20:08 1409进程间通信(ipc) 应用场景: 数据传输 资源共享 通知事件 ... -
进程间通信学习笔记二(信号通信)
2013-02-16 21:39 784信号通信 用户按某些键时,产生信号 硬件异常产生信号 进程用k ...
相关推荐
《Visual C++ 程序设计学习笔记1~12章源代码》涵盖了广泛的编程概念和技术,这是一份深入理解Microsoft Visual C++编程环境的宝贵资料。这份笔记不仅包括了基础的C++语法和编程技巧,还涉及了高级主题,如多线程、...
【PostgreSQL学习笔记:搭建Postgres在Windows上的编译调试环境】 PostgreSQL是一种开源的关系型数据库管理系统,具有高度可扩展性和强大的功能。在Windows平台上搭建PostgreSQL的编译调试环境,可以帮助开发者深入...
《ICCAVR学习笔记——程序、电路与编程详解》 在深入探讨ICCAVR的学习过程中,我们首先要明白,ICCAVR是一种基于AVR微控制器的集成开发环境,它为开发者提供了编写、编译和调试嵌入式系统程序的平台。本学习笔记...
《Visual C++程序设计学习笔记》是一份深入探讨VC++编程技术的综合资料,涵盖了从基础知识到实际系统开发的广泛内容。Visual C++是Microsoft公司推出的一种强大的集成开发环境,它集成了C++编译器、调试器以及MFC...
### Oracle PL/SQL编程核心知识点解析 ...掌握这些基础和进阶技能,对于高效进行数据库编程和维护至关重要。通过实践以上知识点,开发者能够构建健壮、高效的数据库应用程序,充分利用Oracle数据库的强大功能。
### 反编译学习笔记详解 #### 反编译基础概念与重要性 反编译是一种将二进制代码转换回高级语言源代码的过程,它对于理解软件内部工作原理、进行安全审计、修复旧代码以及逆向工程等方面具有重要意义。在初学反...
本压缩包包含的“C语言学习笔记”是一份详尽的C语言学习资料,旨在帮助读者深入理解和掌握C语言的基本概念、语法结构以及实际应用技巧。 一、C语言基础 C语言的基础包括变量、数据类型、运算符、流程控制等。变量...
本学习笔记将围绕Visual C++的使用、程序设计原理及其实战应用展开,帮助读者从零开始掌握这一强大的编程语言。 首先,我们来了解Visual C++的基础知识。Visual C++提供了Microsoft Foundation Classes (MFC),这是...
* 1.6 Eclipse/Myeclipse程序结构:Eclipse和Myeclipse是流行的Java开发环境,提供了项目管理、代码编辑、编译、调试等功能。 二、Java语言基础 * 2.1 基础语言要素:Java语言的基础要素包括变量、数据类型、...
总结来说,这份学习笔记为学习Go语言的读者提供了一个详尽的路线图,从基础语法、函数、数据结构到并发编程,再到深入理解标准库和高级特性,循序渐进地指导读者掌握Go语言。这些知识点对于想要深入学习Go语言的...
本资源包含的是Visual C++程序设计的学习笔记,涵盖了从基础到进阶的12个章节的源代码,对于学习和理解C++编程,特别是使用Visual C++环境编程,具有极高的参考价值。 首先,我们来详细探讨一下Visual C++的关键...
Linux学习笔记 本文档主要记录了 Linux ...本文档记录了 Linux 操作系统的学习笔记,涵盖了 Basic 的编程、VI 编辑器的使用、GCC 编译器的应用、GDB 调试工具的使用等方面的知识点,为读者提供了一个系统的学习指南。
【浙大C程序设计听课学习笔记】是一份深入学习C语言的重要资料,主要涵盖了浙江大学C程序设计课程的核心知识点。这份笔记旨在帮助学习者系统地掌握C语言编程的基础和高级概念,提升编程技能,并能理解计算机科学的...
### Python学习笔记知识点详解 ...通过以上知识点的梳理,我们可以看出,“Python学习笔记.pdf”涵盖了Python语言的基础到高级的多个方面,是一份全面且实用的学习材料,适合初学者到有经验的开发者阅读和参考。
Go语言,又称Golang,是一种静态类型的编程语言,由Google开发,于2007年首次对外公布,并在2009年进行了...通过本学习笔记的内容,我们可以对Go语言有一个全面而系统的认识,为深入学习和应用Go语言打下坚实的基础。
首先,"Eclipse编程技术与实例"这部分内容可能涵盖了Eclipse的基础操作,如创建项目、编写代码、编译与运行、重构等。编程技术可能包括了插件开发、工作流定制,以及如何利用Eclipse的特性提高开发效率,例如使用...
在Python学习笔记中,作者皮大庆介绍了Python的基础知识,包括程序、调试、程序语言与自然语言的关系、第一个程序的编写等。接着,笔记进入了变量、表达式、语句等基础概念的讲解,逐步深入到函数的定义、使用、参数...
Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(现为...这些只是Java基础知识的一部分,通过深入学习"java基础知识学习笔记",你将能够掌握Java编程的核心概念,并为进一步的高级主题学习打下坚实基础。