この章では、コンパイラ、リンカ、デバッガについて説明します。この章の内容は次のとおりです。
SunOS 4.x から Solaris 2.6 に移行する開発者にとって最も大きな変更点は、C コンパイラがバンドルされなくなったことです。コンパイラをバンドルしない理由の 1 つに、動的なカーネルがあります。動的なカーネルでは、必要に応じて自動的にデバイスが追加されるので、カーネルの再構築にコンパイラを使用する必要がありません。
ANCI C コンパイラは、アンバンドル製品の Sun WorkShopTMに含まれています。このコンパイラ製品は、Solaris 2.6 のオブジェクト形式である ELF 形式で実行可能ファイルを作成します。lint と lint ライブラリもアンバンドルです。
『Source Compatibility Guide』では、SunOS 4.x C コンパイラ (Sun C) によって実装された C 言語と『ANSI Programming Language C』(ANSI C) に定義されている C 言語の違いについて説明しています。これらの違いは、Sun C コンパイラ用のソースを ANSI C 準拠のコンパイラに移植するとき必要になります。
表 15-1 は、SunOS 4.x Sun C と ANSI C のコンパイラを Solaris 2.6 Sun WorkShop C++ 4.2 コンパイラと比較しています。これは単に情報を提供するための一覧で、デフォルトの Solaris 2.6 リリースで利用できる機能を説明するものではありません。
表 15-1 では、『American National Standard Information Systems - Programming Lnaguage XX3.159-1989, approved December 14, 1989』に基づく情報を示します。
次の点に注意してください。
「Yes」は、そのオプションがそのコンパイラによってサポートされることを示します。
オプションが変更されている場合、新しいオプションが示されます。
「No」は、オプションがそのドライバによってサポートされないことを示します。
Sun WorkShop C++ 4.2 の欄の「+」は SVID 仕様にとって必要なオプションを示します。
オプションまたはフラグ |
Sun C |
ANSI C |
Sun WorkShop C++ 4.2 |
説明 |
---|---|---|---|---|
-A symbol |
No |
Yes |
Yes |
cpp に assert を含む |
-a |
Yes |
Yes |
-xa |
基本ブロックの実行回数を数える |
-align |
Yes |
Yes |
No |
ページ揃え (ld) |
-assertx |
Yes |
Yes |
-z |
リンク時の assert を指定する |
-BX |
Yes |
Yes |
Yes |
バインディングタイプを指定する (SunOS リリース 5.6 のライブラリに対してのみ) |
-bnzero |
Yes |
Yes |
No |
非ゼロ AR を生成する |
-C |
Yes |
Yes |
No |
cpp のコメントを残す |
-c |
Yes |
Yes |
+Yes |
.o ファイルを生成 |
-cg87 |
Yes |
Yes |
No |
オプションを -cg87 に設定 |
-cg89 |
Yes |
Yes |
Yes |
オプションを -cg89 に設定 |
-dryrun |
Yes |
Yes |
Yes |
ドライバによって構築されるコマンドを表示 |
-Dx |
Yes |
Yes |
+Yes |
cpp にシンボル x を定義 |
-d |
Yes |
Yes |
No |
共通の定義の強制 (ld) |
-dalign |
Yes |
Yes |
Yes |
double はダブルワードで整列されると仮定する |
-dl |
Yes |
Yes |
No |
長いデータセグメント参照を生成 |
-d[y|n] | -BX | -BX |
Yes |
動的リンク [yes|no] |
-E |
Yes |
Yes |
+Yes |
cpp によるソースの実行 |
-e |
No |
No |
No |
ld のエントリポイント |
-F |
-O* |
-O* |
+No |
最適化指令 |
-f |
No |
No |
No |
浮動小数点サポート |
-fast |
Yes |
Yes |
Yes |
最高性能のためのオプション |
-fsingle |
Yes |
No |
No |
浮動小数点数は単精度 |
-fsingle2 |
Yes |
No |
No |
倍精度でない浮動小数点数として浮動小数点数を渡す |
-fnonstd |
Yes |
Yes |
Yes |
標準でない浮動小数点数オプション |
-fstore |
Yes |
No |
Yes |
記憶時に書き込みの強制 |
-G |
No |
No |
Yes |
-dn オプションで利用できない共用ライブラリの作成 |
-g |
Yes |
Yes |
+Yes |
dbx 用に情報を生成 |
-go |
Yes |
No |
No |
adb 用に情報を生成 |
-H |
Yes |
Yes |
Yes |
インクルードしたファイルのパスを出力 |
-h name |
No |
No |
Yes |
内部識別子としての名前を使用。 soname がリンカに渡される |
-help |
Yes |
Yes |
-flags |
オプションの表示 |
-Ix |
Yes |
Yes |
+Yes |
x を追加してパスを組み込む |
-J |
sun3 |
No |
No |
switch|case 用にロングオフセットを生成 |
-KPIC |
-PIC |
-PIC |
Yes |
ポジションに依存しないコード |
-Kpic |
-pic |
-pic |
Yes |
ショートオフセットによる PIC |
-Kminabi |
No |
No |
No |
ABI 準拠コード |
-libmil |
Yes |
Yes |
-xlibmil |
-fast の一部として libm.il を渡す |
-lx |
Yes |
Yes |
Yes |
オブジェクトライブラリの読み込み (ld 用) |
-Lx |
Yes |
Yes |
Yes |
ld ライブラリパスに x を追加 |
-M |
Yes |
Yes |
No |
依存事項の収集 |
-M mapfile |
Yes |
No |
No |
リンカに mapfile を渡す |
-misalign |
Yes |
Yes |
Yes |
整列されていない Sun-4 データを処理 |
-N |
Yes |
No |
No |
共有にしない |
-n |
Yes |
No |
No |
共有にする |
-native |
Yes |
Yes |
Yes |
適切な -cg オプションの使用 |
-noc2 |
Yes |
Yes |
No |
peephole (のぞき穴) を最適化しない |
-nolibmil |
Yes |
Yes |
-xnolibmil |
-fast で libm.il を渡さない |
-o file |
Yes |
Yes |
+Yes |
出力ファイルの名前の設定 |
-O[1,2,3,4] |
Yes |
Yes |
-x0[1,2,3,4] |
最適化されたコードの生成 |
-O |
Yes |
Yes |
+Yes |
最適化されたコードの生成 |
-P |
Yes |
Yes |
+Yes |
cppを使用してソースを実行し .i に出力 |
-PIC |
Yes |
No |
-KPIC |
ロングオフセットで pic コードを生成 |
-p |
Yes |
Yes |
+Yes |
prof のデータを収集 |
-pg |
Yes |
Yes |
-xpg |
gprof のデータを収集 |
-pic |
Yes |
Yes |
-Kpic |
ショートオフセットの pic コード |
-pipe |
Yes |
No |
No |
一時ファイルのかわりにパイプを使用 |
-purecross |
Yes |
No |
No |
VROOT にスラッシュを入れない |
-Qdir x |
Yes |
Yes |
-Y* |
x からコンパイラパスを探す |
-Qpath x |
Yes |
Yes |
-Y* |
-Qdir と同じ |
-Qn |
No |
No |
Yes |
バージョンスタンプ情報を追加しない |
-Qy |
No |
No |
Yes |
バージョンスタンプ情報を追加する |
-qdirx |
Yes |
Yes |
No |
x からコンパイラパスを探す |
-ql |
No |
No |
No |
lprof 用にデータを収集 |
-qp |
-p |
-p |
-p |
prof 用にデータを収集 |
-qpath x |
Yes |
Yes |
No |
-Qdir と同じ |
-Qoption cpp x |
Yes |
Yes |
Yes |
プログラム cpp にオプション x を渡す |
-Qoption iropt x |
Yes |
Yes |
Yes |
プログラム iropt にオプション x を渡す |
-Qoption cg x |
Yes |
Yes |
Yes |
プログラム cg にオプション x を渡す |
-Qoption inline x |
Yes |
Yes |
No |
プログラム inline にオプション x を渡す |
-Qoption as x |
Yes |
Yes |
No |
プログラム as にオプション x を渡す |
-Qoption asS x |
Yes |
Yes |
No |
プログラム asS にオプション x を渡す |
-Qoption ld x |
Yes |
Yes |
Yes |
プログラム ld にオプション x を渡す |
-qoption cpp x |
Yes |
Yes |
No |
プログラム cpp にオプション x を渡す |
-qoption ccom x |
Yes |
Yes |
No |
プログラム ccom にオプション x を渡す |
-qoption lintl x |
Yes |
Yes |
No |
プログラム lint1 にオプション x を渡す |
-qoption iropt x |
Yes |
Yes |
Yes |
プログラム iropt にオプション x を渡す |
-qoption cg x |
Yes |
Yes |
Yes |
プログラム cg にオプション x を渡 |
-qoption inline x |
Yes |
Yes |
No |
プログラム inline にオプション x を渡す |
-qoption cat x |
Yes |
Yes |
No |
プログラム cat にオプション x を渡す |
-qoption c2 x |
Yes |
Yes |
No |
プログラム c2 にオプション x を渡す |
-qoption as x |
Yes |
Yes |
No |
プログラム as にオプション x を渡す |
-qoption asS x |
Yes |
Yes |
No |
プログラム asS にオプション x を渡す |
-qoption ld x |
Yes |
Yes |
Yes |
プログラム ld にオプション x を渡す |
-Qproduce .o |
Yes |
Yes |
Yes |
形式 .o ファイルの生成 (オブジェクトファイル) |
-Qproduce .s |
Yes |
Yes |
Yes |
形式 .s ファイルの生成 (アセンブラソース) |
-Qproduce .c |
Yes |
Yes |
No |
形式 .c ファイルの生成 (C ソース) |
-Qproduce .i |
Yes |
Yes |
Yes |
形式 .i ファイルの生成 (cpp 後の C ソース) |
-qproduce .o |
Yes |
Yes |
Yes |
形式 .o ファイルの生成 (オブジェクトファイル) |
-qproduce .s |
Yes |
Yes |
Yes |
形式 .s ファイルの生成 (アセンブラソース) |
-qproduce .c |
Yes |
Yes |
No |
形式 .c ファイルの生成 (C ソース) |
-qproduce .i |
Yes |
Yes |
Yes |
形式 .i ファイルの生成 (cpp 後の C ソース) |
-r |
Yes |
Yes |
No |
再配置可能にしてリンカに渡す |
-R |
Yes |
Yes |
No |
テキストセグメントにデータをマージする |
-R |
No |
No |
Yes |
実行時リンカに対する検索ディレクトリの指定 |
-S |
Yes |
Yes |
+Yes |
.s ファイルのみを生成 |
-s |
Yes |
Yes |
Yes |
Strip (4.1)。リンカに渡す |
-sb |
Yes |
Yes |
-xsb |
コードブラウザのための情報の収集 |
-strconst |
No |
Yes |
No |
文字列リテラルを読み出し専用データセグメントに置く |
-sun2 |
Yes |
No |
No |
Sun-2TM システム用のコードの生成 |
-sun3x |
Yes |
No |
No |
Sun-3x システム用のコードの生成 |
-sun386 |
Yes |
No |
No |
Sun386iTM システム用のコードの生成 |
-sun3 |
Yes |
No |
No |
Sun-3TM システム用のコードの生成 |
-sun4c |
Yes |
No |
No |
Sun-4cTM システム用のコードの生成 |
-sun4 |
Yes |
No |
No |
Sun-4TM システム用のコードの生成 |
-target |
Yes |
No |
-xtarget |
ターゲットアーキテクチャを x に設定 |
-temp=dir |
Yes |
Yes |
Yes |
temps のディレクトリを dir に設定 |
-time |
Yes |
Yes |
Yes |
実行回数を報告 |
-u |
Yes |
Yes |
No |
シンボル引数を undef(ld) として入力 |
-Ux |
Yes |
Yes |
+Yes |
cpp シンボル x の定義解除 |
-v |
Yes |
Yes |
Yes |
詳細モード |
-v |
No |
No |
Yes |
厳密なセマンティクスチェック |
-V |
Yes |
Yes |
+Yes |
プログラムのバージョンの報告 |
-W |
No |
No |
No |
他のコンポーネントへの引数 |
-w |
Yes |
Yes |
Yes |
警告を出力しない |
-X[t,a,c,s] |
No |
Yes |
No |
互換性オプション |
-Y |
No |
No |
No |
パス名を構成要素に変更 |
-yx |
Yes |
No |
No |
シンボルの追跡 |
-z |
-assert |
-assert |
No |
リンカで assert をオンにする |
-# |
-v |
-v |
No |
詳細モード |
-EOF |
No |
No |
No |
ファイル引数 |
C コンパイラには 表 15-2 に示すような形式のファイル名引数を使用できます。
表 15-2 C コンパイラによって使用されるファイル名拡張子
接尾辞 |
ファイル形式 |
---|---|
.a |
オブジェクトライブラリ |
.il |
インライン展開ファイル |
.o |
オブジェクトファイル |
.so |
共有オブジェクト |
.s |
アセンブラソース |
.S |
cpp 用のアセンブラソース |
.c |
C ソース |
.i |
cpp 後の C ソース |
「file.X=.Y」はファイル 「file.X」を読み込みますが、接尾辞「Y」があるかのようにそのファイルを扱います。
Solaris 2.6 ではリンクエディタ ld(1) に対していくつかの変更があります。最も重要な変更は新しい ELF のファイルフォーマットを処理する機能です。
ライブラリと実行可能プログラムを構築するには、リンカを直接起動することよりもコンパイラドライバによる方法をお勧めします。コンパイラは、リンカが必要とする多数のファイルを自動的に供給します。
新しいリンカでリネームされたオプションもあれば同じものもあり、また不要になったオプションもあります。表 15-3 では SunOS 4.x の ld を Solaris 2.6 の ld コマンドと比較します。
表 15-3 に続く節で、リンク作業がオプションの相違によってどのように影響を受けるかについて説明します。
表 15-3 ld オプションの比較
SunOS 4.x のオプション |
Solaris 2.6 での変更 |
注 |
---|---|---|
-align datum |
-M mapfile |
mapfile と異なるセクションの使用 |
-assert definitions |
デフォルト |
|
-assert nodefinitions |
-znodefs |
警告ではなく致命的エラーを発行 |
-assert nosymbolic |
-zdefs |
警告ではなく致命的エラーを発行 |
-assert pure-text |
-ztext |
警告ではなく致命的エラーを発行 |
-A name |
変更なし |
dlopen(3X) とdlclose(3X) はこの動作に接近可能 |
-Bdynamic |
-Bdynamic |
共用ライブラリの取り込みにのみ適用される。動的にリンクされた実行可能プログラムを構築するには -dy (デフォルト) を使用。「実行可能ファイルの作成」を参照。 |
-Bnosymbolic |
-zdefs |
|
-Bstatic |
-dn & -Bstatic |
動的なリンカを完全に除去するには、-dn オプションを指定しなければならない。アーカイブライブラリを取り込むために動的モードで -Bstatic を使用 (トグルとして使用。「実行可能ファイルの作成」を参照)。 |
-Bsymbolic |
-Bsymbolic |
このオプションを付けて-assert nosymbolic も取得する。 |
-d -dc -dp |
デフォルト |
オフに設定するには、SVR4 で -b オプションを使用しなければならない。 |
-D hex |
-M mapfile |
mapfile には、希望する結果を達成するためにいろいろなメカニズムが含まれる。 |
-e entry |
-e entry |
|
no -e |
-G |
共有オブジェクトを作成する。 |
-lx[.v] |
-lx |
共用ライブラリのメジャー番号が示すバージョンだけが現在サポートされている。 |
-Ldir |
-Ldir |
dir は実行可能プログラムに記録されない。かわりに、-R オプションを使用。 |
-M |
-m |
|
-n |
デフォルト |
SVR4 の実行可能プログラムのフォーマットは、ディスクイメージを -n として圧縮 |
-N |
変更なし |
|
-o name |
-o name |
|
-p |
デフォルト |
-M mapfile で取り消し可能。 |
-r |
-r |
|
-S |
変更なし |
|
-s |
-s |
|
-t |
変更なし |
|
-T hex |
-M mapfile |
mapfile には、希望する結果を達成するためにいろいろなメカニズムが含まれる。 |
-Tdata hex |
-M mapfile |
mapfile には、希望する結果を達成するためにいろいろなメカニズムが含まれる。 |
-u name |
-u name |
|
-x |
変更なし |
|
-X |
変更なし |
|
-y sym |
変更なし |
|
-z |
デフォルト |
Solaris 2.6 で共用ライブラリを作成するには、-G オプションを指定する必要があります。SunOS 4.x では、-e オプションなしで共用ライブラリを作成することをリンカが自分で判断しますが、Solaris 2.6 では共用ライブラリがエントリポイントを持つ可能性があるため、このオプションは使用できなくなりました。
-Bdynamic と -Bstatic オプションはまだ利用できますが、その動作はかなり異なります。現在では、これらのオプションは実行可能バインディングではなくライブラリのインクルードを指します。実行可能バインディングは、Solaris 2.6 で新しい -dy と -dn オプションでのみ排他的に設定されます。-dy オプションがデフォルトです。これは、動的にリンクされた実行可能ファイルを作成するために必要です。-dn オプションは、静的にリンクされた実行可能ファイルを作成するために必要です。
-Bdynamic と -Bstatic オプションは、-dy オプションを使用したときだけ適用されます。 -Bdynamic はリンクエディタに共用ライブラリを含めるように指示し、-Bstatic はアーカイブライブラリを含めるように指示します。これらのオプションは、次の -Bdynamic または -Bstatic オプション指定が現れるまで、-l 引数を管理する切り替え (トグル) として機能します。
次の例に、同様の実行可能プログラムを作成するのに使用できる SunOS 4.x と Solaris 2.6 コマンドを示します。
sunos4.1% ld Bstatic test.o -lx
libx.a を使用して、静的な実行可能ファイルを作成する。
sunos5.x% ccdn test.o -lx
libx.a を使用して、静的な実行可能ファイルを作成する。
sunos4.1% ld Bdynamic test.o -lx
libx.so を使用して、動的な実行可能ファイルを作成する。
sunos5.x% cc test.o -lx
libx.so を使用して、動的な実行可能ファイルを作成する。
sunos4.1% ld Bdynamic test.o Bstatic -lx
libx.a を使用して、動的な実行可能ファイルを作成する。
sunos5.x% cc test.o Bstatic -lx
libx.a を使用して、動的な実行可能ファイルを作成する。
SunOS 4.x では、-L オプションを付けて指定したディレクトリはリンク時に検索され、その情報は実行時に使用するために保持されていました。この動作は現在では、 -L と -R オプションに分けられています。 -L オプションはリンク時に検索するディレクトリを指定し、-R オプションはリンカに対して、実行時に使用するために保持する検索パスを指示します。詳細については、「検索パスの規則」を参照してください。
-Bdynamic と -Bstatic オプションと同様に、 -L オプションの位置には意味があります。これは、それに続く -l オプションにだけに適用されます。
動的リンカと実行時リンカが SunOS 4.x リンカによって使用されたのとは異なるアルゴリズムを使って検索パスを決定します。
以下の例では、SunOS 4.x と Solaris 2.6 の動的リンカおよび実行時リンカの検索パスを比較します。Solaris 2.6 では、リンクエディタと実行時リンカの検索パスは LD_LIBRARY_PATH
設定値の影響を受けることに注意してください。
SunOS 4.x リンカ検索パス
リンクエディタ: -L, LD_LIBRARY_PATH
, /usr/lib, /usr/local/lib
実行時リンカ: LD_LIBRARY_PATH
, -L, /usr/lib, /usr/local/lib
LD_LIBRARY_PATH
=dirlist1 がある Solaris 2.6 リンカ検索パス
リンクエディタ: -L, dirlist1, /usr/ccs/lib, /usr/lib
実行時リンカ: dirlist1, -R, /usr/lib
LD_LIBRARY_PATH
=dirlist1, dirlist2) がある Solaris 2.6 リンカ検索パス
リンクエディタ: dirlist1, -L, dirlist2, /usr/ccs/lib, /usr/lib
SunOS 4.x は、共用ライブラリに対してメジャーとマイナーの両方のバージョン番号をサポートしていました。Solaris 2.6 は、メジャーバージョン番号だけをサポートします。バイナリ互換性のサポートについては、メジャーおよびマイナーバージョン番号は SunOS 4.x 共用ライブラリで認識されます。これらのライブラリは、SunOS 4.x ソフトウェアにあったのと同じメジャーおよびマイナーバージョン番号を保持するために必要となります。
表 15-4 は、SunOS 4.x および Solaris 2.6 の共用ライブラリのバージョンを示します。
表 15-4 共用ライブラリの例
SunOS 4.x |
Solaris 2.6 |
---|---|
libc.so.1.7 |
libc.so.1 |
libdl.so.1.0 |
libdl.so.1 |
SunOS 4.x システムソフトウェアにおいては、 -l オプションを指定した場合、build environment linker はメジャーおよびマイナー番号をともに持つライブラリを検索しました。たとえば、-ldl を指定した場合、ライブラリ、libdl.so.1.0 がリンクされます。Solaris 2.6 環境では、メジャー番号はサポートされていますが、デフォルトのリンクエディタはバージョン番号を無視します。前の例では、build envrionment linker は現在では libdl.so と特定のバージョンのファイルを指すシンボリックリンクを検索します。
リンカによって参照された時、デフォルトでは、動的に実行可能なオブジェクトまたは共有オブジェクト中の dependency レコードは関連する共有オブジェクトのファイル名です。依存性の指定をより一貫した方法にするために、共有オブジェクトは実行時に参照されるべきファイル名をそれ自身に記録することができます。これはライブラリファイルをリンクする時に -h オプションによって指定します。
Solaris 2.6 では、シンボリックリンクはほとんどのライブラリに対して作成されています。メジャー番号をつけて新しい共用ライブラリを構築し、それから最もよく使用するライブラリのバージョンを指すシンボリックリンクを作成してください。
新しいユーティリティの dump(1) (「ファイルのバックアップと復元」を参照) により、オブジェクトファイルのデバッグ、または静的および動的リンクのチェックが容易になります。dump -L オプションは、実行可能プログラムに含まれる実行時リンカに必要な情報を表示します。この情報は、ELF ファイルの動的セクションに含まれます。 RPATH
エントリは、ld. の -R オプションにより指定された検索パスを表示します。
例を以下に示します。
libx.so.1 から libx.so へのリンクを作成します。
examples% cc -G -o libx.so.1 -h libx.so.1 libx.o examples% cp libx.so.1 /mylibs examples% ln -s /mylibs/libx.so.1 /mylibs/libx.so examples% dump -Lv libx.so.1 libx.so.1: **** DYNAMIC SECTION INFORMATION **** .dynamic : [INDEX] Tag Value [1] INIT 0x3b8 [2] FINI 0x3f4 [3] SONAME libx.so.1 [4] HASH 0x94 [5] STRTAB 0x33c [6] SYMTAB 0x14c [7] STRSZ 0x62 [8] SYMENT 0x10 [9] PLTGOT 0x10404 [10] PLTSZ 0xc [11] PLTREL 0x7 [12] JMPREL 0x3ac [13] RELA 0x3a0 [14] RELASZ 0x18 [15] RELAENT 0xc
ライブラリが他の動的ライブラリを必要とするときは、次の例に示すように、RPATH
と共に動的ライブラリを指定するようにします。
次の例では prog.c をコンパイルし、(前の例で構築された) libx.so を動的にリンクし、バイナリが実行のためカレントディレクトリ情報を保持するように指定します。この例は、コンパイル済みプログラムの prog.c についての dump 出力を示します。ここで、前の例の SONAME
フィールドに格納された情報は、prog により NEEDED
として示されます。prog が実行されると、libx.so.1 は、libx.so でも、異なるバージョンにリンクされます。
examples% cc -o prog prog.c -L/mylibs -R/mylibs -lx example% dump -Lv prog prog: **** DYNAMIC SECTION INFORMATION **** .dynamic : [INDEX] Tag Value [1] NEEDED libx.so.1 [2] NEEDED libc.so.1 [3] INIT 0x1b1ac [4] FINI 0x1b248 [5] RPATH /mylibs [6] HASH 0x100e8 [7] STRTAB 0x17f90 [8] SYMTAB 0x12be0 [9] STRSZ 0x31e1 [10] SYMENT 0x10 [11] DEBUG 0x0 [12] PLTGOT 0x2b25c [13] PLTSZ 0x30 [14] PLTREL 0x7 [15] JMPREL 0x1b180 [16] RELA 0x1b174 [17] RELASZ 0x3c [18] RELAENT 0xc
dbx と dbxtool は、デフォルトのシステムソフトウェアには含まれません。アンバンドル製品の Sun WorkShop には、これらの改良版が含まれています。
adb と kadb は、Solaris 2.6 オペレーティングシステムにバンドルされていて、SunOS 4.x のツールと同じ機能を提供します。kadb はマルチプロセッサで使用できるよう改良されました。kadb のプロンプトにはプロセッサ ID が表示されます。以下の例では、プロセッサ ID が 0 になっています。
Solaris 2.6 環境で容易にカーネルのデバッグを行うには、次のようにします。
savecore を使用可能にします (/etc/init.d/sysetup ファイルの savecore 行のコメントを解除します)。
kadb 下でブートします (システムクラッシュ時に $c と入力します)。
adb と crash を使用します。
以下の kadb マクロは、マルチスレッドカーネルといっしょに使用すると特に有効です。
現在のスレッドを表示します。現在のスレッドポインタは、SPARC グローバルレジスタ g7 です。
kadb[0]: <g7$<thread |
threadlist は、システム内のすべてのカーネルスレッドのスタックトレースを表示します。このリストは非常に長くなることがあります。
kadb[0]: $<threadlist |
mutex は、所有スレッドのアドレスを表示します。この例では、グローバルで危険なドライバ mutex を使用しています。
kadb[0]: unsafe_driver$<mutex |
kadb[0]: moddebug/W 0x80000000 |
moddebug は、モジュールのロードを監視できるようにします。デバッグ専用に使用する moddebugの有効な値については、<sys/modctl.h> の最後を参照してください。
稼働中のカーネルをデバッグするには、次のコマンドを使用します。
# adb -k /dev/ksyms /dev/mem |
/dev/ksyms は、稼働中のカーネルの完全な名前を含む擬似デバイスです。
truss は、実行したシステムコール、受信シグナル、ハードウェア障害などを追跡するために開発された新しいユーティリティです。truss には、SunOS 4.x の trace(1) コマンドにはなかった、フォークされたプロセスの追跡機能やマルチスレッドプロセスの処理機能を含む重要な機能がいくつか追加されています。
次の例は、date コマンドの追跡結果を要約したものです。-c オプションを指定すると、truss は行単位の追跡を表示せず、システムコール、シグナル、フォルトの回数をカウントして、その合計を表示します。
example% truss -c date Fri Sep 18 14:31:30 PDT 1992 syscall seconds calls errors _exit .00 1 read .00 7 write .00 1 open .03 12 close .00 12 time .00 1 brk .01 4 lseek .00 1 fstat .00 4 ioctl .00 1 execve .00 1 mmap .01 17 munmap .00 8 ---- --- --- sys totals: .05 70 0 usr time: .03 elapsed: .28
truss オプションの詳細については、truss(1) のマニュアル・ページを参照してください。Solaris 2.6 ではこの他に pmap(1) のような proc(4) を基本としたデバッグツールが数多く用意されています。