Есть ли способ заставить gcc печатать оскорбительные строки, когда он выдает ошибку? - PullRequest
3 голосов
/ 04 июня 2010

У меня есть большая кодовая база, которую мне было поручено портировать на 64 бита. Код компилируется, но выводит очень большое количество несовместимых предупреждений о указателях (как и следовало ожидать). Есть ли способ, которым gcc может напечатать строку, в которой происходит ошибка? На данный момент я просто использую сообщения об ошибках gcc, чтобы попытаться отследить предположения, которые необходимо изменить, и искать каждый из них не весело.

Ответы [ 6 ]

2 голосов
/ 07 июня 2010

Я явно украл ответ Джозефа Куинси за это. Разница лишь в том, что я попытался сделать код проще для понимания:

Для bash используйте 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 голосов
/ 06 июня 2010

Возможно, скрипт для печати нужных строк поможет. Если вы используете csh (маловероятно!), Используйте:

  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

А для bash используйте 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
1 голос
/ 04 июня 2010

Используйте параметр -W для управления тем, какие предупреждения вы хотите отобразить. этот параметр объяснил здесь .

Также вы можете использовать этот трюк для подавления прогрессивных выходов:

gcc ... 1>/dev/nul
0 голосов
/ 21 февраля 2013

Мне трудно запомнить символ перенаправления сообщений об ошибках.

Итак, вот моя версия для распечатки сообщений об ошибках 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
}
0 голосов
/ 04 июня 2010

Этот маленький скрипт должен работать, но я не могу сейчас его проверить. извините, если нужно отредактировать.

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
0 голосов
/ 04 июня 2010

К тому времени, когда компилятор выдает сообщение об ошибке, фактическая строка источника уже давно исчезла (особенно в C) - она ​​была преобразована в поток токенов, затем в абстрактное синтаксическое дерево, затем в декорированное синтаксическое дерево.У gcc достаточно таблички со многими этапами компиляции, поэтому он намеренно не включает в себя функциональность для повторного открытия файла и повторного получения исходного источника.Это то, для чего нужны редакторы, и практически все они имеют команды для запуска компиляции и перехода к следующей ошибке при нажатии клавиши.Сделайте себе одолжение и используйте современный редактор, чтобы просмотреть ошибки (и, возможно, даже исправить их полуавтоматически).

...