3.7. Cygwin ユーティリティ

Cygwin には Cygwin 環境の UNIX エミュレーション部分を管理するために使われる、様々なコマンドラインユーティリティが存在します。 UNIX 上での対応するユーティリティの機能の大部分を反映するために、 これらはそれぞれ Cygwin に特化した形で書かれています。 オプション名は長い形式又は短い形式が共に利用可能です。 例えば、--help-h の機能は同等です。全ての Cygwin コマンドラインユーティリティは --help--version オプションをサポートしています。

Usage: cygcheck [OPTIONS] [PROGRAM...]
Check system information or PROGRAM library dependencies

 -c, --check-setup   check packages installed via setup.exe
 -d, --dump-only     no integrity checking of package contents (requires -c)
 -s, --sysinfo       system information (not with -k)
 -v, --verbose       verbose output (indented) (for -[cfls] or programs)
 -r, --registry      registry search (requires -s)
 -k, --keycheck      perform a keyboard check session (not with -[scfl])
 -f, --find-package  find installed packages containing files (not with -[cl])
 -l, --list-package  list the contents of installed packages (not with -[cf])
 -h, --help          give help about the info (not with -[cfl])
 -V, --version       output version information and exit

cygcheck プログラムは Cygwin プログラムの診断を行うユーティリティです。 もし dpkgrpm を使い慣れていれば、cygcheck も同じようにに利用出来ます(一番の違いは、インストールやアンインストールは setup.exe が行うという点です。詳細については 項2.1. 「インターネットセットアップ」 を参照して下さい)。

-c オプションはインストール済みの Cygwin パッケージのバージョンと状態をチェックします。 引数が指定されなかった場合は全てのパッケージの情報が出力されますが、 一つ以上のパッケージを指定した場合、cygcheck は指定されたパッケージの情報だけを出力します。 「Incomplete」が出力されたパッケージは、 元々インストールされていたはずのファイルが失われてしまっていることを示しています。 このような場合は、setup.exe を利用してパッケージを再インストールして下さい。 失われたファイルを確認するには -v オプションを利用します。 もし個々のパッケージの状態を調べる必要はなく、cygcheck をより高速に実行させたければ、オプション -d を指定して下さい。この場合、cygcheck は各パッケージの名前とバージョンだけを出力します。

一つ以上のプログラムをコマンドラインから指定した場合、cygcheck はそれらのプログラムが依存している DLL の名前を示すことによって、プログラムの実行時環境を診断します。 -s オプションを指定した場合、cygcheck は一般的なシステム情報を出力します。-s に加えて一つ以上のプログラムをコマンドラインに指定した場合、cygcheck は両方の情報を出力します。

-f オプションはあるファイルがどのパッケージに所属しているかを調査し、-l オプションはパッケージに含まれる全てのファイルの一覧を表示します。 例えば、/usr/bin/less とそのパッケージについて調べるならば、次のようにします。

-h オプションは、レポート中の各セクションの先頭に追加の補助情報を出力します。 テーブルの行ヘッダも追加されます。 これは有用な情報ですが、レポートのサイズは若干大きくなります。 コンパクトなレポートを必要とする場合、あるいは全てについて既に知っている場合は、単にこれを取り除いて下さい。

-v オプションは出力をより詳細なものにします。 通常は必要とされない追加の情報、例えば DLL の内部バージョン番号や再帰的な DLL の使用に関する追加情報、そして PATH 中に含まれるディレクトリ中のあるファイルが、PATH 中に含まれる他のディレクトリ中にも存在しているかどうかなどが出力されます。

-r オプションは、Cygwin プログラムに関連した情報を含むレジストリを cygcheck に検索させます。 これらのレジストリエントリはその名称中に「Cygwin」を含むものです。 もしプライバシーにこだわるのであればこのレポートから情報を削除しても構いませんが、問題を解決する作業がより困難になるであろうということを覚えておいて下さい。

cygcheck プログラムは、トラブルシューティング用にあなたのシステムの情報が必要になった場合に、それを送るために利用されます。 このコマンドを実行するように要求された場合、電子メールで送信出来るように出力を保存して下さい。以下に例を示します。

C:\cygwin> cygcheck -s -v -r -h > cygcheck_output.txt
Usage: cygpath (-d|-m|-u|-w|-t TYPE) [-c HANDLE] [-f FILE] [options] NAME
       cygpath [-ADHPSW] 
Convert Unix and Windows format paths, or output system path information

Output type options:
  -d, --dos             print DOS (short) form of NAME (C:\PROGRA~1\)
  -m, --mixed           like --windows, but with regular slashes (C:/WINNT)
  -M, --mode            report on mode of file (currently binmode or textmode)
  -u, --unix            (default) print Unix form of NAME (/cygdrive/c/winnt)
  -w, --windows         print Windows form of NAME (C:\WINNT)
  -t, --type TYPE       print TYPE form: 'dos', 'mixed', 'unix', or 'windows'
Path conversion options:
  -a, --absolute        output absolute path
  -l, --long-name       print Windows long form of NAME (with -w, -m only)
  -p, --path            NAME is a PATH list (i.e., '/bin:/usr/bin')
  -s, --short-name      print DOS (short) form of NAME (with -w, -m only)
