fatal error(フェイタルエラー)の表示箇所


アニメ『Fate/stay night』(2014)

Zeroの方を先に見ていたので、すぐに内容に入っていけました。ああ、でもプリズマイリヤを最初に見たものだから、イリヤの参戦に驚いたのなんのって。設定が違うんですね。
2006年の1作目と同時に、夢中になって見ています。fateってどういう意味か辞書で調べると、運命とか宿命のようです。しかも変えることができない悲運的な意味も入っています。セイバールートは、fateというらしいのですが、変えられない運命という意味が込められているのでしょうか。

さてフェイトっていう発音がどこかで聞いたことがあるなあ、と考えていたら、fatal error(ファイタルエラー)を思い出しました。綴りも意味もよく似てるので、きっとfatalはfateから来てる言葉なんでしょうね。
gcc使う時にfatal errorをよく見かける気がします。どのような時に表示されるエラーメッセージなのでしょうか。とりあえずgccだけ入力してENTERしてみましょう。

takk@deb9:~$ gcc
gcc: fatal error: no input files
compilation terminated.
takk@deb9:~$

あ、出ました。fatal error。ということは、このメッセージをキーワードに検索すればよいですね。

検索するのにgccのソースが必要なので、まずは、gccをダウンロードします。
今回はv7.3.0を使うことにします。

takk@deb9:~$ mkdir gcc;cd gcc
takk@deb9:~/gcc$ wget http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-7.3.0/gcc-7.3.0.tar.gz

伸長します。

takk@deb9:~/gcc$ ls
gcc-7.3.0.tar.gz
takk@deb9:~/gcc$ tar xzf gcc-7.3.0.tar.gz
takk@deb9:~/gcc$ ls
gcc-7.3.0  gcc-7.3.0.tar.gz
takk@deb9:~/gcc$ cd gcc-7.3.0/
takk@deb9:~/gcc/gcc-7.3.0$

さて”no input files”を足がかりに検索していきましょう。

takk@deb9:~/gcc/gcc-7.3.0$ grep -r 'no input files' * | head
gcc/fortran/gfortranspec.c:              "no input files; unwilling to write output files");
gcc/fortran/gfortranspec.c:  /* If there are no input files, no need for the library.  */
gcc/gcc.c:    fatal_error (input_location, "no input files");
gcc/ChangeLog-1998:     (main): Use added_libraries in check for no input files.
gcc/po/fr.po:msgid "no input files"
gcc/po/fr.po:msgid "no input files; unwilling to write output files"
gcc/po/be.po:msgid "no input files"
gcc/po/be.po:msgid "no input files; unwilling to write output files"
gcc/po/fi.po:msgid "no input files"
gcc/po/fi.po:#| msgid "no input files"
takk@deb9:~/gcc/gcc-7.3.0$

メッセージIDが書かれているファイルが見つかりました。fr.poとかbe.poとか。
ファイル名のfrとかきっとフランス語ってことでしょう。ってことはja(日本語)もありますね。
fr.poの冒頭をみてみます。

takk@deb9:~/gcc/gcc-7.3.0$ head gcc/po/fr.po
# This file is distributed under the same license as the gcc package.
#
# Messages francais pour GNU concernant gcc.
# Copyright c 2017 Free Software Foundation, Inc.
#
# Michel Robitaille <robitail@IRO.UMontreal.CA>, traducteur depuis/since 1996.
# Francois-Xavier Coudert <fxcoudert@gmail.com>, 2008.
# Stephane Aulery <lkppo@free.fr>, 2015, 2016.
# Frederic Marchal <fmarchal@perso.be>, 2017.
#
takk@deb9:~/gcc/gcc-7.3.0$ 

1行目であっ英語だ、と思ってたら、3行目で、もう意味が分かりません。
英語みたいなのに、フランス語なのでしょうか。諦めて、他のファイルを見ることにします。

ja.poの冒頭です。

takk@deb9:~/gcc/gcc-7.3.0$ head gcc/po/ja.po
# Japanese messages for GNU gcc
# Copyright (C) 1999, 2010, 2011 Free Software Foundation, Inc.
# This file is distributed under the same license as the gcc package.
#
# gcc では解釈される書式文字列が数種類あります
# (1) gcc/pretty-print.c 内にある pp_printf()
# (2) gettext のドキュメントにある書式
#    http://www.gnu.org/software/gettext/manual/gettext.html#gcc_002dinternal_002dformat
# (3) gcc/tree-pretty-print.c 内にある percent_K_format() 
# c-format フラグがあっても位置パラメータ (%1$s, %2$d) などは使わないことを推奨します
takk@deb9:~/gcc/gcc-7.3.0$ 

ああ良かった。英語+日本語の安心感。

では例のメッセージIDの辺りを見てみましょう。

20966 #: gcc.c:8006
20967 #, gcc-internal-format
20968 msgid "no input files"
20969 msgstr "入力ファイルがありません"

メッセージIDと各国語の文字列がセットになってるんですね。
このファイルからもちろんfatalかどうかは分からないので、fatalという単語と、no input filesが同時に登場する行を検索してみます。

takk@deb9:~/gcc/gcc-7.3.0$ grep -r 'fatal.*no input files' *
gcc/gcc.c:    fatal_error (input_location, "no input files");
takk@deb9:~/gcc/gcc-7.3.0$

見つかりました。fatal_errorを見つければ、fatalなメッセージが見つかるということです。

takk@deb9:~/gcc/gcc-7.3.0$ grep -r '\<fatal_error.*".*' * | head
gcc/ChangeLog-2003:     calls to fatal_error; add ": %m" to the end of all the affected
gcc/fortran/f95-lang.c:    fatal_error (input_location, "can't open input file: %s", gfc_source_file);
gcc/fortran/gfortranspec.c:    fatal_error (input_location, "overflowed output arg list for %qs",
gcc/fortran/trans-expr.c:      fatal_error (input_location, "Unknown intrinsic op");
gcc/collect-utils.c:    fatal_error (input_location, "can't get program status: %m");
gcc/collect-utils.c:      fatal_error (input_location, "%s terminated with signal %d [%s]%s",
gcc/collect-utils.c:    fatal_error (input_location, "%s returned %d exit status", prog, ret);
gcc/collect-utils.c:        fatal_error (input_location, "could not open response file %s",
gcc/collect-utils.c:        fatal_error (input_location, "could not write to response file %s",
gcc/collect-utils.c:        fatal_error (input_location, "could not close response file %s",
takk@deb9:~/gcc/gcc-7.3.0$

これでfatal errorの探し方は分かりました。運命も変えられます。

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA