顶嵌|嵌入式培训|嵌入式Linux培训|承接嵌入式项目开发 2009-02-19 11:58:23 作者:顶嵌开源 来源:原创 文字大小:[大][中][小] |
除了人工的分析之外,最简单最直接的调试方法要算
printf
了。不过,我们这里推荐使用的并不是初学
C
语言时使用的函数
int printf(const char *format, ...)
,而是稍微复杂一点的
fprintf()
函数,因为它更方便我们之后重定向错误输出信息到指定的设备。
fprintf()
函数的原型如下:
可以看到,它与
printf()
函数相比多出来了第一个参数
FILE *stream
,其意义是将打印的内容输出到文件流指针
stream
指向的流。所谓流,通常是指程序输入或输出的一个连续的字节序列,设备
(
例如鼠标、键盘、磁盘、屏幕、调制解调器和打印机
)
的输入和输出都是用流来处理的,在
C
语言中,所有的流均以文件的形式出现——不一定是物理磁盘文件,还可以是对应于某个输入/输出源的逻辑文件。
C
语言提供了
5
种标准的流,你的程序在任何时候都可以使用它们,并且不必打开或关闭它们。以下列出了这
5
种标准的流。
------------------------------------------------ 名称 描 述 例 子 ------------------------------------------------ stdin 标准输入 键盘 stdout 标准输出 屏幕 stderr 标准错误 屏幕 stdprn 标准打印机 LPT1 端口 stdaux 标准串行设备 COM1 端口 ------------------------------------------------ 其中, stdprn 和 stdaux 并不总是预先定义好的,因为 LPT1 和 COM1 端口在某些操作系统中是没有意义的,而 stdin , stdout 和 stderr 总是预先定义好的。此外, stdin 并不一定来自键盘, stdout 也并不一定显示在屏幕上,它们都可以重定向到磁盘文件或其它设备上。我们在头文件 stdio.h 中可以找到 stdin , stdout 和 stderr 的定义如下:
<?xml:namespace prefix = o />
在使用
fprintf()
函数时,通常我们可以将第一个参数设为
stdout
或者
stderr
,打印出错调试信息的时候则推荐使用
stderr
而不是
stdout
,这是一种惯例,同时也由于内核在处理
stdout
和
stderr
时的优先级不一样,后者的优先级要高一些,因此有时候如果程序异常退出时,
stderr
能得到输出,而
stdout
就不行。
printf(...)
实际上相当于
fprintf(stdout, ...)
,这也是为什么我们不推荐使用它的原因。在输出调试信息的时候,我们推荐使用
fprintf(stderr, …)
,或者使用某个指定的文件流
fprintf(some_stream, …)
。
那么具体如何在必要的时候重定向
fprintf()
中的调试信息呢?来看看下面的一些方法:
当调试信息的量比较大,需要一些时间或者其他辅助工具来搜索过滤时,仅仅利用显示屏幕来输出调试信息是不够的,这时我们经常将这些信息输出到所谓的日志文件
(log)
中,之后再仔细的分析
log
文件来发现问题。
Ø
利用
Shell
的
I/O
重定向
简单的写
log
方法可以通过
shell
的
I/O
重定向机制来实现,比如下面的代码:
在默认条件下,编译运行的结果是打印信息都输出在屏幕上:
这是因为默认情况下,
shell
所打开的
stdout
和
stderr
设备都是显示屏幕。不过我们可以通过
shell
的重定向功能来将打印信息写到文件中去。比如:
这样,我们把
stdout
的输出写到了文件
output.log
中,不过
stderr
的输出还是在屏幕上。如何重定向
stderr
呢?这需要用到
shell
定义的文件描述符。在
shell
下
stdin, stdout,
和
stderr
的文件描述符分别是
0, 1
和
2
,我们可以用下面的方法重定向:
其中
./fprint >output.log 2>error.log
分别将
stdout
和
stderr
的输出写入到文件
output.log
和
error.log
中,而
./fprint >output.log 2>&1
则表示将
stderr
的输出追加到
stdout
的文件
output.log
中(结果是
output.log
中既有
stdout
输出也有
stderr
输出)。
一些常用的
shell I/O
语法如下:
cmd > file
把
stdout
重定向到
file
文件中
cmd >> file 把 stdout 重定向到 file 文件中 ( 追加 ) cmd 1> fiel 把 stdout 重定向到 file 文件中 cmd > file 2>&1 把 stdout 和 stderr 一起重定向到 file 文件中 cmd 2> file 把 stderr 重定向到 file 文件中 cmd 2>> file 把 stderr 重定向到 file 文件中 ( 追加 ) cmd >> file 2>&1 把 stderr 和 stderr 一起重定向到 file 文件中 ( 追加 )
在平时的简单调试中,我们可以灵活利用这些方法来快速得到
log
文件。
Ø
用
freopen()
进行重定向
有时候我们要求在程序中能够控制标准流的重定向,这时可以利用标准
C
库函数
freopen()
。
freopen()
的函数原型如下:
下面的代码用来测试用函数
freopen()
重定向
stderr
:
在第
5
行我们用
freopen()
函数将
stderr
重定向到了
”err.log”
文件,这样得到的结果如下:
可见第
8
行打印到
stderr
的信息被重定向到了
err.log
文件中,而第
7
行
stdout
的打印信息则还是输出到了屏幕上。
|
转载于:https://blog.51cto.com/enchen/147070