System information:
  -A, --allusers        use `All Users' instead of current user for -D, -P
  -D, --desktop         output `Desktop' directory and exit
  -H, --homeroot        output `Profiles' directory (home root) and exit
  -P, --smprograms      output Start Menu `Programs' directory and exit
  -S, --sysdir          output system directory and exit
  -W, --windir          output `Windows' directory and exit

cygpath プログラムは、 ネイティブの Windows ファイル名から Cygwin の POSIX スタイルのパス名への変換、 またはその逆の変換を行うためのユーティリティです。 Cygwin プログラムがネイティブの Windows プログラムへとファイル名を渡す必要がある場合、又はネイティブの Windows プログラムが Cygwin プログラムへとファイル名を渡すことが想定される場合に使用します。 また、cygpath は重要なシステムディレクトリの位置を、Windows 又は UNIX の形式の何れかで出力することも出来ます。

-u-w は、 Windows 形式から UNIX(POSIX) 形式へと変換するのか (-u)、或いは UNIX(POSIX) 形式から Windows 形式へと変換するのか (-w)を指示します。 DOS 形式(8.3 形式)のファイル名又はパス名を得るためには、-d を利用して下さい。 -m オプションは Windows 形式で出力しますが、バックスラッシュの代わりにスラッシュを利用します。 このオプションは、バックスラッシュをエスケープ文字として利用するシェルスクリプト内で特に有用でしょう。

-w オプションに組み合わせるオプションとして、 通常形式(長い形式)を出力するための -l と、DOS 形式(短い形式)を出力するための -s オプションが利用出来ます。-d オプションは -w-s の両方を指定した結果と同等です。

注意: 環境変数 CYGWINcheck_case パラメータに strict が設定されている場合、-l オプションは動作しません。なぜなら、このモードでは Cygwin は Windows の短いパスにマッチさせることが出来ないからです。

-p オプションは、 単独のファイル名ではなくパス形式の文字列へと変換することを意味します。 例えば、PATH 環境変数は Windows ではセミコロンで区切られていますが、 UNIX ではコロンで区切られています。 -p を使用することによって、 これらの形式の間の変換を行うように cygpath に指示出来ます。

-p オプションは単純なファイル名ではなく、パス形式の文字列を変換するために利用します。 例えば、PATH 環境変数は Windows ではセミコロンで区切られていますが、UNIX ではコロンで区切られています。 -p オプションを利用すれば、cygpath を利用して両方のフォーマットの変換を行うことが出来ます。

-i オプションは、引数としてファイル名が与えられなかった場合に、使用方法が出力されることを抑制します。 適切な形式に省略されうる変数を変換する Makefile のルール内で利用することが出来ます。 cygpath の出力にはスペースが含まれる可能性があるので(例: C:\Program Files)、クォートで括る必要があります。

大文字のオプション -D-H-P-S そして -W は、Windows によって利用されるディレクトリを出力します。 これらのディレクトリは、全てのシステムに対して同一ではありません。 例えば、-S は C:\WINNT\SYSTEM32 か C:\WINDOWS\SYSTEM を出力し得ます。 -H は、ホームのルートとして利用される Windows のプロファイルディレクトリを出力します。 -A オプションは、-D-P オプションが出力する現在のユーザ用のディレクトリの代わりに、「All Users」ディレクトリを出力させるために利用します。 シングルユーザでしか利用されない Windows 9x システムでは、-A は何らの意味も持ちません。-D-AD は同じ出力になります。 デフォルトでは、出力は UNIX(POSIX)形式となります。 他の形式で出力するには、-w 又は -d オプションを利用して下さい。

Usage: dumper [OPTION] FILENAME WIN32PID
Dump core from WIN32PID to FILENAME.core

-d, --verbose  be verbose while dumping
-h, --help     output help information and exit
-q, --quiet    be quiet while dumping (default)
-v, --version  output version information and exit

dumper ユーティリティは実行中の Windows プロセスのコアダンプを作成するために利用します。 このコアダンプは後から gdb で読み込み、分析するために利用出来ます。 一般的な dumper の利用方法は、Cygwin のジャストインタイムデバッグ機能として組み込むことです。 そのためにはCYGWIN 環境変数に

error_start=x:\path\to\dumper.exe

を追加します。x:\path\to\dumper.exe は Cygwin 上でのパスではなく、Windows 形式で記述する必要があるという点に注意して下さい。 error_start がこのように設定されたなら、プログラムに致命的なエラーが発生した時点で dumper が起動されます。

dumper は実行中のプロセスのコアダンプを作るために、コマンドラインから開始させることも出来ます。 残念ながら Windows API の制限により、コアダンプが作成され dumper が終了した時点で、対象となったプロセスもまた終了させられてしまいます。

コアダンプのスペースを小さくするため、dumper はプロセスのメモリ空間のうち、実行ファイルからロードされた部分、DLL ファイル、そして不変部分(例えばプログラムコードやデバッグ情報)については書き出しを行いません。 代わりに、dumper はそれらのデータを含んでいるファイルへのパスを保存します。 コアダンプが gdb によってロードされると、 これらのパスは適切なファイルをロードするために利用されます。 このことはつまり、あるマシンで作成されたコアダンプを別のマシンでデバッグするのであれば、コアダンプが作成されたマシンと同じ位置に実行形式や DLL のコピーを配置しておく必要があるということを意味します。

Usage: getfacl [-adn] FILE [FILE2...]
Display file and directory access control lists (ACLs).

  -a, --all      display the filename, the owner, the group, and
                 the ACL of the file
  -d, --dir      display the filename, the owner, the group, and
                 the default ACL of the directory, if it exists
  -h, --help     output usage information and exit
  -n, --noname   display user and group IDs instead of names
  -v, --version  output version information and exit

When multiple files are specified on the command line, a blank
line separates the ACLs for each file.

getfacl は引数として与えられた個々の通常のファイル、特殊ファイル又はディレクトリについて、所有者、グループそして ACL を出力します。 ディレクトリに対しては、getfacl は更にデフォルトの ACL をも表示します。 オプションが指定されなかった場合、 getfacl はファイル名、所有者、グループ、ACL と(もし存在するのなら)デフォルトの ACL の両方を表示します。 Cygwin 及び Windows の ACL に関する更なる情報については、 Cygwin ユーザーズガイドの 項2.3. 「NT セキュリティと ntsec の使用方法」 を参照して下さい。ACL の出力形式は以下のようになります。

     # file: filename
     # owner: name or uid
     # group: name or uid
     user::perm
     user:name or uid:perm
     group::perm
     group:name or gid:perm
     mask:perm
     other:perm
     default:user::perm
     default:user:name or uid:perm
     default:group::perm
     default:group:name or gid:perm
     default:mask:perm
     default:other:perm

Usage: kill [-f] [-signal] [-s signal] pid1 [pid2 ...]
       kill -l [signal]
Send signals to processes

 -f, --force     force, using win32 interface if necessary
 -l, --list      print a list of signal names
 -s, --signal    send signal (use kill --list for a list)
 -h, --help      output usage information and exit
 -v, --version   output version information and exit

kill プログラムは他の Cygwin プログラムに対して任意のシグナルを送信するためのものです。 通常、 ^C が動作しない場合に他のウィンドウから実行中のプログラムを停止させるために利用しますが、 SIGUSR1 のようなプログラム指定のシグナルをプログラム中でのトリガ、 例えばデバッグ用途やログファイルの再オープンなどのために送信することも出来ます。 個々のプログラムは、プログラム自身が理解するシグナルを定義します。

Cygwin のデフォルトのシェルである bash を含む幾つかのシェルから kill を実行する場合、フルパスで指定する必要があります。なぜなら、bash は組み込みコマンドとして kill を定義しているからです。更なる情報については、bash のマニュアルページの BUILTIN COMMANDS を参照して下さい。Cygwin 版の kill を利用していることを確かめるには、

$ /bin/kill --version

を実行して、Cygwin の kill のバージョン番号と著作権情報が出力されることを確認します。

-f オプションを指定しない限り、kill が利用する「pid」値は Cygwin の PID であり、Windows の PID ではないことに注意して下さい。実行中のプログラムとそれらの Cygwin での PID のリストを取得するには、Cygwin の ps を使用します。ps -W は、全ての Windows PID を表示します。

kill -l オプションは指定されたシグナルの名前を表示します。 シグナルが指定されなかった場合は、全てのシグナルの名前を表示します。

特定のシグナルを送信するためには、 次に示す例のようにシグナル番号又はシグナル名 (「SIG」部分を省いたもの)と共に -signN オプションを使用します。

利用可能なシグナルとシグナル番号、そしてそれらに対するコメントをここに挙げます。 これらの情報は、この情報に関する公式な情報源であると考えられる <sys/signal.h> から引用したものです。

SIGHUP       1    ハングアップ
SIGINT       2    中断
SIGQUIT      3    終了
SIGILL       4    不正な命令 (受信時にリセットされない)
SIGTRAP      5    トレーストラップ (受信時にリセットされない)
SIGABRT      6    abort の使用
SIGEMT       7    EMT 命令
SIGFPE       8    浮動小数点例外
SIGKILL      9    kill (受信あるいは無視は出来ない)
SIGBUS      10    バスエラー
SIGSEGV     11    セグメント違反
SIGSYS      12    システムコールに対する不正な引数
SIGPIPE     13    誰も読まないパイプに対する書き込み
SIGALRM     14    アラームクロック
SIGTERM     15    kill からのソフトウェア終了命令
SIGURG      16    入出力チャネルにおける緊急事態
SIGSTOP     17    tty からではない、送信可能な中止
SIGTSTP     18    tty からの中止
SIGCONT     19    停止したプロセスの再開
SIGCHLD     20    親プロセスに対する、子プロセスの中止又は終了
SIGCLD      20    System V における SIGCHLD の名称
SIGTTIN     21    to readers pgrp upon background tty read
SIGTTOU     22    like TTIN for output if (tp->t_local&LTOSTOP)
SIGIO       23    入出力可能なシグナル
SIGPOLL     23    System V における SIGIO の名称
SIGXCPU     24    CPU 時間の制限の超過
SIGXFSZ     25    ファイルサイズの制限の超過
SIGVTALRM   26    仮想タイムアラーム
SIGPROF     27    プロファイリングタイムアラーム
SIGWINCH    28    ウィンドウの変更
SIGLOST     29    リソースの消失 (例えば、レコードロックの消失)
SIGUSR1     30    ユーザ定義シグナル 1
SIGUSR2     31    ユーザ定義シグナル 2
Usage: mkgroup [OPTION]... [domain]...
Prints /etc/group file to stdout

Options:
   -l,--local             print local group information
   -c,--current           print current group, if a domain account
   -d,--domain            print global group information (from current
                          domain if no domains specified).
   -o,--id-offset offset  change the default offset (10000) added to gids
                          in domain accounts.
   -s,--no-sids           don't print SIDs in pwd field
                          (this affects ntsec)
   -u,--users             print user list in gr_mem field
   -g,--group groupname   only return information for the specified group\n");
   -h,--help              print this message

   -v,--version           print version information and exit

One of `-l' or `-d' must be given on NT/W2K.

