一步一步学调试——gdb命令小结

之前想验证一些关于堆栈的问题,但是没什么好方法,printf实在局限,流于表面,只间表象(值、范围、规律)不见真身(地址、寄存器、过程),所以想到了gdb——一个强大的调试工具,还能看汇编代码,现在先把这两天学的常用的命令做一个小结,以后有用到的可能再来更新一下:


括号内为全称补全,缩写全称均可用。

例:(e)x(amine)表示既可以用x又可以用examine

(gdb)代表gdb环境命令行提示符。

关于缩写,非常类似Linux的shell中的tab功能,但是与shell不同的是有默认选择:

你不一定要写全,也不一定只写首字母,比如(gdb) layout 命令,如果写个l,那么缺省的是list,抢不过,写layout——又太麻烦,你只要写上la、lay、layo都行,抢不上槽没关系,只要有一点不同,就默认是你了。


1.进入gdb:

#gdb test -q(uiet)

其中test为目标可执行文件,-q代表不打印那一大串版本版权信息之类的刷屏字幕。

这里有个小常识就是用gcc编译目标文件test时,记得-g,表示可调试。

另外,直接进入gdb而未加载可执行文件,或者加载了目标文件,想换一个其他的——可以使用

(gdb)file test2

或者

(gdb)exec(-file) test2


1.2加载core文件

#gdb execfile core.xxxx

加载execfile出错产生的core文件,

