代码之家  ›  专栏  ›  技术社区  ›  alexgolec

有没有办法让GCC打印出错误的行?

  •  3
  • alexgolec  · 技术社区  · 14 年前

    我有一个很大的代码库,我的任务是把它移植到64位。代码会编译,但它会打印大量不兼容的指针警告(如预期的那样)。是否可以让GCC打印发生错误的行?在这一点上,我只是使用GCC的错误消息来尝试跟踪需要修改的假设,并且必须查找每个假设都是不有趣的。

    6 回复  |  直到 11 年前
        1
  •  2
  •   Community Egal    7 年前

    我公然偷了约瑟夫·昆西的 answer 为此。唯一的区别是我试图让代码更容易理解:

    为了抨击,使用 make 2>&1 | show_gcc_line 具有 show_gcc_line 以下脚本:

    #!/bin/bash
    #  Read and echo each line only if it is an error or warning message
    #  The lines printed will start something like "foobar:123:" so that
    #  line 123 of file foobar will be printed.
    
    while read input
    do
        loc=$(echo "$input" | sed -n 's/^\([^ :]*\):\([0-9]*\):.*/\1 \2/p')
        len=${#loc}
        file=${loc% *}
        line=${loc#* }
    
        if [ $len -gt  0 ]
        then
            echo "$input"
            echo "$(sed -n ${line}p $file)"
            echo
        fi
    done
    

    部分原因是我不喜欢原稿的格式。这只打印警告/错误,然后是导致问题的代码行,最后是空行。我也去掉了连字号。

        2
  •  2
  •   Joseph Quinsey    14 年前

    也许打印所需行的脚本会有所帮助。如果您正在使用 促甲状腺激素 (不可能!)用途:

      make ... |& show_gcc_line
    

    具有 show_gcc_line 以下脚本:

    #!/bin/csh
    # Read and echo each line. And, if it starts with "foobar:123:", print line 123
    # of foobar, using find(1) to find it, prefaced by ---------------.
    
    set input="$<"
    while ( "$input" ) 
        echo "$input"
        set loc=`echo "$input" | sed -n 's/^\([^ :]*\):\([0-9]*\):.*/\1 \2/p'`
        if ( $#loc ) then
            find . -name $loc[1] | xargs sed -n $loc[2]s/^/---------------/p
        endif
        set input="$<"
    end
    

    为了 猛击 使用 make ... 2>&1 | show_gcc_line 用:

    #!/bin/bash
    #  Read and echo each line. And, if it starts with "foobar:123:", print line 123
    #  of foobar, using find(1) to find it, prefaced by ---------------.
    
    while read input
    do
        echo "$input"
        loc=$(echo "$input" | sed -n 's/^\([^ :]*\):\([0-9]*\):.*/\1 \2/p')
        if [ ${#loc} -gt  0 ] 
        then
            find . -name ${loc% *} | xargs sed -n ${loc#* }s/^/---------------/p
        fi
    done
    
        3
  •  1
  •   Ehsan    14 年前

    使用-w选项控制要显示的警告。这个参数解释了 here .

    还可以使用此技巧抑制渐进输出:

    gcc ... 1>/dev/nul
    
        4
  •  0
  •   Kilian Foth    14 年前

    当编译器发出一条错误消息时,实际的源代码行早已不存在了(特别是在C语言中),它已经转换为令牌流,然后转换为抽象语法树,最后转换为修饰语法树…GCC有足够多的编译步骤,因此它故意不包括重新打开文件和重新检索原始源文件的功能。这就是编辑器的用途,实际上所有编辑器都有命令来启动编译,并在按键上跳到下一个错误。帮自己一个忙,用一个现代的编辑器来浏览错误(甚至可能半自动修复错误)。

        5
  •  0
  •   Ehsan    14 年前

    这个小脚本应该可以用,但我现在不能测试它。抱歉,如果需要编辑。

    LAST_ERROR_LINE=`(gcc ... 2>&1 >/dev/null ) | grep error | tail -n1`
    FILE=`echo $LAST_ERROR_LINE | cut -f1 -d':'`
    LINE=`echo $LAST_ERROR_LINE | cut -f2 -d':'`
    sed -n "${LINE}p" $FILE
    
        6
  •  0
  •   Houcheng    11 年前

    对我来说,错误消息重定向的符号很难记住。

    所以,这里是我打印出gcc错误消息的版本:

    $ee make
    

    对于错误和警告消息:

    ee2 make
    

    怎样: 把这些加到.bashrc中

    function ee() {
       $*  2>&1  | grep error
    }
    
    function ee2() {
        $* 2> ha
        echo "-----"
        echo "Error"
        echo "-----"
        grep error ha
        echo "-------"
        echo "Warning"
        echo "-------"
        grep warning ha
    }