mkgroup プログラムは、システム情報から最初の /etc/group の代用品(幾つかのコマンドはこのファイルを必要とします)を作成することによって、Windows システムの構成の手助けを行います。このプログラムは NT 系システム(Windows NT、2000 及び XP)でのみ動作します。 mkgroup は Windows 9x 系システム(Windows 95、98 及び Me)では動作しません。なぜなら、それらの OS にはセキュリティモデルのサポートが欠けているからです。マシンの最初のセットアップのためには、以下のようにします。

mkgroup プログラムは最初の /etc/group を作成することによって、 Windows システムをより UNIX 的に構成するための手助けを行います。 mkgroup の用途は Windows のセキュリティ情報を取り込むことにあり、 NT 系列(WindowsNT、2000 及び XP)では不可欠です。 mkgroup は Windows 9x 系列(Windows 95、98 及び Me)ででも、 正しい形式でファイルを作成するために利用されます。 貴方がローカルユーザであれば、マシンの最初の設定のために以下のようにコマンドを実行して下さい。

この情報は静的なものであることに注意して下さい。 もしシステム内のグループ情報を変更したときは、 新しい情報を反映するために group ファイルを再作成する必要があります。

-d-l オプションは、「ローカルマシンから」「(デフォルト、又は指定した)ドメインから」或いは「その両方から」のどの方法で情報を取り出すかを指定するためのものです。 現在のドメインのユーザに対するエントリは、オプション -c と共に -l を与えた場合に生成されますが、-c-d と共に使われた場合、何の効果も持ちません。 -o オプションは、(複数のドメインのような)特別なケースにおいて、GID が違うものにマッチする場合に利用します。 -s オプションは NT セキュリティ識別子(SID)を省略します。 SID に関する更なる情報については、Cygwin ユーザーズガイドの 項2.3. 「NT セキュリティと ntsec の使用方法」 を参照して下さい。 -u オプションは個々のグループごとにユーザを調べ、gr_mem フィールド(最後のフィールド)にグループのメンバを格納するよう mkgroup に通知します。 大きなドメインに対して mkgroup を実行すると、実行時間が非常に大きくなるという点には注意して下さい。 ローカルマシンがドメインコントローラから切断されていても、gr_mem フィールドを設定しておけばリモートからのドメインユーザでのログイン時に役立ちます。 -g は一つのグループに関する情報のみを出力します。

Usage: mkpasswd [OPTION]... [domain]...
Prints /etc/passwd file to stdout

Options:
   -l,--local              print local user accounts
   -c,--current            print current account, if a domain account
   -d,--domain             print domain accounts (from current domain
                           if no domains specified)
   -o,--id-offset offset   change the default offset (10000) added to uids
                           in domain accounts.
   -g,--local-groups       print local group information too
                           if no domains specified
   -m,--no-mount           don't use mount points for home dir
   -s,--no-sids            don't print SIDs in GCOS field
                           (this affects ntsec)
   -p,--path-to-home path  use specified path and not user account home dir or /home
   -u,--username username  only return information for the specified user
   -h,--help               displays this message
   -v,--version            version information and exit

One of `-l', `-d' or `-g' must be given on NT/W2K.

mkpasswd プログラムはシステム情報から最初の /etc/passwd を作成します。 mkpasswd の用途は Windows のセキュリティ情報を取り込むことにあり、 NT 系列(WindowsNT、2000 及び XP)では不可欠ですが、 実際のパスワードは /etc/passwd の内容からではなく、 Windows によって決定されます。 Windows 9x 系列(Windows 95、98 及び Me)でリモートアクセスが必要な場合、 password フィールドは crypt your_password の出力によって置き換えられていなければなりません。 貴方がローカルユーザであれば、マシンの最初の設定のために以下のようにコマンドを実行して下さい。

この情報は静的なものであることに注意して下さい。 もしシステム内のユーザ情報を変更したときは、 新しい情報を反映するために passwd ファイルを再度作成し直す必要があります。

-d-l オプションは、 「ローカルマシンから」「(デフォルト、又は指定した)ドメインから」或いは「その両方から」のどの方法で情報を取り出すかを指定するためのものです。 -d オプションを指定した場合、mkpasswd プログラムはドメインコントローラに接続します。 現在のドメインのユーザに対するエントリは、 オプション -c と共に -l を与えた場合に生成されますが、 -c-d と共に使われた場合、何の効果も持ちません。 -o オプションは、(複数のドメインのような)特別なケースにおいて、UID が違うものにマッチする場合に利用します。 -g オプションは各ローカルグループに対応するローカルユーザを生成します。 これは、NT がグループにもファイル所有権を与えるからです。 -m オプションは現在のマウントテーブルをバイパスします。 なぜなら、仮に二人のユーザが Windows ホームディレクトリを H: に構えているとしても、それぞれに異なった方法でマウント出来るからです。 -s オプションは NT セキュリティ識別子(SID)を省略します。 SID に関する更なる情報については、Cygwin ユーザーズガイドの 項2.3. 「NT セキュリティと ntsec の使用方法」 を参照して下さい。 -p オプションはアカウントのホームディレクトリや /home/ ではなく、指定した接頭辞を付けるように mkpasswd に指示するためのものです。例えば、以下のコマンド