Core was generated by `./coreTest'.
Program terminated with signal 11, Segmentation fault.
#0  0x080486e5 in main () at coreTest.cpp:16
16		cout << s1->i << endl;	
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.25.el6.i686 libgcc-4.4.5-6.el6.i686 libstdc++-4.4.5-6.el6.i686

可以看到,s1是NULL指针,从NULL指针找成员变量,core dumped。

core.xxxx是core文件的文件名,没修改设置的话,应该在当前路径。不过大前提是打开了core文件记录:

# ulimit -c 

查看core文件大小,0则代表关闭

# ulimit -c 1000

设置core文件大小,有大小代表打开,则出错能产生文件。


2.断点的设立:

(gdb)b(reakpoints) <rowNums...>

<rowNums...>代表想要设立断点的行数

忘了哪行是什么?没关系,你可以用list

(gdb) list
1	#include<stdio.h>
2	int main()
3	{
4		int i = 10;
5		i = 11;
6		printf("the address of i is %p and the value of i is %d\n",&i,i);
7	}
8	

另外,list也可以设置显示行数和指定位置的

(gdb)list

(gdb)list 10

(gdb)list 5,10

(gdb)func

比如默认显示10行,可以指定第5到第10行,指定显示某函数代码,等等。

不过最好的建议还是开俩终端,一边看代码,一边调试,看着舒服。

另外

(gdb) layout

也可以显示程序代码,还是用框子圈起来的,高大上。


(gdb)b func

(gdb)b *func

在函数func()设立断点,星号代表进入前,插结果——一目了然~!

(gdb) b *main
Breakpoint 1 at 0x80483e4: file testPC.c, line 3.
(gdb) b main
Breakpoint 2 at 0x80483ed: file testPC.c, line 4.
(gdb) info b
Num     Type           Disp Enb Address    What
1       breakpoint     keep y   0x080483e4 in main at testPC.c:3
2       breakpoint     keep y   0x080483ed in main at testPC.c:4
其中

(gdb)info b(reakpoints)

相当于列表打印所有已设立的断点。有了断点,当然也可以删掉断点,看到列表中左边的”Num“了么,用得上:

(gdb) d 1
(gdb) info b
Num     Type           Disp Enb Address    What
2       breakpoint     keep y   0x080483ed in main at testPC.c:4
(gdb) 
(gdb)d(elete) Num

代表删除第Num个断点。可以看到第一个断点被删了。

3.基本调试流程

有了断点,就该用上了。

第一步,开始运行程序:

(gdb)r(un)


(gdb)n(ext)


(gdb)s(tep)


和其他调试相仿,这两条分别代表step over和step in,


(gdb)c(ontinue)

run和continue功能其实差不多,都是继续往下运行,直到下一个断点停下来,不过场合不一样罢了:run是开始运行前的启动命令,continue是运行中的命令。



4.汇编style:

基本的流程走完了,该引入汇编了。

i代表指令(instruction)

不很确定,至少你不能用instruction代替i,至少,先理解为汇编的意思。

前边的指令加上i就显示了汇编代码,例如:

n(ext)i

s(tep)i


要想一步一步看汇编代码和执行过程,

(gdb)ni

(gdb)si

是必不可少的,不过你可以用回车表示继续使用上一次的命令。


前边提到list和layout显示源代码,其实layout还可以扩展一下用途

(gdb)layout asm

以窗口形式显示汇编代码




5.print:

gdb提供了打印功能:

示例:

(gdb)p(rint) i

打印i变量当前的值。

不仅程序中的变量,寄存器的值也能打印

(gdb) p $pc

两个小疑问:

5.1.$pc代表什么,除了它还能打印什么?

这句话其实就是打印程序计数器的值。

先说寄存器,除了$pc,还有%esp,%edp等等等等,

具体到底能打印那些,又要牵扯到另一条命令了,下面看一例:

(gdb)i(nfo) r(eg)
(gdb)
eax            0x80484f0    134513904
ecx            0xbffff304    -1073745148
edx            0xb    11
ebx            0xb7fc2ff4    -1208209420
esp            0xbffff240    0xbffff240
ebp            0xbffff268    0xbffff268
esi            0x0    0
edi            0x0    0
eip            0x8048406    0x8048406 <main+34>
eflags         0x200282    [ SF IF ID ]
cs             0x73    115
ss             0x7b    123
ds             0x7b    123
es             0x7b    123
fs             0x0    0
gs             0x33    51

上边看到的都可以print,而且能发现个小规律,这个info reg打印的,除了最左边是寄存器名称外,中间是寄存器存的值(也就是一个内存地址),右边是这个值对应的内存地址中的值。打印一下$eax可验证:
(gdb) p $eax
$3 = 134513904

其实用法远不止于此,比如p $打印上一次打印的值,$$打印上上次打印过的值。print其实是有计数器的,每次print打印,其实都有一个类似count++在内部发生,使用print $num 能显示第num个打印结果(如上,p $3就等价于p $eax),其他还有blabla~~~

至于为什么是$,贪心的外国人把各种变量都弄成美元$了,所以这个也是gdb下设置的环境变量~~开个玩笑。

其实,我猜,$也是为了区分变量和表达式吧~print可以打印表达式的。

与其说print不只打印变量(左值),还打印表达式(右值),不如说,按描述,print本来就是打印表达式的,只不过表达式包括变量。

欲知详情,可以使用help查看使用说明


5.2.C语言中printf有打印格式控制,那么gdb的print呢?

也有~

(gdb)p i
(gdb)p/a i
(gdb)p/c i
(gdb)p/f i
(gdb)p/x i
(gdb)p/o i
(gdb)p/d i
(gdb)p/t i
......

反斜杠后边这几个参数分别控制打印的进制与格式:
f浮点,c字符。。。
t为二进制,o八,x十六,d十
另外:a和x同样是打印十六进制,区别呢?可能就是不同名但同功能

理念有点像C语言编程时候加printf打印变量来监视程序。在gdb中你也可以随时打印各变量的值,而且更为强大(不用像C到处插打印命令,还能逐条执行,打印变量加地址加寄存器你说强大不)。


6.display

这是一种设置,设置好了调试过程中每一步都回显一次,有点像echo吧~~

示例:

(gdb) display /3i $pc
中,3指的是一次显示几行,不输入,缺省为1
但是~~~怎么修改,而且有一种错觉,通常都是一次定义以后,再怎么定义都不会变(有时候确实会变~!!!)~~~~~~~~~~~~
找到了

(gdb) undisplay <dnums...>
<dnums...>为编号,但是直观感觉上像是覆盖的,至少不知道怎么调回原来的设置
另外还有

delete display <dnums...>
disable display <dnums...>
enable display <dnums...>

至于怎么灵活用?是先info一下,然后再enable一下,就代表当前使用这种显示?
还是他们同时显示?所以造成了我“有些设置不起作用,有些能起作用”的错觉。
因为(行数)比原来多能“立刻见效”,比原来少则不能?

清空了重新si一遍,真正的原因是同时显示好几份。终端刷屏相似度太高眼花缭乱啊有木有~又没有clear功能~
一行的也有,二行的也有,三行的也有。所有设置的顺次显示一遍

(gdb) si
0xb7fec1ec in ?? () from /lib/ld-linux.so.2
7: x/i $pc
=> 0xb7fec1ec:    mov    %eax,%edi
6: x/2i $pc
=> 0xb7fec1ec:    mov    %eax,%edi
   0xb7fec1ee:    shr    $0x8,%edi
5: x/3i $pc
=> 0xb7fec1ec:    mov    %eax,%edi
   0xb7fec1ee:    shr    $0x8,%edi
   0xb7fec1f1:    mov    %edi,%ecx
4: x/i $pc
=> 0xb7fec1ec:    mov    %eax,%edi

通过info display打印显示表,可以查到自己的设置。

(gdb) info display
Auto-display expressions now in effect:
Num Enb Expression
7:   y  /1bi $pc
6:   y  /2bi $pc
5:   y  /3bi $pc
4:   y  /1bi $pc

最后,想看一下全部汇编代码,直接

(gdb)disassemble

或者去用objdump(题外)

7.bt

最近调服务器发现普通打印法已经很难跟住bug了,另一个原因是段错误就系统重启(其实是工程设置的信号处理,SIGSEGV段错误信号重启系统。),而gdb能在重启之前截断程序运行,从而卡在出错点,防止重启系统。

不过光卡在那也不行啊,一层套一层,那么多的函数调用,你不进去看不到东西啊,而且再输入n(next)往下走是看不到已经运行完的错误的,所以就谈到bt(backtrace)命令——回溯。


8.运行中的进程

都知道,运行gdb加载文件,或在gdb内部用file加载文件,想再运行程序等于新开一个进程。

现在想调试一个运行中的进程,而不是新启动一个进程。

#ps -aux | grep execFile

找到运行中的进程PID,

使用

#gdb execFile PID

#gdb 

(gdb) attach PID

即可连接正在运行中的进程,进行调试。



9.etc.

其他的乱七八糟,例如examine。


(e)xamine:功能和display差不太多,区别就是display是一种设置,每次跳命令显示一次,x是主动显示。

x/3i $pc显示3条指令(3为示范,数字可选)
(gdb)(e)x(amine)
语法:
x/<n/f/u> <addr>
n选择从当前地址向后显示几个
f是显示格式,还有s字符串和i整型
u表示从当前地址往后请求的字节数,如果不指定的话,GDB默认是4个bytes。u参数可以用下面的字符来代替,b表示单字节,h表示双字节,w表示四字节,g表示八字节。当我们指定了字节长度后,GDB会从指内存定的内存地址开始,读写指定字节,并把其当作一个值取出来。

例子:
x/3uh 0x54320表示,从地址0x54320读取,h表示以双字节为单位,3表示三个单位,u表示十六进制


=========================================================================================================================2016.2.21补充,

set 设置变量,可以在运行时通过断点加手动设置的方法来动态的改变变量值。也可以在程序运行前设置程序运行参数》》set args hello world

shell,顾名思义,使用shell命令,省得切出去了,另外,貌似也可以达到set args的效果。因为这下你终于可以直接在gdb界面通过命令行运行程序了

(gdb) shell ls

(gdb) shell ./a.out param1 param2

两例见

http://blog.csdn.net/huqinweI987/article/details/50706743


===========================================================================================================

0.HELP

前边print提到功能太多,方法太多,想知道最详细的,请
(gdb) help print
关于help的强大和使用方法,不赘述了,使用

(gdb) help

就什么都知道了。



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

ADDITIONAL:

GDB7.0以上(7.4)

可用如下套路:

(gdb)set disassemble-next-on

(gdb)b main
(gdb)r
(gdb)ni
(gdb)ni
.....
这个也是比较不错比较直观的方式

disas /m main
让C和汇编同时显示


部分标准描述属于借鉴,完全个人总结,权威性不强,不全面且定制化目的性强(为后边帖子做基础铺垫)~慎重转载

后续会根据个人经验进行更新补全。

欢迎交流~


  • 0
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
《嵌入式Linux应用程序开发标准教程(第2版)》主要分为3个部分,包括Linux基础、搭建嵌入式Linux环境和嵌入式Linux的应用开发。Linux基础部分从Linux基础、基本操作命令讲起,为Linux初者能快速入门提供了保证。接着系统地讲解了嵌入式Linux的环境搭建,以及嵌入式Linux的I/O与文件系统的开发、进程控制开发、进程间通信开发、网络应用开发、基于中断的开发、设备驱动程序的开发以及嵌入式图形界面的开发等,并且还安排了丰富的实验内容与课后实践,使读者能够边边用,更快更好地掌握所知识。   《嵌入式Linux应用程序开发标准教程(第2版)》可作为高等院校电子类、电气类、控制类等专业高年级本科生、研究生习嵌入式Linux的教材,也可供希望转入嵌入式领域的科研和工程技术人员参考使用,还可作为嵌入式培训班的教材和参考书。 第1章 Linux快速入门 1.1 嵌入式Linux基础 1.1.1 Linux发展概述 1.1.2 Linux作为嵌入式操作系统的优势 1.1.3 Linux发行版本 1.1.4 如何习Linux 1.2 Linux安装 1.2.1 基础概念 1.2.2 硬件需求 1.2.3 安装准备 1.3 Linux文件及文件系统 1.3.1 文件类型及文件属性 1.3.2 文件系统类型介绍 1.3.3 Linux目录结构 1.4 实验内容——安装Linux操作系统 1.5 本章小结 1.6 思考与练习 第2章 Linux基础命令 2.1 Linux常用命令 2.1.1 用户系统相关命令 2.1.2 文件相关命令 2.1.3 压缩打包相关命令 2.1.4 文件比较合并相关命令 2.1.5 网络相关命令 2.2 Linux启动过程详解 2.2.1 概述 2.2.2 内核引导阶段 2.2.3 init阶段 2.3 Linux系统服务 2.3.1 独立运行的服务 2.3.2 xinetd设定的服务 2.3.3 系统服务的其他相关命令 2.4 实验内容 2.4.1 在Linux下解压常见软件 2.4.2 定制Linux系统服务 2.5 本章小结 2.6 思考与练习 第3章 Linux下C编程基础 3.1 Linux下C语言编程概述 3.1.1 C语言简单回顾 3.1.2 Linux下C语言编程环境概述 3.2 常用编辑器 3.2.1 进入vi 3.2.2 初探emacs 3.3 gcc编译器 3.3.1 gcc编译流程解析 3.3.2 gcc编译选项分析 3.4 gdb调试器 3.4.1 gdb使用流程 3.4.2 gdb基本命令 3.5 make工程管理器 3.5.1 makefile基本结构 3.5.2 makefile变量 3.5.3 makefile规则 3.5.4 make管理器的使用 3.6 使用autotools 3.6.1 autotools使用流程 3.6.2 使用autotools所生成的makefile 3.7 实验内容 3.7.1 vi使用练习 3.7.2 用gdb调试程序的bug 3.7.3 编写包含多文件的makefile 3.7.4 使用autotools生成包含多文件的makefile 3.8 本章小结 3.9 思考与练习 第4章 嵌入式系统基础 4.1 嵌入式系统概述 4.1.1 嵌入式系统简介 4.1.2 嵌入式系统发展历史 4.1.3 嵌入式系统的特点 4.1.4 嵌入式系统的体系结构 4.1.5 几种主流嵌入式操作系统分析 4.2 ARM处理器硬件开发平台 4.2.1 ARM处理器简介 4.2.2 ARM体系结构简介 4.2.3 ARM9体系结构 4.2.4 S3C2410处理器详解 4.3 嵌入式软件开发流程 4.3.1 嵌入式系统开发概述 4.3.2 嵌入式软件开发概述 4.4 实验内容——使用JTAG烧写NandFlash 4.5 本章小结 4.6 思考与练习 第5章 嵌入式Linux开发环境的搭建 5.1 嵌入式开发环境的搭建 5.1.1 嵌入式交叉编译环境的搭建 5.1.2 超级终端和minicom配置及使用 5.1.3 下载映像到开发板 5.1.4 编译嵌入式Linux内核 5.1.5 Linux内核源码目录结构 5.1.6 制作文件系统 5.2 U-Boot移植 5.2.1 Bootloader介绍 5.2.2 U-Boot概述 5.2.3 U-Boot源码导读 5.2.4 U-Boot移植主要步骤 5.3 实验内容——创建Linux内核和文件系统 5.4 本章小结 5.5 思考与练习 第6章 文件I/O编程 6.1 Linux系统调用及用户编程接口(API) 6.1.1 系统调用 6.1.2 用户编程接口(API) 6.1.3 系统命令 6.2 Linux中文件及文件描述符概述 6.3 底层文件I/O操作 6.3.1 基本文件操作 6.3.2 文件锁 6.3.3 多路复用 6.4 嵌入式Linux串口应用编程 6.4.1 串口概述 6.4.2 串口设置详解 6.4.3 串口使用详解 6.5 标准I/O编程 6.5.1 基本操作 6.5.2 其他操作 6.6 实验内容 6.6.1 文件读写及上锁 6.6.2 多路复用式串口操作 6.7 本章小结 6.8 思考与练习 第7章 进程控制开发 7.1 Linux进程概述 7.1.1 进程的基本概念 7.1.2 Linux下的进程结构 7.1.3 Linux下进程的模式和类型 7.1.4 Linux下的进程管理 7.2 Linux进程控制编程 7.3 Linux守护进程 7.3.1 守护进程概述 7.3.2 编写守护进程 7.3.3 守护进程的出错处理 7.4 实验内容 7.4.1 编写多进程程序 7.4.2 编写守护进程 7.5 本章小结 7.6 思考与练习 第8章 进程间通信 8.1 Linux下进程间通信概述 8.2 管道 8.2.1 管道概述 8.2.2 管道系统调用 8.2.3 标准流管道 8.2.4 FIFO 8.3 信号 8.3.1 信号概述 8.3.2 信号发送与捕捉 8.3.3 信号的处理 8.4 信号量 8.4.1 信号量概述 8.4.2 信号量的应用 8.5 共享内存 8.5.1 共享内存概述 8.5.2 共享内存的应用 8.6 消息队列 8.6.1 消息队列概述 8.6.2 消息队列的应用 8.7 实验内容 8.7.1 管道通信实验 8.7.2 共享内存实验 8.8 本章小结 8.9 思考与练习 第9章 多线程编程 9.1 Linux线程概述 9.1.1 线程概述 9.1.2 线程机制的分类和特性 9.2 Linux线程编程 9.2.1 线程基本编程 9.2.2 线程之间的同步与互斥 9.2.3 线程属性 9.3 实验内容——“生产者消费者”实验 9.4 本章小结 9.5 思考与练习 第10章 嵌入式Linux网络编程 10.1 TCP/IP概述 10.1.1 OSI参考模型及TCP/IP参考模型 10.1.2 TCP/IP协议族 10.1.3 TCP和UDP 10.2 网络基础编程 10.2.1 socket概述 10.2.2 地址及顺序处理 10.2.3 socket基础编程 10.3 网络高级编程 10.4 实验内容——NTP协议实现 10.5 本章小结 10.6 思考与练习 第11章 嵌入式Linux设备驱动开发 11.1 设备驱动概述 11.1.1 设备驱动简介及驱动模块 11.1.2 设备分类 11.1.3 设备号 11.1.4 驱动层次结构 11.1.5 设备驱动程序与外界的接口 11.1.6 设备驱动程序的特点 11.2 字符设备驱动编程 11.3 GPIO驱动程序实例 11.3.1 GPIO工作原理 11.3.2 GPIO驱动程序 11.4 块设备驱动编程 11.5 中断编程 11.6 按键驱动程序实例 11.6.1 按键工作原理 11.6.2 按键驱动程序 11.6.3 按键驱动的测试程序 11.7 实验内容——test驱动 11.8 本章小结 11.9 思考与练习 第12章 Qt图形编程基础 12.1 嵌入式GUI简介 12.1.1 Qt/Embedded 12.1.2 MiniGUI 12.1.3 Microwindows、TinyX等 12.2 Qt/Embedded开发入门 12.2.1 Qt/Embedded介绍 12.2.2 Qt/Embedded信号和插槽机制 12.2.3 搭建Qt/Embedded开发环境 12.2.4 Qt/Embedded窗口部件 12.2.5 Qt/Embedded图形界面编程 12.2.6 Qt/Embedded对话框设计 12.3 实验内容——使用Qt编写“Hello,World”程序 12.4 本章小结
目录 第1章 Linux快速入门 1 1.1 嵌入式Linux基础 1 1.1.1 Linux发展概述 1 1.1.2 Linux作为嵌入式操作系统的优势 2 1.1.3 Linux发行版本 3 1.1.4 如何习Linux 4 1.2 Linux安装 5 1.2.1 基础概念 5 1.2.2 硬件需求 7 1.2.3 安装准备 7 1.2.4 安装过程 8 1.3 Linux文件及文件系统 11 1.3.1 文件类型及文件属性 11 1.3.2 文件系统类型介绍 13 1.3.3 Linux目录结构 14 1.4 实验内容——安装Linux操作系统 17 本章小结 17 思考与练习 18 第2章 Linux基础命令 19 2.1 Linux常用操作命令 19 2.1.1 用户系统相关命令 20 2.1.2 文件目录相关命令 27 2.1.3 压缩打包相关命令 38 2.1.4 比较合并文件相关命令 40 2.1.5 网络相关命令 45 2.2 Linux启动过程详解 50 2.2.1 概述 51 2.2.2 内核引导阶段 51 2.2.3 init阶段 52 2.3 Linux系统服务 54 2.3.1 独立运行的服务 55 2.3.2 xinetd设定的服务 56 2.3.3 设定服务命令常用方法 56 2.4 实验内容 57 2.4.1 在Linux下解压常见软件 57 2.4.2 定制Linux系统服务 58 本章小结 60 思考与练习 60 第3章 Linux下的C编程基础 61 3.1 Linux下C语言编程概述 61 3.1.1 C语言简单回顾 61 3.1.2 Linux下C语言编程环境概述 62 3.2 进入Vi 63 3.2.1 Vi的模式 63 3.2.2 Vi的基本流程 63 3.2.3 Vi的各模式功能键 65 3.3 初探Emacs 66 3.3.1 Emacs的基本操作 67 3.3.2 Emacs的编译概述 70 3.4 Gcc编译器 71 3.4.1 Gcc编译流程解析 71 3.4.2 Gcc编译选项分析 74 3.5 Gdb调试器 77 3.5.1 Gdb使用流程 78 3.5.2 Gdb基本命令 81 3.6 Make工程管理器 86 3.6.1 Makefile基本结构 86 3.6.2 Makefile变量 87 3.6.3 Makefile规则 90 3.6.4 Make管理器的使用 91 3.7 使用autotools 92 3.7.1 autotools使用流程 92 3.7.2 使用autotools所生成的Makefile 96 3.8 实验内容 98 3.8.1 Vi使用练习 98 3.8.2 用Gdb调试有问题的程序 99 3.8.3 编写包含多文件的Makefile 101 3.8.4 使用autotools生成包含多文件的Makefile 103 本章小结 105 思考与练习 105 第4章 嵌入式系统基础 106 4.1 嵌入式系统概述 106 4.1.1 嵌入式系统简介 106 4.1.2 嵌入式系统发展历史 107 4.1.3 嵌入式系统的特点 108 4.1.4 嵌入式系统的体系结构 108 4.1.5 几种主流嵌入式操作系统分析 109 4.2 ARM处理器硬件开发平台 111 4.2.1 ARM处理器简介 111 4.2.2 ARM体系结构简介 113 4.2.3 ARM9体系结构 113 4.2.4 S3C2410处理器详解 116 4.3 嵌入式软件开发流程 121 4.3.1 嵌入式系统开发概述 121 4.3.2 嵌入式软件开发概述 122 4.4 实验内容——使用JTAG烧写NAND Flash 128 本章小结 131 思考与练习 132 第5章 嵌入式Linux开发环境的搭建 133 5.1 嵌入式开发环境的搭建 133 5.1.1 嵌入式交叉编译环境的搭建 133 5.1.2 超级终端和Minicom配置及使用 135 5.1.3 下载映像到开发板 142 5.1.4 编译嵌入式Linux内核 145 5.1.5 Linux内核目录结构 149 5.1.6 制作文件系统 149 5.2 U-Boot移植 153 5.2.1 Bootloader介绍 153 5.2.2 U-Boot概述 155 5.2.3 U-Boot源码导读 156 5.2.4 U-Boot移植主要步骤 163 5.2.5 U-Boot常见命令 164 5.3 实验内容——移植Linux内核 164 本章小结 165 思考与练习 165 第6章 文件I/O编程 166 6.1 Linux系统调用及用户编程接口(API) 166 6.1.1 系统调用 166 6.1.2 用户编程接口(API) 167 6.1.3 系统命令 167 6.2 Linux中文件及文件描述符概述 168 6.3 不带缓存的文件I/O操作 168 6.3.1 open和close 168 6.3.2 read、write和lseek 170 6.3.3 fcntl 173 6.3.4 select 178 6.4 嵌入式Linux串口应用开发 183 6.4.1 串口概述 183 6.4.2 串口设置详解 184 6.4.3 串口使用详解 191 6.5 标准I/O开发 194 6.5.1 打开和关闭文件 194 6.5.2 文件读写 197 6.5.3 输入输出 198 6.6 实验内容 201 6.6.1 文件读写及上锁 201 6.6.2 多路复用式串口读写 204 本章小结 207 思考与练习 207 第7章 进程控制开发 208 7.1 Linux下进程概述 208 7.1.1 进程相关基本概念 208 7.1.2 Linux下的进程结构 210 7.1.3 Linux下进程的模式和类型 210 7.1.4 Linux下的进程管理 211 7.2 Linux进程控制编程 212 7.3 Linux守护进程 224 7.3.1 守护进程概述 224 7.3.2 编写守护进程 224 7.3.3 守护进程的出错处理 229 7.4 实验内容 232 7.4.1 编写多进程程序 232 7.4.2 编写守护进程 235 本章小结 238 思考与练习 239 第8章 进程间通信 240 8.1 Linux下进程间通信概述 240 8.2 管道通信 241 8.2.1 管道概述 241 8.2.2 管道创建与关闭 242 8.2.3 管道读写 244 8.2.4 标准流管道 246 8.2.5 FIFO 249 8.3 信号通信 253 8.3.1 信号概述 253 8.3.2 信号发送与捕捉 255 8.3.3 信号的处理 258 8.4 共享内存 264 8.4.1 共享内存概述 264 8.4.2 共享内存实现 265 8.5 消息队列 267 8.5.1 消息队列概述 267 8.5.2 消息队列实现 268 8.6 实验内容 272 8.6.1 管道通信实验 272 8.6.2 共享内存实验 275 本章小结 277 思考与练习 278 第9章 多线程编程 279 9.1 Linux下线程概述 279 9.1.1 线程概述 279 9.1.2 线程分类 280 9.1.3 Linux线程技术的发展 280 9.2 Linux线程实现 281 9.2.1 线程基本操作 281 9.2.2 线程访问控制 288 9.3 实验内容——“生产者消费者”实验 298 本章小结 302 思考与练习 303 第10章 嵌入式Linux网络编程 304 10.1 TCP/IP协议概述 304 10.1.1 OSI参考模型及TCP/IP参考模型 304 10.1.2 TCP/IP协议族 305 10.1.3 TCP和UDP 306 10.2 网络基础编程 308 10.2.1 socket概述 308 10.2.2 地址及顺序处理 309 10.2.3 socket基础编程 314 10.3 网络高级编程 322 10.4 ping源码分析 326 10.4.1 ping简介 326 10.4.2 ping源码分析 327 10.5 实验内容——NTP协议实现 345 本章小结 352 思考与练习 352 第11章 嵌入式Linux设备驱动开发 353 11.1 设备驱动概述 353 11.1.1 设备驱动简介及驱动模块 353 11.1.2 设备文件分类 354 11.1.3 设备号 355 11.1.4 驱动层次结构 355 11.1.5 设备驱动程序与外界的接口 355 11.1.6 设备驱动程序的特点 356 11.2 字符设备驱动编写 356 11.3 LCD驱动编写实例 363 11.3.1 LCD工作原理 363 11.3.2 LCD驱动实例 365 11.4 块设备驱动编写 374 11.4.1 块设备驱动程序描述符 374 11.4.2 块设备驱动编写流程 375 11.5 中断编程 381 11.6 键盘驱动实现 382 11.6.1 键盘工作原理 382 11.6.2 键盘驱动综述 383 11.6.3 键盘驱动流程 384 11.7 实验内容——skull驱动 394 本章小结 398 思考与练习 399 第12章 Qt图形编程 400 12.1 嵌入式GUI简介 400 12.1.1 Qt/Embedded 401 12.1.2 MiniGUI 401 12.1.3 Microwindows、Tiny X等 402 12.2 Qt/Embedded开发入门 402 12.2.1 Qt/Embedded介绍 402 12.2.2 Qt/Embedded信号和插槽机制 405 12.2.3 搭建Qt/Embedded开发环境 409 12.2.4 Qt/Embedded窗口部件 410 12.2.5 Qt/Embedded图形界面编程 414 12.2.6 Qt/Embedded对话框设计 416 12.3 实验内容——使用Qt编写“Hello,World”程序 420 本章小结 428
本书主要分为3个部分,包括Linux基础、搭建嵌入式Linux环境和嵌入式Linux的应用开发。Linux基础部分从Linux的安装过程、基本操作命令讲起,为Linux初者能快速入门提供了保证。接着系统地讲解了嵌入式Linux的环境搭建,以及嵌入式Linux的I/O与文件系统的开发、进程控制开发、进程间通信开发、网络应用开发、基于中断的开发、设备驱动程序的开发以及嵌入式图形界面的开发等,并且还安排了丰富的实验内容与课后实践,使读者能够边边用,更快更好地掌握所知识。本书可作为高等院校电子类、电气类、控制类等专业高年级本科生、研究生习嵌入式Linux的教材,也可供广大希望转入嵌入式领域的科研和工程技术人员参考使用,还可作为广大嵌入式培训班的教材和参考书。 目录第1章 Linux快速入门  1.1 嵌入式Linux基础  1.2 Linux安装  1.3 Linux文件及文件系统  1.4 实验内容——安装Linux操作系统  本章小结  思考与练习 第2章 Linux基础命令  2.1 Linux常用操作命令 2.2 Linux启动过程详解 2.3 Linux系统服务 2.4 实验内容  本章小结  思考与练习 第3章 Linux下的C编程基础  3.1 Linux下 C语言编程概述 3.2 进入Vi  3.3 初探Emacs  3.4 Gcc编译器  3.5 Gdb调试器 3.6 Make工程管理器 3.7 使用autotools  3.8 实验内容  本章小结  思考与练习 第4章 嵌入式系统基础  4.1 嵌入式系统概述  4.2 ARM处理器硬件开发平台  4.3 嵌入式软件开发流程  4.4 实验内容——使用JTAG烧写NAND Flash  本章小结  思考与练习 第5章 嵌入式Linux开发环境的搭建  5.1 嵌入式开发环境的搭建  5.2 U-Boot移植  5.3 实验内容——移植Linux内核  本章小结  思考与练习 第6章 文件I/O编程  6.1 Linux系统调用及用户编程接口(API) 6.2 Linux中文件及文件描述符概述  6.3 不带缓存的文件I/O……
华清远见嵌入式linux应用程序开发技术详解(内部资料) 第1章 Linux快速入门   1.1 嵌入式Linux基础   1.2 Linux安装   1.3 Linux文件及文件系统   1.4 实验内容——安装Linux操作系统   本章小结   思考与练习  第2章 Linux基础命令   2.1 Linux常用操作命令  2.2 Linux启动过程详解  2.3 Linux系统服务  2.4 实验内容   本章小结   思考与练习  第3章 Linux下的C编程基础   3.1 Linux下C语言编程概述  3.2 进入Vi  3.3 初探Emacs   3.4 Gcc编译器   3.5 Gdb调试器  3.6 Make工程管理器  3.7 使用autotools   3.8 实验内容   本章小结   思考与练习  第4章 嵌入式系统基础   4.1 嵌入式系统概述   4.2 ARM处理器硬件开发平台   4.3 嵌入式软件开发流程   4.4 实验内容——使用JTAG烧写NAND Flash   本章小结   思考与练习  第5章 嵌入式Linux开发环境的搭建   5.1 嵌入式开发环境的搭建   5.2 U-Boot移植   5.3 实验内容——移植Linux内核   本章小结   思考与练习  第6章 文件I/O编程   6.1 Linux系统调用及用户编程接口(API)  6.2 Linux中文件及文件描述符概述   6.3 不带缓存的文件I/O操作   6.4 嵌入式Linux串口应用开发  6.5 标准I/O开发   6.6 实验内容   本章小结   思考与练习  第7章 进程控制开发   7.1 Linux下进程概述  7.2 Linux进程控制编程   7.3 Linux守护进程   7.4 实验内容   本章小结   思考与练习  第8章 进程间通信   8.1 Linux下进程间通信概述   8.2 管道通信   8.3 信号通信  8.4 共享内存   8.5 消息队列  8.6 实验内容   本章小结   思考与练习 第9章 多线程编程   9.1 Linux下线程概述   9.2 Linux线程实现   9.3 实验内容——“生产者消费者”实验   本章小结   思考与练习  第10章 嵌入式Linux网络编程   10.1 TCP/IP协议概述   10.2 网络基础编程   10.3 网络高级编程   10.4 ping源码分析   10.5 实验内容——NTP协议实现   本章小结   思考与练习  第11章 嵌入式Linux设备驱动开发   11.1 设备驱动概述  11.2 字符设备驱动编写   11.3 LCD驱动编写实例  11.4 块设备驱动编写  11.5 中断编程   11.6 键盘驱动实现   11.7 实验内容——skull驱动   本章小结   思考与练习  第12章 Qt图形编程   12.1 嵌入式GUI简介  12.2 Qt/Embedded开发入门  12.3 实验内容——使用Qt编写“Hello,World”程序   本章小结 

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值