Sun[tm] Studio 9: dbx Readme
Description: Sun Studio 9 dbx Readme
Keywords: readme, documentation, publication,

更新日付： 2004 年 5 月 27 日

### Sun[tm] Studio 9: `dbx` Readme

> #### 目次

> 1. はじめに
> 2. Sun Studio 9 `dbx` について
> 3. 新規および変更された機能
> 4. ソフトウェアの修正事項
> 5. 問題点と回避策
> 6. 制限事項と互換性の問題
> 7. 記述の誤りの訂正

> #### A. はじめに

> この文書では、Sun[tm] Studio 9 `dbx` に関する情報を提供します。このリリースで導入された新機能、ソフトウェアの修正事項、既知の問題点、制限事項、互換性の問題について説明します。この文書の記載内容はこのリリースのマニュアルの記載内容に優先します。

> 製品マニュアル
> - リリースノート (Solaris プラットフォーム) : http://docs.sun.com から入手可能です。リリースノートの情報は、すべての README ファイルの情報を更新および補足します。
> - リリースノート (Linux プラットフォーム) : http://docs.sun.com から入手可能です。リリースノートの情報は、すべての README ファイルの情報を更新および補足します。
> - Sun Studio 9 のドキュメント: 製品のマニュアルページ、README の HTML バージョン、およびマニュアルは、`/installation_directory/SUNWspro/docs/ja/index.html` からアクセスできます。デフォルトの installation_directory は、Solaris プラットフォームの場合は `/opt/SUNWspro`、Linux プラットフォームの場合は `/opt/sun/sunstudio9` です。
> - 統合開発環境 (IDE) のドキュメント: IDE にある「ヘルプ」メニューから Sun Studio 9 IDE の各コンポーネントのオンラインヘルプにアクセスできます。
> - 開発者向けリソースのポータル: 技術資料、サンプルコード、ドキュメント、ナレッジベースについては、開発者向けポータルの `http://developers.sun.com/prodtech/cc` を参照してください。

> #### B. Sun Studio 9 `dbx` について

> `dbx` は、ソースレベルの対話型コマンド行デバッグツールです。このツールを使い、制御された方法でプログラムを実行したり、停止したプログラムの状態を検査したりできます。`dbx` によって、パフォーマンスデータの収集も含めて、プログラムの動的な実行を完全に制御することができます。このリリースの `dbx` は、次のプラットフォームで利用できます。

> - Solaris[tm] オペレーティングシステム:
>   - SPARC® プラットフォーム版のバージョン 8、9、10
>   - x86 プラットフォーム版のバージョン 8、9、10
> - Linux オペレーティングシステム:
>   - Sun[tm] Java Desktop System, 2003
>   - SuSE Linux Enterprise Server 8
>   - RedHat Enterprise Linux 3

> #### C. 新規および変更された機能

> ここでは、`dbx` で新たに追加された機能と変更された機能を説明しています。

> Sun Studio 9 `dbx` で新しく追加された、または変更された機能は次のとおりです。

> - Linux プラットフォームでの gcc および g++ コンパイラのサポート
> - Solaris x86 プラットフォーム版での Fortran のサポート

> gcc や g++ コンパイラでコンパイルされたプログラム、あるいは Linux プラットフォームで動作するプログラムの場合、`dbx` の一部機能は利用できません。詳細は、制限事項と互換性の問題を参照してください。

> Solaris プラットフォーム版のその他の Sun Studio 9 コンポーネントについては、`http://docs.sun.com` から入手可能な『Sun Studio 9 の新機能』をお読みください。

> #### D. ソフトウェアの修正事項

> ここでは、Sun Studio 9 リリースの `dbx` で解決されたソフトウェアの問題点を説明します。

> 1. `dbx` が、最適化された C++ コードのレジスタ内容およびクラスメンバーを出力できない
> 2. `bcheck` のエラーの報告に間違いがある
> 3. sparcv9 コードの実行時検査中に `dbx` からエラーメッセージ (Error 0) が表示される
> 4. 自身が制御できないプロセスを `dbx` が強制終了させる
> 5. `stop inclass/inobject` に時間がかかる
> 6. 64 ビット: 大きな連続するヒープブロックのアクセス検査に失敗する
> 7. `dbx` の修正継続で、Pro/E が `SIGILL` でクラッシュする

