C++ で正規表現を使うときには g++-4.9 以上が必要

C++ で正規表現(regex)を使おうと思って、プログラムを作成していた。コンパイルは通るけど、どうも動作が思ったようにならない。しばらく悩んだ結果見つけたのが以下。

Is gcc 4.8 or earlier buggy about regular expressions?

4.8 以下のバージョンだと正規表現がちゃんとサポートされてないという話らしい。というわけで、g++-4.9 をインストールしたところ所望の動作を得られた。

regex_match() 便利でいい。

C言語のコールグラフ作成のメモ

C言語で書かれたプログラムのコールグラフを作成する方法についてのメモ。

コールグラフとは

Wikipediaのコールグラフの項から定義を拝借。

コールグラフ (マルチグラフとも呼ばれる) とは、コンピュータプログラムサブルーチン同士の呼び出し関係を表現した有向グラフである。

プログラムの解析をしていると、関数の呼び出し関係を視覚的に見たい時がある。そんな時には迷わずコールグラフを描いてみるといい。

静的・動的なコールグラフ

コールグラフには、静的なコールグラフと動的なコールグラフの2通りがある。静的なコールグラフとは、プログラムの実行を伴わずに作成するもの。静的なコールグラフはソースコードのみを解析することで得たり、プログラムをコンパイルする時の情報を使って作成する。コールグラフに存在する関数呼び出しがプログラムを実行したときに起こるかどうかはわからない。

一方、動的なコールグラフは、実際にプログラムを実行したときに起きた関数呼び出しに基づいて作成される。そのため、作成にはプロファイラを用いる。動的なコールグラフにおける関数呼び出しは実際に発生したものであるが、入力に依存する。

解析するときに知りたい情報によってどちらのコールグラフを作るのが望ましいか判断する必要がある。網羅的に関数呼び出しを表現したければ静的なコールグラフを作成するべきだし、とある条件下(入力・環境)におけるプログラムの動作を解析したければ動的なコールグラフを作成するべきだ。また、静的なコールグラフでは大規模になりすぎてみるべきポイントを絞れないといった場合に動的なコールグラフから見て実際に動いてる部分から解析するというアプローチもありだろう。

静的なコールグラフの作成

egyptcodeviz というツールが有名どころなようだ。今回は egypt を用いた。使い方は少し調べれば出てくるから、ほかのサイトを見てもらうとして、自分が使った時に調べた点をいくつかメモしておく。

  • egypt をインストールするときに prefix を変える方法が謎。
  • gcc には -fdump-rtl-expand オプションをつける。
  • 複数のファイルからなるプログラムの場合、.extend ファイルを cat して egypt に与えれば良い。(cat しなくても *.extend みたいな感じでもいいのかもしれないが試していない。)
  • gcc が最適化により関数をインライン化するとコールグラフの結果が変わる。例えば、実際には呼び出されている関数が一度も呼び出されないかのような結果が出力される。ソースコードに忠実なコールグラフを得たければ最適化を無効化するべき。
  • 横向きで出力した方が見やすい気がする。dot で A4 横向きで出力するためには、以下のように指定する。
    -Gsize=11.7,8.3 -Grankdir=LR
  • dot で ps ファイルを出力して、ps2pdf で pdf 化しようとすると、横向きがうまく出力されない。おとなしく dot で -Tpdf を指定して初めから pdf で出力すべき。

動的なコールグラフの作成

こちらも複数ツールがあるようだが今回は gperf2dot.py を利用した。名前に gperf とついているが、gperf だけでなく他のプロファイラの出力も読み取ってくれる。こちらも基本的な使い方はほかのサイトを見てもらうとして、ポイントをメモしておく。

  • gperf2dot.py は縦書き表示に適したように作られているっぽい。A4 縦で出力するためには、dot に以下のように指定する。
    -Gsize=8.3,11.7

Windows 10 のメーラは Thunderbird にした

Windows 10 結構いい。気に入ってきた。けど、標準のメールアプリはテキスト形式で送れないのが痛い。個人的には、個人で HTML メール送ってくるのは勘弁してほしい派。