は、ローカルのユーザのホームディレクトリを Windows の「Profiles」ディレクトリに配置します。 Windows 9x マシンでは、-u は指定したユーザのエントリを生成します。 NT 系列では -u オプションは指定したユーザだけを出力対象とするので、大きなドメインでの実行時間を大幅に短縮させます。

Usage: mount [OPTION] [<win32path> <posixpath>]
Display information about mounted filesystems, or mount a filesystem

  -b, --binary     (default)    text files are equivalent to binary files
                                (newline = \n)
  -c, --change-cygdrive-prefix  change the cygdrive path prefix to <posixpath>
  -f, --force                   force mount, don't warn about missing mount
                                point directories
  -h, --help                    output usage information and exit
  -m, --mount-commands          write mount commands to replace user and
                                system mount points and cygdrive prefixes
  -o, --options X[,X...]        specify mount options
  -p, --show-cygdrive-prefix    show user and/or system cygdrive path prefix
  -s, --system     (default)    add system-wide mount point
  -t, --text                    text files get \r\n line endings
  -u, --user                    add user-only mount point
  -v, --version                 output version information and exit
  -x, --executable              treat all files under mount point as executables
  -E, --no-executable           treat all files under mount point as 
                                non-executables
  -X, --cygwin-executable       treat all files under mount point as cygwin
                                executables

mount プログラムは、一般的な UNIX システム上の mount コマンドが行うように、ドライブ及び共有を Cygwin がシミュレートする POSIX ディレクトリツリーにマップします。 Cygwin の POSIX ファイルシステムの背後にあるコンセプト及びマウントの戦略についての更なる情報については 項3.1.2. 「Cygwin マウントテーブル」 を参照して下さい。 マウントを解除するには、umount コマンドを利用します。

パラメータを指定せずただ単に mount とタイプした場合、 現在のマウントテーブルが表示されます。

この例では、C:\cygwin は POSIX ディレクトリツリーのルートディレクトリに、D ドライブは /d にマップされています。この場合、ルートのマウントは Cygwin プログラムを実行する全ユーザが利用可能なシステム全体のマウントポイントですが、 対して /d のマウントは現在のユーザにだけのものであるということを覚えておいて下さい。

mount ユーティリティはマウントテーブルに新しいマウントを追加する仕組みでもあります。 以下の例は、ディレクトリ \\pollux\home\joe\data/data へとマウントするというものです。

先の例の mount は Windows コマンドシェルから起動されたということに注意して下さい。 bash を含む多くのUNIX シェルでは「\」がシェルのエスケープ文字であるため、Win32 パス名中でも「/」を使用することが出来ますし、またそのほうが便利です。

mount-s フラグは、ユーザ独自のマウントテーブルではなく、そのシステムにおける全ての Cygwin ユーザによって使用されるシステム全体のマウントテーブルにマウントを追加するために使われます。 システム全体でのマウントは、先の例での / パーティションのように、 mount コマンド使用時に「system」タイプとして表示されます。 Windows NT では、Administrator 権限を持ったユーザだけがシステム全体のマウントテーブルを修正することが出来ます。

指定された POSIX パスはユーザテーブルとシステム全体のテーブルのいずれかにのみ存在可能であるということに注意して下さい。 マウントを置き換えようとした場合、busy エラーが発生して失敗します。 -f (force; 強制)フラグは、既存のマウントを警告なしに新しいマウントで置き換えます。 Win32 パスとしてディレクトリが存在しない場合についても警告を発しません。

-b フラグは、デフォルトでバイナリを処理し、テキストファイルについても同様の動作をするよう Cygwin に指示するために使われます。 バイナリモードマウントは、mount の出力中の Flags 列中で「binmode」として表示されます。 デフォルトでは、マウントはテキストモードとなります(Flags 列には「textmode」として表示されます)。

通常、特定の拡張子(.exe、.com、.bat、.cmd)で終了するファイルは実行形式であると見なされます。 同様に、ファイルの先頭の 2 文字が「#!」で始まっているファイルも実行可能だと見なされます。 -x フラグは、マウントされたファイルは「実行可能」であるということを Cygwin に指示するために使われます。 もし -x フラグがディレクトリに対して使用された場合、 そのディレクトリ中の全てのファイルが実行可能となります。 このオプションを使用すればそれ以外のファイルも実行可能としてマーク出来るので、 個々のファイルの内容が「#!」で始まっているかどうかをチェックするためのオーバーヘッドを回避することが出来ます。 -X オプションは -x と非常に似ていますが、多少の高速化を図るため、通常の Windows プログラムに対するコマンドと環境変数を Cygwin が設定することを防止します。 これらのフラグと対照的なのが -E であり、全てのファイルが実行可能ではないことを意味します。

-m オプションは、ユーザ及びシステムの両方のマウントポイントを再生成するための一連のコマンド群を mount ユーティリティに出力させるというものです。 マウントテーブルの実験をする場合、この出力をバックアップとして保存しておくことが出来ます。 また、設定内容を別のマシンへとより簡単に適用するために利用することも出来るでしょう。

-o オプションはマウントポイントに関する様々なオプションをまとめるメソッドです。 以下のオプションが利用できます(オプションの大部分は他のマウントフラグと重複していることに注意して下さい)。

  user       - ユーザ独自マウント中のマウントとする。
  system     - システムテーブル中のマウントとする(デフォルト)。
  binary     - ファイルのデフォルトをバイナリモードとする(デフォルト)。
  text       - ファイルのデフォルトを CRLF テキストモード行終端とする。
  exec       - マウントポイント以下のファイルを全て実行可能とする。
  notexec    - マウントポイント以下のファイルを全て実行不能とする。
  cygexec    - マウントポイント以下のファイルを全て Cygwin の実行可能形式とする。
  nosuid     - suid されたファイルを許可しない(現在未実装)。
  managed    - Cygwin によってディレクトリが管理される。ファイル名中の
               大文字小文字の混在及び特殊文字の利用が許される。

特定の Win32 パスを POSIX パスへと変換する際に Cygwin が既存のどのマウントも利用できなかった場合は、 Cygwin は代わりにデフォルトのマウントポイントである /cygdrive を使用した POSIX パスへと変換します。 例えば、Cygwin が Z:\foo へとアクセスしたものの、 Z ドライブが現在のマウントテーブル中に存在しなかった場合、 Z:\/cygdrive/Z としてアクセス可能になります。 mount ユーティリティの「--change-cygdrive-prefix」 フラグを使えば、デフォルトの自動マウント用プレフィックスを変更することが出来ます。 以下の例では、自動マウント用のプレフィックスを / に変更しています。

