27++'s Report

東京大学で行われた「大規模ソフトウェアを手探る」実験においてgccコンパイラーに機能の追加を行った。その際の奮闘を描いた日記(風レポート)。


このブログには東京大学電子情報・電気電子工学科にて行われた「外規模ソフトウェアを手探る」実験において使用の変更、追加を行ったgccについて書かれています。実験日に沿った日記風レポートとなっていますが、実際の進捗とブログの進捗には多少の差があることをここに断らせていただきます。
行ったことは"-o"オプションなしでhoge.cをコンパイルしたときhoge.outとなる変更、及び文末の";"の抜けを自動で補填する変更である。

まとめ(変更箇所の紹介記事リンクとgccの仕組み)

手探るgccのソースコードのダウンロード方法(初日)



a.outってなんやねん(2)

さて、早速デバッグに取り掛かろう!
GNU Debuggerを用いてデバッグを行った。

デバッグを行う前に、gccと同じディレクトリ内(/home/denjo/gcc_install/bin)にc言語で書かれたプログラム、test.cを用意した。

test.c
#include <stdio.h>
int main(){
  printf("Hello World");
}

gdbを起動し、ブレイクポイントをmainに設定。test.cを引数にデバッグを開始。
最初に僕たちが取った手法は"フォルダ見比べ作戦"である。その手法とは、以下の画像のようにa.outが生成されるディレクトリ /home/denjo/gcc_install/bin を監視しながらデバッグを(コマンドnで)行い、生成された瞬間の前の関数を手探る、という手法である。

f:id:bigsoftExp:20161128171144p:plain

f:id:bigsoftExp:20161128171153p:plain

このようになった時にブレイクポイントをmaybe_run_linkerにおいて再びデバッグし、その関数内にコマンドsで入っていく

このようにしていくと、最終的に関数~~~でa.outを出力することがわかる…はずだったのだが、突然生成しており結局どこで生成しているのか特定することはできなかった。(実験二日目の不慣れや知識不足の点も多かったと思われるのでわかった人いたらこっそりコメントで教えてください;;)