少し調べた結果、結局 Thunderbird を使うことにした。
今後もサポートが続くことを切に願いつつ・・・

設定したことをいくつかまとめておく

  • 連絡先は gContactSync というプラグインを使うと GMail アカウントと同期できる
  • フォントは Migu 1P, 1M を使用
  • フォントがなんかにじんで気持ち悪かったので設定を変更

【解決済】HP Microserver gen7 で CentOS 7.2 にアップデートすると kernel panic する問題

AMD Neo シリーズの CPU を搭載したマシンを CentOS 7.2 にアップデートすると、起動直後にハングする問題が起きています。自分は N54L を搭載したマシンで発生。

問題のカーネルバージョンは kernel-3.10.0-327.el7 で、boot option を追加すると回避できるとのこと。

Adding initcall_blacklist=clocksource_done_booting to GRUB_CMDLINE_LINUX in /etc/default/grub and then grub2-mkconfig -o /etc/grub2.cfg fix this bug. Thank you for sharing this solution.

参考

Windows 開発環境構築のメモ

久しぶりに Windows マシンをセットアップしたのでメモ。
環境は Windows 10 pro 64bit。

2/28/2016 追記
3/25/2016 追記
8/18/2016 更新 and 一旦整理

アプリインストール関連

  • Cygwin ではなく、msys2 を使う
    • pacman で結構いろいろ入れられる
    • Bash on Ubuntu on Windows もそのうち試してみたいが・・・
  • GVim (renderingoption を利用するために Kaoriya 版を利用)
  • TeXLive

環境構築関連

  • フォント
    • Myrica が結構いいと思う
  • Hyper-v
    • pro 版は、Client hyper-v が使用可能
    • Ubuntu server をインストールして putty から SSH できるようにはしておくと安心

 

Ubuntu 14.04 で SystemTap 2.9 を使う

Ubuntu 14.04 で DTRACE に近い機能を実現する SystemTap を使うための方法。

いくつか参考になる情報があるけど、どうもうまくいかない。

Ubuntu 14.04 (trusty) のリポジトリの SystemTap のバージョンは 2.3 で、これが古くてアップデートされたカーネル(自分の場合は 3.16.0-50)に対応していないのではないかと予想。SystemTap 公式を参考にして最新版をインストールしたところ、使えるようになった。

  1. 必要なパッケージのインストール
    $ sudo apt-get install gcc g++ elfutils libdw-dev
  2. カーネルの dbgsym のインストール
    • ddebs リポジトリの追加
      $ codename=$(lsb_release -c | awk '{print $2}')
      $ sudo tee /etc/apt/sources.list.d/ddebs.list << EOF
      deb http://ddebs.ubuntu.com/ ${codename} main restricted universe multiverse
      deb http://ddebs.ubuntu.com/ ${codename}-security main restricted universe multiverse
      deb http://ddebs.ubuntu.com/ ${codename}-updates main restricted universe multiverse
      deb http://ddebs.ubuntu.com/ ${codename}-proposed main restricted universe multiverse
      EOF
      $ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys ECDCAD72428D7C01
      $ sudo apt-get update
    • カーネルの dbgsym パッケージのインストール
      $ sudo apt-get install linux-image-$(uname -r)-dbgsym
  3. SystemTap の入手・インストール
    • 公式の情報
    • リリース版置き場
    • SystemTap の入手
      $ wget https://sourceware.org/systemtap/ftp/releases/systemtap-2.9.tar.gz
    • SystemTap のコンパイル
      $ tar xvfz systemtap-2.9.tar.gz
      $ cd systemtap-2.9
      $ ./configure
      $ make
    • SystemTap のインストール
      $ sudo make install
  4. SystemTap の動作確認
    以下のようになれば OK

    $ sudo stap -e 'probe begin { println("Hello, World!") exit() }'
    Hello, World!

Top で特定のユーザのプロセスを非表示にする

top でプロセスの一覧を眺めている時に root のプロセスが邪魔な時がある。そんな時には以下の方法で特定のユーザのプロセスを非表示にできる。

$ top -U !username

top コマンド起動後に u を押して !username と入力することでも可能。

参考:How to exclude some users from Linux Top screen?