この方法にで新しいプレフィックスを設定する際、-s フラグを指定すれば、新しいプレフィックスをシステム全体のデフォルトプレフィックスとすることが出来るということを覚えておいて下さい。 デフォルトでは、cygdrive プレフィックスはシステム全体の設定のみに適用されます。 ユーザ及びシステムの cygdrive プレフィックスは -p オプションで常に参照することが出来ます。 --change-cygdrive-prefix と共に -b フラグを使用すれば、 全ての新しい自動マウントされたファイルシステムのデフォルトをバイナリモードでのファイルアクセスとすることが出来ます。

制限: マウントポイントは最大 30 までに制限されており、 これはハードコーディングされています。 また、仮に「/」から始まらないパス名をマウントすることが出来たとしても、 そのようなマウントポイントを使用する方法はありません。

通常、標準的な UNIX がそうであるように、Cygwin の POSIX マウントポイントは既存の空のディレクトリとなります。 この場合、又はマウントポイントのプレースホルダ (ファイル、どこかへのシンボリックリンク、 または空でないディレクトリ)が存在する場合、 予想される動作が示されます。 現在マウントポイントとなっているファイルのマウント前の姿は、 Cygwin プログラムからは見えなくなります。

例えば、ディスクを指し示す abc といった名前がルートディレクトリに散乱するのを防ぎたいような場合、 時には存在しないディレクトリへのマウントが望ましいことがあります。 たとえ mount が警告を表示したとしても、 明示的にマウントポイントを参照した場合は全てがほぼ正確に動作します。 しかしながら、幾つかの奇妙な結果が発生するかもしれません。 例えば、現在の作業ディレクトリが /dir であり、しかも /dir/mtpt がマウントポイントである場合、mtptlsecho * コマンドでは表示されず、 find .mtpt を探し出せません。

Usage: passwd [OPTION] [USER]
Change USER's password or password attributes.

User operations:
  -l, --lock               lock USER's account.
  -u, --unlock             unlock USER's account.
  -c, --cannot-change      USER can't change password.
  -C, --can-change         USER can change password.
  -e, --never-expires      USER's password never expires.
  -E, --expires            USER's password expires according to system's
                           password aging rule.
  -p, --pwd-not-required   no password required for USER.
  -P, --pwd-required       password is required for USER.

System operations:
  -i, --inactive NUM       set NUM of days before inactive accounts are disabled
                           (inactive accounts are those with expired passwords).
  -n, --minage DAYS        set system minimum password age to DAYS days.
  -x, --maxage DAYS        set system maximum password age to DAYS days.
  -L, --length LEN         set system minimum password length to LEN.

Other options:
  -S, --status             display password status for USER (locked, expired,
                           etc.) plus global system password settings.
  -h, --help               output usage information and exit.
  -v, --version            output version information and exit.

If no option is given, change USER's password.  If no user name is given,
operate on current user.  System operations must not be mixed with user
operations.  Don't specify a USER when triggering a system operation. 

passwd はユーザアカウントのパスワードを変更します。 通常のユーザは自分自身のアカウントのパスワードだけを変更できますが、 Administrators グループに所属するユーザはどのアカウントのパスワードも変更できます。 passwd はまた、 パスワードの有効期限やパスワード変更間隔といった、 アカウントの情報を変更することが出来ます。

パスワードを変更する際、パスワードが既に定義されていれば、ユーザは最初に旧来のパスワードを入力するように促されます。 入力されたパスワードは暗号化され、保存されているパスワードと比較されます。 ユーザには正しいパスワードを入力するチャンスは一回しかありません。 パスワードを忘れてしまった場合でもパスワードを変更出来るようにするため、Administrators グループに所属するユーザはこのステップを省略することが出来ます。

続いてユーザは変更するパスワードの入力を促されます。 passwd は再度入力を促し、最初の入力と 2 回目の入力が合致しているかどうかを確認します。 パスワードを変更するためには、両方の入力が同じものである必要があります。

パスワードが入力された後、今回のパスワード変更が許可されているかどうかを確認するために、 パスワードの有効期限情報がチェックされます。もしチェックが通らなければ、passwd はパスワードの変更を拒否して終了します。

現在のパスワードの状態に関する情報を得るには、-S オプションを利用します。 Administrators は passwd を利用して、様々なアカウントの管理を行うことが可能です (ユーザは自分自身のアカウントに対しては、幾つかの管理を行うことが出来ます)。 -l フラグと共に実行すればアカウントのロックを、 -u フラグと共に実行すればアカウントのロックの解除を行うことが出来ます。 同様に、-c はユーザによるパスワードの変更を不可能にし、 -C はユーザによるパスワードの変更を可能にします。 パスワードの期限については、-e によってパスワードの期限を無制限にし、-E はシステムの通常の期限設定ルールに従ってパスワードの期限付けを行います。 -p はユーザに対してパスワードの設定を要求せず、 -P はユーザに対してパスワードの設定を要求します。

Administrators グループに所属するユーザは -i-n-x 及び -L オプションを利用することによって、システム全体のパスワードの有効期間と有効な長さも変更することが出来ます。 -i オプションはパスワードの有効期間満了後、 アカウントを無効とするための日数を指定するために利用します。 パスワードの有効期限が切れてから NUM 日が経過すると、それ以降、ユーザはもはやそのアカウントを利用してログオンすることは出来ません。 -n オプションは、パスワードの変更禁止期間を日数で設定するために使われます。 ユーザは MINDAYS 日数が経過するまで、パスワードを変更することは出来ません。 -x オプションは、パスワードの有効期限の最大日数を設定するために使われます。 MAXDAYS日数の後、パスワードは変更されなければなりません。 上記のオプションで利用可能な値の範囲は、0 から 999 までです。 -L オプションは、Administrators グループに属さないユーザに許されるパスワードの最小の長さを LEN 分の文字数で指定します。 最小のパスワード長として認められるのは 0 から 14 文字までです。 この場合、0 という値は「制限なし」を意味します。

制限: 幾つかのシステムでは、ユーザは自分のパスワードを変更することが出来ません。

Usage: ps [-aefls] [-u UID]
Report process status

 -a, --all       show processes of all users
 -e, --everyone  show processes of all users
 -f, --full      show process uids, ppids
 -h, --help      output usage information and exit
 -l, --long      show process uids, ppids, pgids, winpids
 -s, --summary   show process summary
 -u, --user      list processes owned by UID
 -v, --version   output version information and exit
 -W, --windows   show windows as well as cygwin processes
With no options, ps outputs the long format by default

ps プログラムは、システム内で動作している全ての Cygwin プロセスの情報を返します(ps とは「process status」を意味します)。 Windows 環境下における POSIX 環境のシミュレートによる制限のため、限られた情報しか出力されません。

