`

基础编程学习笔记一(程序的编译与调试)

 
阅读更多

程序的编译与调试
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) 退出

分享到:
评论

相关推荐

    (完整版)Python基础学习笔记.docx

    (完整版)Python基础学习笔记 (完整版)Python基础学习笔记全文共69页,当前为第1页。(完整版)Python基础学习笔记全文共69页,当前为第1页。Python 基础学习笔记 (完整版)Python基础学习笔记全文共69页,当前为第1页。...

    c#学习笔记.txt

    c#学习笔记(1) 51099在线学习网发布 文章来源:网络收集 发布时间:2006-05-25 字体: [大 中 小] 51099在线学习网 http://www.51099.com 1, 结构(struct) 与 类(class) [attributes] [modifiers] struct ...

    python学习笔记-王纯业

    以下是一个Python学习笔记的大纲,涵盖了从基础到进阶的内容。你可以根据自己的学习进度和理解情况,逐步填充和完善这个大纲。 Python学习笔记大纲 一、Python基础 Python简介 Python的历史 Python的特点和应用...

    (自学笔记)最全嵌入式Linux学习手册.docx

    本书全面介绍了嵌入式linux系统开发过程中,从底层系统支持到上层gui应用的方方面面,内容涵盖linux操作系统的安装及相关工具的使用、配置,嵌入式编程所需要的基础知识(交叉编译工具的选项设置、makefile语法、arm...

    Linux与嵌入式(个人总结笔记,可自行删改)

    第三章:Linux环境下的C编程(GCC编译过程和GCC编译指令,GDB调试器) 第四章:c程序维护工具 make (makefile文件命名规则,含有PDF文件,内嵌在word里面,可打开,伪目标,简化,makefile变量等内容) 第五章:ARM...

    02_Linux内核分析及编程高清pdf版(2-2)

    全书分为20章,内容包括进程管理、进程间通信、内存管理、文件系统、I/O接口及资源管理、内核的编译及调试原理、网络通信、内核安全、USB驱动程序等。 对于想了解Linux开发,以及从事Linux内核编程的开发人员来说,...

    asp.net知识库

    VS2005 ASP.NET本地化学习笔记&感受 在自定义Server Control中捆绑JS文件 Step by Step 深度解析Asp.Net2.0中的Callback机制 使用 Web 标准生成 ASP.NET 2.0 Web 站点 ASP.NET 2.0基于SQLSERVER 2005的aspnetdb.mdf...

    汇编语言笔记 参考《汇编语言 第三版》王爽.zip

    - **教学与理解计算机原理**:学习汇编语言有助于深入理解计算机体系结构、指令集、内存管理和硬件接口等基础概念。 ### 编程特点与挑战 - **手动管理内存**:程序员需要手动分配和释放内存,跟踪数据在内存中的...

    ROS机器人程序设计

    该章介绍节点、主题和服务,以及如何使用它们,还将通过一系列示例说明如何调试一个节点或利用可视化方法直观地查看通过主题发布的消息。, 第3章进一步展示ROS强大的调试工具,以及通过对节点主题的图形化将节点间的...

    华为深度学习框架MindSpore正式开源:自动微分不止计算图.md

    主流深度学习框架中主要有**三种自动微分技术,才用的不是静态计算图、动态计算图,而是基于**源码**转换:该技术源以**函数式编程框架**为基础,以**即时编译(JIT)**的方式**在中间表达(编译过程中程序的表达...

    【软件加密_技术内幕】

    [Trial version] 第7章 如何让壳与程序融为一体 [Trial version] 7.2 欺骗检查壳的工具 [Trial version] 让侦测工具把壳识别为VC++.htm [Trial version] 7.4 使用sdk把程序和壳溶为一体 [Trial version] 实现...

    自己动手写操作系统(含源代码).part1

    在第二版中,你将会看到,你已经可以通过交叉编译的方式为我们的实验性 OS编写应用程序了,也就是说,它已经具备操作系统的基本功能,虽然仍然极其简陋,但第一个圈,毕竟是已经圆起来了。第三,实践类的操作系统...

    若干源程序资料12.rar

    2012-06-11 21:41 0 OpenGL编程基础 源码.zip 2012-06-11 21:26 55,505 PHP实现多服务器共享SESSION数据.docx 2012-06-11 21:40 49,392 Pointers on C.zip 2012-06-11 21:22 3,386,253 RTOS_MDK uCOS-II for STM32...

    自己动手写操作系统(含源代码).part2

    在第二版中,你将会看到,你已经可以通过交叉编译的方式为我们的实验性 OS编写应用程序了,也就是说,它已经具备操作系统的基本功能,虽然仍然极其简陋,但第一个圈,毕竟是已经圆起来了。第三,实践类的操作系统...

    over-cs:基于Linux的CS知识:[进度01%]操作系统、计算机网络、计算机组成原理、数据库概论等CS知识,附录基础的编译原理、C语言、汇编等

    :最好的汇编入门书籍:王爽的汇编语言看完之后可看此书:适合 windows 下的调试进阶一 计算机组成原理:csapp,必读经典,建议英文版:必读经典,建议英文版二 操作系统2.0 系统使用《鸟哥的私房菜:基础学习篇》:...

    高仿版百度地图基于iOS SDK v2.5.0,功能完善!

    其他的代码有点编程基础的同学应该很快就能看懂了,毕竟我也是第一次写iOS程序的啊,我都行你们肯定行的!由于时间拖久了,现在最新版是iOS SDK v2.6.0,更新的内容也是不少,有强迫症的朋友请自行替换2.6.0的lib。...

    leetcode下载-learning_go:我在学习去!

    一个排序的小工具(来自go语言编程一书) 将sorter目录加入GOPATH,就可以进行编译,测试和运行了。 : gin框架学习 环境问题 设置GOPATH 在.bash_profile中加入: export GOPATH=/Users/kevin/go export GOBIN=$GOPATH...

Global site tag (gtag.js) - Google Analytics