> 1. ##### `dbx` が、最適化された C++ コードのレジスタ内容およびクラスメンバーを出力できない (4964695)

>    Sun Studio 8 で修正済み。 現在の `dbx` は、`-g -xO4` を付けてコンパイルされた C++ コードのレジスタ (`$o7`) やクラスメンバー (`foo.x`) を出力できます。

> 2. ##### `bcheck` のエラーの報告に間違いがある (4460648)

>    実行時検査で捕捉されていなかった、ヒープ上のデータ構造体に対する範囲外の割り当てが捕捉されるようになっています。

> 3. ##### sparcv9 コードの実行時検査中に `dbx` からエラーメッセージ (Error 0) が表示される (4975411)

>    Sun Studio 8 で修正済み。 アクセス検査を有効にして `dbx` 上で 64 ビット SPARC プログラムを実行すると、`dbx` から次のようなエラーメッセージが表示されることがあります。

>             dbx: read of 4 bytes at address 0x8 failed --- Error 0
>             dbx warning: internal handler (-396) made defunct --- could not
>                 enable event FRET"

>    この問題は修正されています。

> 4. ##### 自身が制御できないプロセスを `dbx` が強制終了させる (5022145)

>    さらにメモリーが必要とされるにもかかわらず、スワップ空間がないなどの理由で割り当てられない場合、`dbx` は、デバッグ中のプロセスを強制終了させます。報告されたこの問題そのものは修正済みです。しかし、`dbx` が追加のメモリーを取得できない場合に不具合が起きる状況は他にも考えられます。デバッグ中にシステムの限界に達しないようにしてください。

> 5. ##### `stop inclass/inobject` に時間がかかる (4952613)

>    Sun Studio 8 で修正済み。 パフォーマンス上のこの問題は修正されています。

> 6. ##### 64 ビット: 大きな連続するヒープブロックのアクセス検査に失敗する (4958325)

>    `dbx` は 32 ビット値を使用して、ヒープブロックのサイズを格納しています。これよりブロックサイズが大きいと、`dbx` に混乱が生じていました。この問題は修正されています。

> 7. ##### `dbx` の修正継続で、Pro/E が `SIGILL` でクラッシュする (4974233)

>    動作中の実行可能ファイルに置換関数のアドレスのパッチを行うときに、`dbx` がアドレスを間違えることがありました。この問題は修正されています。

> #### E. 問題点と回避策

> ここでは、これまでに判明しているソフトウェアの問題点とその回避策について説明します。最新情報については、http://docs.sun.com から入手可能なリリースノートを参照してください。

> 1. `dbx` がプロセスに接続されると、データ収集で問題が発生する
> 2. RTC は、埋め込み構造体の複製をエラーと考える
> 3. `dbx` がコピーコンストラクタからの RUI を検査しない
> 4. `dbx` で Java コードのデバッグ中に障害が発生する場合がある
> 5. `dbx` で Java コードの再デバッグ中に障害が発生する

> 1. ##### `dbx` がプロセスに接続されると、データ収集で問題が発生する

>    コレクタライブラリ `libcollector.so` を事前に読み込まずに実行プロセスに dbx を接続すると、多数のエラーが発生します。

>    - トレーシングデータを収集することはできません。トレーシングデータとは、同期待ちトレース、ヒープトレース、MPI トレースなどです。トレーシングデータはさまざまなライブラリへの割り込み処理によって収集されます。`libcollector.so` が事前に読み込まれていない場合、割り込み処理ができなくなります。
>    - `dbx` がプロセスに接続されたあとにシグナルハンドラがインストールされ、そのシグナルハンドラが `SIGPROF` および `SIGEMT` 信号を通過しない場合、プロファイリングデータと標本データが失われます。
>    - プログラムが非同期入出力ライブラリ `libaio.so` を使用している場合、クロックベースのプロファイリングデータと標本データが失われます。`libaio.so` は、非同期の取り消し操作のために `SIGPROF` を使用するためです。(4397578)
>    - プログラムがハードウェアカウンタライブラリ `libcpc.so` を使用している場合、ハードウェアカウンタのオーバーフロープロファイリング実験は失敗します。コレクタとプログラムの両方がそのライブラリを使用しているためです。`dbx` がプロセスに接続された後にハードウェアカウンタライブラリが読み込まれた場合、`libcpclibrary` 関数への参照が `libcpc.so` の検索ではなく通常の検索によって解決されれば、ハードウェアカウンタの実験は成功します。
>    - プログラムが `setitimer(2)` を呼び出す場合、クロックベースのプロファイリング実験は失敗することがあります。コレクタとプログラムの両方がタイマーを使用しているためです。