PID 列は kill に与えるために必要なプロセス ID です。 PPID は親プロセス ID であり、PGID はプロセスグループ ID です。 WINPID 列は NT のタスクマネージャに表示されるプロセス ID です。 TTY 列はプロセスがどの仮想端末上で動作しているかを示すものであり、'?' はサービスであることを表しています。UID 列には各プロセスのオーナーが示されます。 STIME はプロセスが起動した時刻であり、COMMAND は実行しているプログラムを示しています。 0 番目のカラムには、ステータスフラグもまた表示されます。 S は停止中或いはサスペンド中(言い換えるならバックグラウンド)であることを、I は入力待ち中或いは対話処理待ち中(フォアグラウンド)であることを、O は出力待ち中であることを示しています。

デフォルトでは、ps は現在のユーザが所有しているプロセスのみを表示します。 -a-e のどちらかのオプションを使えば、全てのプロセス(システムプロセスも含む)が表示されます。 二つのオプションが同じ機能を持っているのは、UNIX の歴史的な理由によるものです。 -f は「完全(full)な」リスト表示を行うオプションであり、UID に対するユーザ名も表示されます。-l オプションはデフォルトの表示モードであり、上記の列について「長い(long)」リスト表示を行います。 他の表示オプションとしては -s があり、PID、TTY、STIME そして COMMAND だけを短く表示します。-u オプションは、指定されたユーザが所有しているプロセスだけを表示するためのものです。 -W オプションは、 Cygwin のプロセスと共に Cygwin プロセス以外の Windows プロセスをも ps に表示させるものです。 WINPID もまた PID であり、Windows プロセスは kill コマンドに -f オプションを付けることによって殺すことが出来ます。

Usage: regtool.exe [OPTION] (add | check | get | list | remove | unset) KEY
View or edit the Win32 registry

Actions:
 add KEY\SUBKEY             add new SUBKEY
 check KEY                  exit 0 if KEY exists, 1 if not
 get KEY\VALUE              prints VALUE to stdout
 list KEY                   list SUBKEYs and VALUEs
 remove KEY                 remove KEY
 set KEY\VALUE [data ...]   set VALUE
 unset KEY\VALUE            removes VALUE from KEY

Options for 'list' Action:
 -k, --keys           print only KEYs
 -l, --list           print only VALUEs
 -p, --postfix        like ls -p, appends '\' postfix to KEY names

Options for 'set' Action:
 -e, --expand-string  set type to REG_EXPAND_SZ
 -i, --integer        set type to REG_DWORD
 -m, --multi-string   set type to REG_MULTI_SZ
 -s, --string         set type to REG_SZ

Options for 'set' and 'unset' Actions:
 -K<c>, --key-separator[=]<c>  set key separator to <c> instead of '\'

Other Options:
 -h, --help     output usage information and exit
 -q, --quiet    no error output, just nonzero return if KEY/VALUE missing
 -v, --verbose  verbose output, including VALUE contents when applicable
 -V, --version  output version information and exit

KEY is in the format [host]\prefix\KEY\KEY\VALUE, where host is optional
remote host in either \\hostname or hostname: format and prefix is any of:
  root     HKCR  HKEY_CLASSES_ROOT (local only)
  config   HKCC  HKEY_CURRENT_CONFIG (local only)
  user     HKCU  HKEY_CURRENT_USER (local only)
  machine  HKLM  HKEY_LOCAL_MACHINE
  users    HKU   HKEY_USERS

You can use forward slash ('/') as a separator instead of backslash, in
that case backslash is treated as escape character
Example: regtool.exe get '\user\software\Microsoft\Clock\iFormat'

regtool プログラムを使えば、シェルスクリプトから Windows レジストリのアクセスと修正が可能になります。 Windows レジストリの修正は危険であり、不注意からシステムが使用不能になることがあります。 注意して下さい。

-v オプションは「冗長(verbose)」を意味します。 多くのコマンドでは、 これは追加の、又は長ったらしいメッセージを出力するためのものです。 逆に、-q オプションはエラーメッセージを抑制します。 キーが存在したか否かを調べるには、(例えば)プログラムの終了ステータスを使用します。

regtool には、以下に示すようなオプションを アクション として指定する必要があります。 現在のところ、アクションとなるのは addsetcheckgetlistremoveset 及び unset です。

デフォルトでは、最後の「\」又は「/」はキーと値の区切り文字として認識されます。 -K オプションを利用することによって、キーと値の区切り文字として別の文字を利用することが可能になります。

add アクションは新しいキーを追加します。 check アクションはキーが存在するかどうかを確認します (プログラムの終了コードが 0 なら存在し、非 0 ならは存在しません)。 get アクションはキーの値の値を取得し、標準出力にその値を出力します(あるいは何も出力しません)。 なお、値が存在しない場合はエラーメッセージが表示され、プログラムは非 0 の終了コードを返します。 -q が指定された場合、プログラムはメッセージを表示しませんが非 0 の終了コードを返します。

list アクションは、与えられたキーが持つサブキーと値を出力します。 list-k オプションを指定すれば、regtool はキーだけを表示します。また、-l を指定した場合は値だけが表示されます。-p は個々のキーの最後に後置詞として '/' を付けますが、値には何も付けません。 remove アクションはキーを削除します。 キーを削除する前にはキー中にある全てを削除する必要がありますが、そのことが必要以上に削除してしまうことを偶然にも止める手段になるということは期待しないで下さい。

set アクションはキー中に値を設定します。 -e は値が展開可能な文字列(REG_EXPAND_SZ)であり、埋め込みの環境変数が含まれていることを示します。 -i は値が整数(REG_DWORD) であることを示します。 -m は値が複数行文字列(REG_MULTI_SZ)であることを意味します。 -s は値が文字列(REG_SZ)であることを示します。 もしこのいずれをも指定しなかった場合、regtool は与えられた値を元に型を推測します。 もし数値に見えるのであれば、それは DWORD 値です。 もしパーセントで始まる値であれば、それは展開可能な文字列値です。 複数の値を与えたのであれば、それは複数行文字列値です。 そうでなければ、それは通常の文字列値です。 unset コマンドはキーから値を削除します。

Usage: setfacl [-r] (-f ACL_FILE | -s acl_entries) FILE...
       setfacl [-r] ([-d acl_entries] [-m acl_entries]) FILE...
Modify file and directory access control lists (ACLs)

  -d, --delete     delete one or more specified ACL entries
  -f, --file       set ACL entries for FILE to ACL entries read
                   from a ACL_FILE
  -m, --modify     modify one or more specified ACL entries
  -r, --replace    replace mask entry with maximum permissions
                   needed for the file group class
  -s, --substitute substitute specified ACL entries for the
                   ACL of FILE
  -h, --help       output usage information and exit
  -v, --version    output version information and exit

At least one of (-d, -f, -m, -s) must be specified

パラメータとして与えられた個々のファイルについて、setfacl はそれらのファイルの完全な ACL を置き換える(-s-f)か、ACL エントリの追加、修正又は削除を行います。 Cygwin と Windows ACL に関する更なる情報については、Cygwin ユーザーズガイドの 項2.3. 「NT セキュリティと ntsec の使用方法」 を参照して下さい。

