第33章 コンパイラーとツール

FCoE 経由で SAN から起動する際の複数のバグ

FCoE (Fibre Channel over Ethernet) による SAN (Storage Area Network) からの起動を実装している最近の事例で複数のバグが発生しています。これらのバグを修正するための Red Hat Enterprise Linux 7 向けリリースを行う予定です。影響を受けるバグ一覧および回避方法がある場合はその詳細などについては Red Hat サポート担当者までご連絡ください。

Valgrind は Open MPI の旧バージョンに対してビルドされたプログラムは実行できない

Red Hat Enterprise Linux 7.2 で対応しているのはバージョン 1.10 の Open MPI アプリケーションバイナリーインターフェース (ABI) のみです。このバージョンは以前に配信されたOpen MPI ABI のバージョン 1.6 とは互換性がありません。このため、Open MPI の旧バージョンに対してビルドされるプログラムは Red Hat Enterprise Linux 7.2 に収納されている Valgrind 配下では実行できません。この問題を回避するため、Open MPI バージョン 1.6 に対してリンクされているプログラムの場合には Red Hat Developer Toolset バージョンの Valgrind を使用してください。

GCC が生成する統合機能が SystemTap を混乱

GCC 最適化では、他の関数のインラインのコピーの一部向けに合成関数を生成することが可能です。この合成関数はファーストクラス関数に見え、SystemTap や GDB といったツールを混乱させます。これは、合成関数と実関数の両方のエントリーポイントに SystemTap プローブを配置することが可能なためです。これは、単一の基礎的関数コールで複数の SystemTap プローブヒットにつながります。
この問題を回避するには、SystemTap スクリプトに再帰の検出やインライン化された部分関数に関連するプローブの抑制といった対抗措置を採用する必要がある可能性があります。例えば、
probe kernel.function("can_nice").call { }
上記のスクリプトは、以下のような問題を避けることを試みます。
global in_can_nice% probe kernel.function("can_nice").call { in_can_nice[tid()] ++; if (in_can_nice[tid()] > 1) { next } /* real probe handler here */ } probe kernel.function("can_nice").return { in_can_nice[tid()] --; }
このスクリプト例は、可能性のあるあらゆるシナリオを考慮しているわけではありません。例えば、kprobes や kretprobes がない場合や、本当に再帰が意図されている場合などでは、予想通りの動作にはなりません。

ABRT のバックトレース収集時に SELinux AVC が生成される

新たな ABRT のオプション機能を有効にして /etc/abrt/plugins/CCpp.conf 設定ファイルの CreateCoreBacktrace オプションを使用),、コアダンプファイルをディスクに書き込まずにクラッシュしたプロセスからバックトレースを収集できるようにすると、abrt-hook-ccpp ツールがクラッシュしたプロセスで sigchld アクセスを使用してプロセスのすたく上の関数一覧を取得使用とすると、SELinux AVC メッセージが生成されます。

ウォッチポイントをヒットと報告した後も GDB がウォッチポイントをアクティブで維持する

64-bit ARM アーキテクチャーでは、GDB ウォッチポイントをヒットと報告した後も間違ってアクティブに維持する場合があります。こうなるとウォッチポイントは 2 回ヒットされることになり、この場合にのみハードウェア表示がウォッチポイントとして認識されず、一般的な SIGTRAP シグナルとしてプリントされます。この問題を回避して余分な SIGTRAP レポートを止める方法はいくつかあります。
* ウォッチポイントがヒットされた後に SIGTRAP を見たら、continue と入力する。
* ~/.gdbinit 設定ファイルに以下の行を追加して、GDB に SIGTRAP シグナルを無視するよう指示する。
handle SIGTRAP nostop noprint
* ハードウェアウォッチポイントの代わりにソフトウェアウォッチポイントを使用する。ソフトウェアウォッチポイントではデバッグは大幅に遅くなり、使用可能なのは watch コマンド (rwatchawatch は使用不可) であることに注意してください。~/.gdbinit 設定ファイルに以下の行を追加します。
set can-use-hw-watchpoints 0

grubaa64.efi を使ったブートが失敗する

pxeboot または PXE 設定ファイルの問題により、7.2 grubaa64.efi ブートローダーを使って Red Hat Enterprise Linux 7.2 をインストールすると失敗するか、オペレーティングシステムの起動に非常に時間がかかることになります。回避策としては、Red Hat Enterprise Linux 7.2 のインストール時に 7.2 grubaa64.efi ファイルではなく 7.1 grubaa64.efi ファイルを使用します。

GCC の MPX 機能が Red Hat Developer Toolset バージョンの libmpx ライブラリーを必要とする

libmpxwrappers ライブラリーは、gcc-libraries バージョンの libmpx ライブラリーから欠落しています。このため、MPX (メモリー保護拡張機能) が GCC で正常に機能せず、アプリケーションが適切にリンクしない可能性があります。この問題を回避するには、Red Hat Developer Toolset 4.0 バージョンの libmpx ライブラリーを使用します。