更新日付: 2004 年 5 月 27 日 |
Sun[tm] Studio 9: dbx Readme |
目次
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 で解決されたソフトウェアの問題点を説明します。
- dbx が、最適化された C++ コードのレジスタ内容およびクラスメンバーを出力できない
- bcheck のエラーの報告に間違いがある
- sparcv9 コードの実行時検査中に dbx からエラーメッセージ (Error 0) が表示される
- 自身が制御できないプロセスを dbx が強制終了させる
- stop inclass/inobject に時間がかかる
- 64 ビット: 大きな連続するヒープブロックのアクセス検査に失敗する
- dbx の修正継続で、Pro/E が SIGILL でクラッシュする
dbx が、最適化された C++ コードのレジスタ内容およびクラスメンバーを出力できない (4964695)
Sun Studio 8 で修正済み。 現在の dbx は、-g -xO4 を付けてコンパイルされた C++ コードのレジスタ ($o7) やクラスメンバー (foo.x) を出力できます。
bcheck のエラーの報告に間違いがある (4460648)
実行時検査で捕捉されていなかった、ヒープ上のデータ構造体に対する範囲外の割り当てが捕捉されるようになっています。
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"この問題は修正されています。
自身が制御できないプロセスを dbx が強制終了させる (5022145)
さらにメモリーが必要とされるにもかかわらず、スワップ空間がないなどの理由で割り当てられない場合、dbx は、デバッグ中のプロセスを強制終了させます。報告されたこの問題そのものは修正済みです。しかし、dbx が追加のメモリーを取得できない場合に不具合が起きる状況は他にも考えられます。デバッグ中にシステムの限界に達しないようにしてください。
stop inclass/inobject に時間がかかる (4952613)
Sun Studio 8 で修正済み。 パフォーマンス上のこの問題は修正されています。
64 ビット: 大きな連続するヒープブロックのアクセス検査に失敗する (4958325)
dbx は 32 ビット値を使用して、ヒープブロックのサイズを格納しています。これよりブロックサイズが大きいと、dbx に混乱が生じていました。この問題は修正されています。
dbx の修正継続で、Pro/E が SIGILL でクラッシュする (4974233)
動作中の実行可能ファイルに置換関数のアドレスのパッチを行うときに、dbx がアドレスを間違えることがありました。この問題は修正されています。
E. 問題点と回避策
ここでは、これまでに判明しているソフトウェアの問題点とその回避策について説明します。最新情報については、http://docs.sun.com から入手可能なリリースノートを参照してください。
- dbx がプロセスに接続されると、データ収集で問題が発生する
- RTC は、埋め込み構造体の複製をエラーと考える
- dbx がコピーコンストラクタからの RUI を検査しない
- dbx で Java コードのデバッグ中に障害が発生する場合がある
- dbx で Java コードの再デバッグ中に障害が発生する
dbx がプロセスに接続されると、データ収集で問題が発生する
コレクタライブラリ libcollector.so を事前に読み込まずに実行プロセスに dbx を接続すると、多数のエラーが発生します。
- トレーシングデータを収集することはできません。トレーシングデータとは、同期待ちトレース、ヒープトレース、MPI トレースなどです。トレーシングデータはさまざまなライブラリへの割り込み処理によって収集されます。 libcollector.so が事前に読み込まれていない場合、割り込み処理ができなくなります。
- dbx がプロセスに接続されたあとにシグナルハンドラがインストールされ、そのシグナルハンドラが SIGPROF および SIGEMT 信号を通過しない場合、プロファイリングデータと標本データが失われます。
- プログラムが非同期入出力ライブラリ libaio.so を使用している場合、クロックベースのプロファイリングデータと標本データが失われます。 libaio.so は、非同期の取り消し操作のために SIGPROF を使用するためです。(4397578)
- プログラムがハードウェアカウンタライブラリ libcpc.so を使用している場合、ハードウェアカウンタのオーバーフロープロファイリング実験は失敗します。コレクタとプログラムの両方がそのライブラリを使用しているためです。dbx がプロセスに接続された後にハードウェアカウンタライブラリが読み込まれた場合、libcpclibrary 関数への参照が libcpc.so の検索ではなく通常の検索によって解決されれば、ハードウェアカウンタの実験は成功します。
- プログラムが setitimer(2) を呼び出す場合、クロックベースのプロファイリング実験は失敗することがあります。コレクタとプログラムの両方がタイマーを使用しているためです。
RTC は、埋め込み構造体の複製をエラーと考える (4460536)
実行時検査を有効にすると、データ領域間にギャップ (隙間またはパディング) のある構造体がコピーされる場合に RUI (初期化されていないメモリーからの読み取り) エラーが生成されます。
dbx がコピーコンストラクタからの RUI を検査しない
実行時検査が、インライン化された C++ のコピーコンストラクタに対して、RUI (初期化されていないメモリーからの読み取り) エラーを誤って報告することがあります。
dbx で Java コードのデバッグ中に障害が発生する場合がある (4893079)
dbx シェルの中で、cd コマンドを実行した場合、もしくは CLASSPATH 環境変数または CLASSPATHX 環境変数を設定した場合、dbx でセグメント例外が発生することがあります。
回避策:
- 上記の実行もしくは設定を行わない。
- 上記の実行もしくは設定を行う前に、すべてのウォッチポイント (表示) を削除する。
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 -1Linux プラットフォームでのプログラムのデバッグでは、次の問題が発生する可能性があります。
- プログラムが 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.