acl_entries は、以下のリストに示されたような一つ又はそれ以上のカンマ区切りの ACL エントリ群です。

         u[ser]::perm
         u[ser]:uid:perm
         g[roup]::perm
         g[roup]:gid:perm
         m[ask]::perm
         o[ther]::perm

デフォルトのエントリは上記に加えて、追加の default 識別子を持っています。例えば、次のようになります。

         d[efault]:u[ser]:uid:perm

perm はそれぞれ「rwx」形式に従う 3 文字のパーミッション文字列であり、パーミッションが無い場合は 「-」文字を利用します。 また、0 (「---」と同じ) から 7 (「rwx」と同じ)までの 8 進数表現を利用してパーミッションを表すことも出来ます。 uid はユーザ名か数値表現の UID であり、gid はグループ名か数値表現の GID です。

以下のオプションがサポートされています。

-d 一つ又はそれ以上の指定されたエントリをファイルの ACL から削除します。 所有者、グループそしてその他エントリを削除してはいけません。 削除される acl_entries はパーミッションなしで指定します。 例えば、次に示すリストのようになります。

         u[ser]:uid
         g[roup]:gid
         d[efault]:u[ser]:uid
         d[efault]:g[roup]:gid
         d[efault]:m[ask]:
         d[efault]:o[ther]:

-f ACL_FILE から acl_entries を一行ずつ読み込みます。 空白文字は無視され、文字「#」はコメントの開始として扱われます。 は標準入力から読み込ませるには、特殊ファイル名「-」を利用します。 あるファイルから別のファイルへと ACL をコピーする場合は、getfaclsetfacl を利用することが出来ます。

$ getfacl source_file | setfacl -f - target_file

ファイルの所有者として一つのユーザエントリ、ファイルのグループとして一つのグループエントリ、そしてその他エントリが必要となります。

追加のユーザ及びグループエントリとして、ファイルのファイルグループクラスに対するマスクエントリ及び、同じ UID / GID を持った重複しないユーザ又はグループエントリを指定することが出来ます。

もし対象がディレクトリであれば、ファイルの所有者として一つのデフォルトのユーザエントリ、ファイルのグループとして一つのデフォルトのグループエントリ、ファイルグループクラスとして一つのデフォルトのマスクエントリ、そして一つのその他エントリが必要となります。

-m 一つ又はそれ以上の指定した ACL エントリを追加又は削除します。 acl_entries は既に示したような、カンマ区切りのエントリのリストとなります。

-r マスク入力として指定されたパーミッションを無視し、ファイルグループクラスに必要となる最大のパーミッションで置き換えます。

-s -f と似ていますが、カンマ区切りのリストとしてコマンドラインから指定された acl_entries でファイルの ACL を置き換えます。

-d 及び -m オプションは同じコマンド内で利用できますが、-f-s オプションは排他的にしか利用出来ません。

ディレクトリはデフォルトの ACL エントリを保持しています。 デフォルトの ACL エントリを含んだディレクトリ内に作成されたファイルのパーミッションは、 現在の umask 値、明示的に指定されたパーミッション要求そしてデフォルトの ACL エントリを結合して決定されます。

制限: Cygwin 環境下では、デフォルトの ACL エントリは現在のアカウントからは取得されません。

Usage: ssp [options] low_pc high_pc command...
Single-step profile COMMAND

 -c, --console-trace  trace every EIP value to the console. *Lots* slower.
 -d, --disable        disable single-stepping by default; use
                      OutputDebugString ("ssp on") to enable stepping
 -e, --enable         enable single-stepping by default; use
                      OutputDebugString ("ssp off") to disable stepping
 -h, --help           output usage information and exit
 -l, --dll            enable dll profiling.  A chart of relative DLL usage
                      is produced after the run.
 -s, --sub-threads    trace sub-threads too.  Dangerous if you have
                      race conditions.
 -t, --trace-eip      trace every EIP value to a file TRACE.SSP.  This
                      gets big *fast*.
 -v, --verbose        output verbose messages about debug events.
 -V, --version        output version information and exit

Example: ssp 0x401000 0x403000 hello.exe

SSP - シングルステッププロファイラ

オリジナルの作者: DJ Delorie

SSP は Win32 デバッグ API を利用してプログラムを実行するためのプログラムです。 SSP は個々の命令が利用された場所、命令が使用した時間、そして全ての関数呼び出しを記録します。 SSP の実行結果はプロファイル用プログラム gprof が取り扱える形式として保存されますが、gprof は値が秒であり、それらは本当は命令数だと主張するでしょう。

SSP は元々 Cygwin DLL をプロファイルするために設計されたので、統計レポートを報告するコードブロックを自動的に選択することは出来ません。 メモリアドレスの範囲を手で把握し、それを指定する必要があります、その作業は難しくはありません。 ターゲットの「.text」セクションの範囲を決定するには、「objdump」プログラムを利用します。 我々が行う cygwin1.dll のプロファイリング方法を説明しましょう。 デバッグシンボルが含まれるようにビルドを行い(そうでないと、gprof を実行することが出来ません)、そして objdump を次のように実行します。

$ objdump -h cygwin1.dll

次のようなレポートが出力されるでしょう。

cygwin1.dll:     file format pei-i386

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         0007ea00  61001000  61001000  00000400  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE, DATA
  1 .data         00008000  61080000  61080000  0007ee00  2**2
                  CONTENTS, ALLOC, LOAD, DATA
  . . .

必要となる情報は .text セクションの VMA と、それに続くセクションの VMA だけです(通常、セクションは連続しています。 最終アドレスを知るためには、VMA に Size を加えても構いません)。 この場合、VMA は 0x61001000 であり、最終アドレスは 0x61080000(.data の開始アドレスから求める方法)又は 0x0x6107fa00(VMA に Size を加えて求める方法)のどちらかとなります。

SSP の基本的な使い方は二つです。 プログラム全体をプロファイリングするか、プログラム中の特定の場所をプロファイリングするかです。

プログラム全体をプロファイリングするのであれば、オプションなしでただ単に ssp を実行します。 デフォルトでは、SSP はプログラム全体をステップ実行します。 単純な例として、上記の数値を使ってみます。

$ ssp 0x61001000 0x61080000 hello.exe

これによってプログラム全体がステップ実行されます。 Pentium II / 300MHz のマシンでは最低でも 8 分が必要になります(ええ、本当ですとも)。 処理が完了すると、SSP は「gmon.out」というファイルを作成します。 gprof を利用すれば、このデータを人間にも読める形式のレポートへと変換することが出来ます。

$ gprof -b cygwin1.dll

「-b」は「ヘルプページをスキップする」ことを意味しています。 gprof が出力するレポート形式をよく知っているなら、ヘルプページを省略することが出来ます。 gprof のドキュメントにはこのレポートに関する様々な説明がありますが、ssp は幾つかを変更しています。 例えば、レポートの最初の部分は次のように、各関数が使用した時間の総量を報告しています。

