日期:2014-05-16  浏览次数:20719 次

gdb重定向输入输出
源码t1.c:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define BUFSIZE 100
int main(void)
{
        char buf[BUFSIZE];
        memset(buf,0,BUFSIZE);
        puts("!!!Hello c World!!!"); /* prints !!!Hello World!!! */
        int n;
        while((n = read(STDIN_FILENO,buf,BUFSIZ)) > 0)
        {
                if(write(STDOUT_FILENO,buf,n) != n)
                {
                        perror("write error");
                }
        }
        if(n < 0)
        {
                perror("read error");
        }
        return EXIT_SUCCESS;
}
把输入的内容显示到输出上
我现在想用输入输出重定向
./a.out < t1.c > temp
结果core了,
现在想用gdb调试,
gdb a.out <t1.c > temp
这样的用法是错误的,后百度
发现用法如下
gdb a.out
run <t1.c>temp
但还是报错
(gdb) run <t1.c >temp
Starting program: /home/mct/cpp/a.out <t1.c >temp
read error: Bad address

Program exited normally.
请高人帮看下该如何调试

------解决方案--------------------
不知道gdb怎么定向

你程序中的宏用错了
while((n = read(STDIN_FILENO,buf,BUFSIZ)) > 0)

你这儿使用的是BUFSIZ(这个是系统定义的一个宏,通常是4096),而不是你自己定义的BUFSIZE
------解决方案--------------------
...
#define BUFSIZE 100    //这里你自己定义的宏是BUFSIZE,不是BUFSIZ
int main(void)
{
        char buf[BUFSIZE];    //这里数组长度为100
        memset(buf,0,BUFSIZE);
        puts("!!!Hello c World!!!"); /* prints !!!Hello World!!! */
        int n;
        while((n = read(STDIN_FILENO,buf,BUFSIZ)) > 0)    //这里的BUFSIZ是系统定义的,我的linux环境下是8192,远大于buf的长度100,所以core了,改成你自己的BUFSIZE就OK了
...