> 2. ##### RTC は、埋め込み構造体の複製をエラーと考える (4460536)

>    実行時検査を有効にすると、データ領域間にギャップ (隙間またはパディング) のある構造体がコピーされる場合に RUI (初期化されていないメモリーからの読み取り) エラーが生成されます。

> 3. ##### `dbx` がコピーコンストラクタからの RUI を検査しない

> 実行時検査が、インライン化された C++ のコピーコンストラクタに対して、RUI (初期化されていないメモリーからの読み取り) エラーを誤って報告することがあります。

> 4. ##### `dbx` で Java コードのデバッグ中に障害が発生する場合がある (4893079)

> `dbx` シェルの中で、`cd` コマンドを実行した場合、もしくは CLASSPATH 環境変数または CLASSPATHX 環境変数を設定した場合、dbx でセグメント例外が発生することがあります。

> 回避策:

> - 上記の実行もしくは設定を行わない。
> - 上記の実行もしくは設定を行う前に、すべてのウォッチポイント (表示) を削除する。

> 5. ##### `dbx` で Java コードの再デバッグ中に障害が発生する (4801883)

> Java コードに対して 2 つの `debug` コマンドを実行することによって、`dbx` で障害が発生する場合があります。

> #### F. 制限事項と互換性の問題

> Sun Studio 9 `dbx` には次の制限があります。

> - Linux プラットフォームでは、`dbx` の次の機能は利用できません。
>   - コアファイルのデバッグ
>   - 修正継続
>   - Java のデバッグ
>   - 実行時検査
>   - パフォーマンスデータの収集
>   - 次のイベントのブレークポイント
>     - `fault`
>     - `lastrites`
>     - `lwp_exit`
>     - `sysin`
>     - `sysout`
>     - `sync`
>     - `throw`
> - `dbx` は、Linux プラットフォームでフォークされたプロセスを追跡できません。また、`exec()` が呼び出されたときに新しいプログラムに切り替えられません。
> - Linux プラットフォームの場合、Korn シェルの `pipe` 演算子には制約があります。ターゲットプロセスにアクセスする必要がある `dbx` コマンドはパイプラインの一部として機能しません。たとえば次のコマンドは、`dbx` をハングアップさせる可能性があります。

>       where | head -1

>   回避策:

>   - Ctrl-C で新しい `dbx` プロンプトを表示します。
>   - `dbx` は大量の情報をキャッシュに書き込むため、上記の例の場合は、次のコマンドシーケンスで機能します。

>         where
>         where | head -1

> - Linux プラットフォームでのプログラムのデバッグでは、次の問題が発生する可能性があります。

>   - プログラムが `clone()` を使用して独自のスタイルのスレッドを実装している場合、`dbx` のスレッドサポートによってスレッドが正しく識別されない。

>     回避策:
>     `clone()` ではなく、`libthread.so` を使ってください。

>   - Linux の threads ライブラリは、その内部機構の一部に `SIGSTOP` シグナルを使っています。通常、`dbx` はそれらのシグナルをユーザーから隠し、他のソースからの純粋な `SIGSTOP` シグナルを監視できるようにします。しかし、まれに Linux が予期しない方法で `SIGSTOP` を使用することがあり、その場合、`dbx` はシステム生成の `SIGSTOP` をユーザー生成の `SIGSTOP` と解釈します。

>     回避策:
>     `ignore` コマンドを使用して、`SIGSTOP` シグナルをキャッチしないよう `dbx` に指示してください。