Each sample counts as 0.01 seconds.
  %   cumulative   self              self     total
 time   seconds   seconds    calls  ms/call  ms/call  name
 10.02    231.22    72.43       46  1574.57  1574.57  strcspn
  7.95    288.70    57.48      130   442.15   442.15  strncasematch

「seconds」列は実際には CPU opcode であり、opcode ごとに 1/100 秒となります。 即ち、上記例の「231.22」は 23,122 opcode を示しています。 ms/call 値は 10 倍の大きさとなっており、1574.57 は呼び出し毎に 157.457 であることを意味しています。 レポートの second 部分にある「self」及び「children」についても、同様の補正が必要になります。

OK、そして今や長い時間をかけて生成されたレポートを手に入れることが、そして最適化すべきスポットを識別することが出来ました。 time() 関数を使ってみましょう。 プログラム内から SSP をコントロールするための OutputDebugString() を利用することによって、この関数に対する選択的なプロファイルを行うために SSP を利用することが出来ます。 サンプルプログラムを挙げましょう。

#include <windows.h>
main()
{
    time_t t;
    OutputDebugString("ssp on");
    time(&t);
    OutputDebugString("ssp off");
}

そして、SSP に -d オプションを与えることにより、プロファイリングの初期値を *無効* とします。プログラムは最初の OutputDebugString() までは最高速度で動作し、それから少しの間だけステップ実行します。 それから、(いつも通り)gprofを利用することによって、プログラムの実行の一部分だけのパフォーマンスプロファイルが参照出来ます。

SSP には沢山のオプションがあります。ステッププロファイリングはプログラムの実行速度を通常よりも 1,000 倍も遅くしてしまうので、プログラム中でシングルステップ実行が必要な部分を絞るためにも、全てのオプションを理解することが望ましいと言えます。

-v - 冗長(verbose)。 このオプションはスレッドの開始と停止、OutputDebugString() の呼び出し、DLL のロードなどに関するメッセージを出力します。

-t 及び -c - 追跡(tracing)。 -t を利用すると、*全ての* ステップのアドレスがファイル「trace.ssp」に書き出されます。 複数のスレッドを追跡することが可能になるので、これはデバッグ関数の補助として使われます。 必要であれば、巧妙なスクリプトを利用してアドレスをディスアセンブルされた opcode とマッチさせることが出来るでしょう。 警告: 非常に急速に、*巨大な* ファイルが作成されます。 -c は各アドレスをコンソールに書き出すので、アセンブラのキーの塊に対しては有効です。 addr2line -C -f -s -e foo.exe < trace.ssp > lines.ssp を実行し、それから perl cvttrace を実行すれば、シンボリックトレースへと変換出来ます。

-s - サブスレッド(subthreads)。 通常、トレースが必要になるのはメインスレッドだけですが、 全てのスレッドをトレースする必要がある場合は、このオプションを利用します。 サブスレッドを呼び出すだけの関数をプロファイルしたいときも、このオプションが必要になるでしょう。 しかし、OutputDebugString() を利用すると、呼び出されたメインスレッドではないスレッドは自動的にプロファイリングが有効になります。

-l - DLL のプロファイリング。 プログラムが使用した各 DLL でどの程度の時間が使用されたかを示す、簡単な表を生成します。 仮に大部分の時間が DLL 内部で使用されていたとしたら、プログラム中の関数を最適化するなどということは考えられないでしょう。 私は普段、-v-s-l オプションを使用しています。

$ ssp -v -s -l -d 0x61001000 0x61080000 hello.exe

Usage: strace.exe [OPTIONS] <command-line>
Usage: strace.exe [OPTIONS] -p <pid>
Trace system calls and signals

  -b, --buffer-size=SIZE       set size of output file buffer
  -d, --no-delta               don't display the delta-t microsecond timestamp
  -f, --trace-children         trace child processes (toggle - default true)
  -h, --help                   output usage information and exit
  -m, --mask=MASK              set message filter mask
  -n, --crack-error-numbers    output descriptive text instead of error
                               numbers for Windows errors
  -o, --output=FILENAME        set output file to FILENAME
  -p, --pid=n                  attach to executing program with cygwin pid n
  -S, --flush-period=PERIOD    flush buffered strace output every PERIOD secs
  -t, --timestamp              use an absolute hh:mm:ss timestamp insted of 
                               the default microsecond timestamp.  Implies -d
  -T, --toggle                 toggle tracing in a process already being
                               traced. Requires -p <pid>
  -v, --version                output version information and exit
  -w, --new-window             spawn program under test in a new window

    MASK can be any combination of the following mnemonics and/or hex values
    (0x is optional).  Combine masks with '+' or ',' like so:

                      --mask=wm+system,malloc+0x00800

    Mnemonic Hex     Corresponding Def  Description
    =========================================================================
    all      0x00001 (_STRACE_ALL)      All strace messages.
    flush    0x00002 (_STRACE_FLUSH)    Flush output buffer after each message.
    inherit  0x00004 (_STRACE_INHERIT)  Children inherit mask from parent.
    uhoh     0x00008 (_STRACE_UHOH)     Unusual or weird phenomenon.
    syscall  0x00010 (_STRACE_SYSCALL)  System calls.
    startup  0x00020 (_STRACE_STARTUP)  argc/envp printout at startup.
    debug    0x00040 (_STRACE_DEBUG)    Info to help debugging. 
    paranoid 0x00080 (_STRACE_PARANOID) Paranoid info.
    termios  0x00100 (_STRACE_TERMIOS)  Info for debugging termios stuff.
    select   0x00200 (_STRACE_SELECT)   Info on ugly select internals.
    wm       0x00400 (_STRACE_WM)       Trace Windows msgs (enable _strace_wm).
    sigp     0x00800 (_STRACE_SIGP)     Trace signal and process handling.
    minimal  0x01000 (_STRACE_MINIMAL)  Very minimal strace output.
    exitdump 0x04000 (_STRACE_EXITDUMP) Dump strace cache on exit.
    system   0x08000 (_STRACE_SYSTEM)   Serious error; goes to console and log.
    nomutex  0x10000 (_STRACE_NOMUTEX)  Don't use mutex for synchronization.
    malloc   0x20000 (_STRACE_MALLOC)   Trace malloc calls.
    thread   0x40000 (_STRACE_THREAD)   Thread-locking calls.

strace プログラムはプログラム、及び場合によってはそのプログラムの子プログラムも実行し、そして全ての Cygwin DLL の出力をプログラムから標準出力或いは -o オプションで指定されたファイルへと書き出します。 strace のセッションは、次のようにすれば新しいウィンドウで開始することが出来ます。

$ strace -o tracing_output -w sh -c 'while true; do echo "tracing..."; done' &

これは特に、長い時間がかかる strace セッションに有効です。

strace はスタンドアロンの Windows プログラムであり、Cygwin DLL それ自体には依存していません(このことは、cygcheck を利用して確かめることが出来ます)。そのため、strace は POSIX パス名やシンボリックリンクを解釈しません。 このプログラムは主に、Cygwin DLL それ自身のデバッグに役立ちます。