>   - スレッドは終了するが、Linux から `dbx` にその終了が報告されないことがある。この問題は、新しいスレッドライブラリ (NPTL) を利用すると発生することが少なくなります。

>     スレッドが終了し、その終了が報告されない場合、`dbx` は決して起こることのないイベントを待ち、新しいプロンプトを表示しません。この状況は、`dbx` で `cont` コマンドを発行した後で最も発生しますが、`step up` コマンドや `step` コマンド、`next` コマンドの後でも発生することがあります。

>     回避策:

>     - Ctrl-C を押すと、`dbx` が待ち状態を終了し、新しいプロンプトを表示することがあります。
>     - Ctrl-C が機能しない場合は、いったん `dbx` を終了して、再起動します。
> - g++ コンパイラでコンパイルされているプログラムの場合、C++ 式に関する実行時型情報は得られません。
> - Solaris x86 プラットフォーム版では、実行時検査のメモリーアクセス検査機能は利用できません。
> - 動作中のプロセスに `.dbxrc` から接続することはできません。このため、`.``dbxrc` ファイルに、コードを実行するコマンドを含めないでください。ただし、別のファイル内にこのようなコマンドを入れておき、dbx `source` コマンドを使用して、そのファイル内のコマンドを実行することはできます。
> - `compat=4` のとき、`dbx` がメンバー関数に対するポインタを不正に復号化します。`compat=5` では、この問題は発生しません。

>   回避策: 次のコマンドを使って、プログラムを再コンパイルしてください。

>       CC -compat=4 -Qoption ccfe -abiopt=pmfun1

>   このフラグによって ABI が変更されるため、正規の構築には使用しないでください。
> - V9/V9 システムの場合、`-g` オプションと `-O` オプションの両方を使ってコンパイルされたコードとコードの間をまたぐようなスタックトレースを行うと、引数が整数型以外のとき不正な結果になります。そのような関数の浮動小数点パラメータを表示しようとすると、次のエラーメッセージが表示されます。

>       RegSet::getd('o1'): cannot -- will return 0.0

>   回避策: `-g` のみ使用してください。

> - V9/V9 システムでは、`call` コマンドや表示関連の関数の呼び出しの引数または戻り値として小さな入れ子構造を使用することはできません。
> - 古い `libC.so.5` または `libC.so.4` を使用すると、C++ の例外領域で `dbx` に問題が発生します。不正なスタブや未処理の例外に関する警告メッセージが出力されることがあります。

>   回避策: 最新の `libC.so.5` をすべてのシステムにインストールしてください。

>   `libC.so.5` は、Sun Studio 9 のダウンロードまたは `http://sunsolve.sun.com` で、各システムアーキテクチャの Solaris オペレーティングシステムのバージョンごとに SUNWlibC のパッチとして提供されています。ご使用の Solaris オペレーティングシステムおよびシステムアーキテクチャ用のパッチ番号については、http://docs.sun.com から入手可能なリリースノートを参照してください。

> - Fortran の場合、実行時検査機能を最大限に活用するには、`-stackvar` コンパイラオプションを使用してください。

>   プログラムによっては、`-stackvar` が正しく機能しないことがあります。そのような場合は、`-C` コンパイラオプションを試してください。このオプションは、添字の検査を有効にします。

> - マルチスレッドアプリケーションで、fork の追跡が正しくないことがあります。
> - `call` コマンドまたは `print` コマンドによる関数呼び出しを使用すると、マルチスレッドアプリケーションがデッドロック状態になることがあります。
> - ファイルがプリコンパイル済みヘッダー (PCH) によって収集されたものの一部であった場合は、ヘッダーファイルの変更に `dbx` の修正継続機能を使用しないでください。
> - `dbx` コマンド行インタプリタは、CSI (Code Set Independence) をサポートしない旧バージョンの Korn シェル (ksh) です。マルチバイト文字は、`dbx` コマンド行に入力すると誤って解釈される場合があります。

> #### G. 記述の誤りの訂正

> 現時点では新しい情報はありません。

> Copyright (C) 2004 Sun Microsystems, Inc. All rights reserved.Use is subject to license terms.