github.com/shogo82148/std@v1.22.1-0.20240327122250-4e474527810c/runtime/extern.go (about)

     1  // Copyright 2009 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  /*
     6  パッケージruntimeは、Goのランタイムシステムと対話する操作を含んでいます。
     7  これには、ゴルーチンを制御するための関数などが含まれます。また、低レベルの型情報も含まれており、
     8  これはreflectパッケージによって使用されます。ランタイム型システムへのプログラム可能な
     9  インターフェースについては、[reflect] のドキュメンテーションを参照してください。
    10  
    11  # 環境変数
    12  
    13  以下の環境変数(ホストオペレーティングシステムによっては$nameまたは%name%)は、Goプログラムのランタイム動作を制御します。意味や使用法はリリースごとに変更される可能性があります。
    14  
    15  GOGC変数は、初期のガベージコレクションのターゲットパーセンテージを設定します。
    16  前回のコレクション後に残されたライブデータに対する新しく割り当てられたデータの比率がこのパーセンテージに達すると、コレクションがトリガーされます。
    17  デフォルトはGOGC=100です。GOGC=offに設定すると、ガベージコレクタが完全に無効になります。
    18  [runtime/debug.SetGCPercent] を使用すると、このパーセンテージを実行時に変更できます。
    19  
    20  GOMEMLIMIT変数は、ランタイムのソフトメモリ制限を設定します。
    21  このメモリ制限には、Goヒープとランタイムによって管理されるすべてのその他のメモリが含まれますが、
    22  バイナリ自体のマッピング、他の言語で管理されるメモリ、およびGoプログラムの代わりにオペレーティングシステムに保持されるメモリなど、外部メモリソースは除外されます。
    23  GOMEMLIMITは、オプションの単位接尾辞を持つバイト単位の数値です。
    24  サポートされる接尾辞には、B、KiB、MiB、GiB、およびTiBが含まれます。
    25  これらの接尾辞は、IEC 80000-13標準で定義されるバイトの量を表します。
    26  つまり、2の累乗に基づいています:KiBは2^10バイトを意味し、MiBは2^20バイトを意味します。
    27  デフォルト設定は [math.MaxInt64] であり、これによりメモリ制限が無効になります。
    28  [runtime/debug.SetMemoryLimit] を使用すると、この制限を実行時に変更できます。
    29  
    30  GODEBUG変数は、ランタイム内のデバッグ変数を制御します。
    31  これは、これらの名前付き変数を設定するname=valペアのカンマ区切りリストです。
    32  
    33  	allocfreetrace: allocfreetrace=1を設定すると、すべての割り当てがプロファイルされ、各オブジェクトの割り当てと解放時にスタックトレースが出力されます。
    34  
    35  	clobberfree: clobberfree=1を設定すると、ガベージコレクタがオブジェクトを解放するときに、オブジェクトのメモリ内容を悪い内容で上書きします。
    36  
    37  	cpu.*: cpu.all=offは、すべてのオプションの命令セット拡張機能の使用を無効にします。
    38  	cpu.extension=offは、指定された命令セット拡張機能からの命令の使用を無効にします。
    39  	拡張機能は、内部/cpuパッケージにリストされているsse41やavxなどの命令セット拡張機能の小文字の名前です。
    40  	例えば、cpu.avx=offは、AVX命令のランタイム検出とそれによる使用を無効にします。
    41  
    42  	cgocheck: cgocheck=0を設定すると、cgoを使用してGoポインタを非Goコードに誤って渡すパッケージのすべてのチェックが無効になります。
    43  	cgocheck=1(デフォルト)を設定すると、比較的安価なチェックが有効になりますが、一部のエラーを見逃す可能性があります。
    44  	より完全で遅いcgocheckモードは、GOEXPERIMENTを使用して有効にできます(再ビルドが必要です)。
    45  	詳細については、https://pkg.go.dev/internal/goexperiment を参照してください。
    46  
    47  	disablethp: Linuxでdisablethp=1を設定すると、ヒープの透過的な巨大ページが無効になります。
    48  	それは他のプラットフォームには影響しません。disablethpは、Goの1.21以前のバージョンとの互換性を保つためのものです。
    49  	これらのバージョンは、大幅なメモリの過剰使用を引き起こす可能性のあるLinuxカーネルのデフォルトを回避するのをやめました。
    50  	詳細は https://go.dev/issue/64332 を参照してください。この設定は将来のリリースで削除される予定なので、
    51  	その時までに運用者はLinuxの設定を自分のニーズに合わせて調整する必要があります。
    52  	詳細は https://go.dev/doc/gc-guide#Linux_transparent_huge_pages を参照してください。
    53  
    54  	dontfreezetheworld: デフォルトでは、致命的なパニックまたはスローの開始は
    55  	"世界を凍結"し、すべてのスレッドを事前に停止させてすべての実行中の
    56  	ゴルーチンを停止させます。これにより、すべてのゴルーチンのトレースバックが可能になり、
    57  	その状態はパニックの地点に近く保たれます。dontfreezetheworld=1を設定すると、
    58  	この事前停止が無効になり、パニック処理中にゴルーチンが実行を続けることができます。
    59  	自然にスケジューラに入るゴルーチンは依然として停止することに注意してください。これは、
    60  	freezetheworldがスケジューラの状態を混乱させ、したがって問題を隠す可能性があるため、
    61  	ランタイムスケジューラのデバッグ時に役立つことがあります。
    62  
    63  	efence: efence=1を設定すると、アロケータがユニークなページ上に各オブジェクトを割り当て、アドレスを再利用しないモードで実行されるようになります。
    64  
    65  	gccheckmark: gccheckmark=1を設定すると、世界が停止している間に2回目のマークパスを実行して、ガベージコレクタの並列マークフェーズの検証を有効にします。
    66  	2回目のパスで並列マークで見つからなかった到達可能なオブジェクトが見つかった場合、ガベージコレクタはパニックを引き起こします。
    67  
    68  	go gcpacertrace: gcpacertrace=1を設定すると、ガベージコレクタが並列ペーサーの内部状態に関する情報を出力します。
    69  
    70  	gcshrinkstackoff: gcshrinkstackoff=1を設定すると、ゴルーチンをより小さなスタックに移動しないようにできます。
    71  	このモードでは、ゴルーチンのスタックは成長するだけで、縮小されません。
    72  
    73  	gcstoptheworld: gcstoptheworld=1を設定すると、並列ガベージコレクションが無効になり、すべてのガベージコレクションがストップ・ザ・ワールドイベントになります。
    74  	gcstoptheworld=2を設定すると、ガベージコレクションが終了した後に並列スイープも無効になります。
    75  
    76  	gctrace: gctrace=1を設定すると、ガベージコレクタが各コレクションで標準エラーに1行の要約を出力し、
    77  	回収されたメモリ量と一時停止の長さをまとめます。この行の形式は変更される可能性があります。
    78  	以下に説明するのは、各フィールドの関連するruntime/metricsメトリックも含まれています。現在の形式は次のとおりです。
    79  		gc # @#s #%: #+#+# ms clock, #+#/#/#+# ms cpu, #->#-># MB, # MB goal, # MB stacks, #MB globals, # P
    80  	フィールドは次のようになります。
    81  		# GC番号
    82  		@#s          プログラム開始以来の秒数
    83  		#%           プログラム開始以来のGCに費やされた時間の割合
    84  		#+...+#      GCフェーズのウォールクロック/CPU時間
    85  		#->#-># MB   GC開始時、GC終了時、およびライブヒープのヒープサイズ、または/gc/scan/heap:bytes
    86  		# MB goal    ゴールヒープサイズ、または/gc/heap/goal:bytes
    87  		# MB stacks  スキャン可能なスタックサイズの推定値、または/gc/scan/stack:bytes
    88  		# MB globals スキャン可能なグローバルサイズ、または/gc/scan/globals:bytes
    89  		# P          使用されたプロセッサの数、または/sched/gomaxprocs:threads
    90  	フェーズは、ストップ・ザ・ワールド(STW)スイープ終了、並列マーク・スキャン、およびSTWマーク終了です。
    91  	マーク/スキャンのCPU時間は、アシスト時間(割り当てと同時に実行されるGC)、
    92  	バックグラウンドGC時間、およびアイドルGC時間に分割されます。行が「(forced)」で終わる場合、
    93  	このGCはruntime.GC()呼び出しによって強制されました。
    94  
    95  	harddecommit: harddecommit=1を設定すると、OSに返されるメモリに対しても保護が解除されるようになります。
    96  	これはWindowsでの唯一の動作モードですが、他のプラットフォームでのスキャベンジャー関連の問題のデバッグに役立ちます。
    97  	現在、Linuxのみでサポートされています。
    98  
    99  	inittrace: inittrace=1を設定すると、ランタイムが、実行時間とメモリ割り当てを要約した、
   100  	各パッケージのinit作業ごとに標準エラーに1行の情報を出力します。
   101  	プラグインの読み込み時に実行されるinitsと、ユーザー定義とコンパイラ生成のinit作業の両方を持たないパッケージについては、
   102  	情報は出力されません。この行の形式は変更される可能性があります。現在の形式は次のとおりです。
   103  		init # @#ms, # ms clock, # bytes, # allocs
   104  	フィールドは次のようになります。
   105  		init #      パッケージ名
   106  		@# ms       プログラム開始以来、initが開始されたときのミリ秒単位の時間
   107  		# clock     パッケージ初期化作業のウォールクロック時間
   108  		# bytes     ヒープに割り当てられたメモリ
   109  		# allocs    ヒープ割り当ての数
   110  
   111  	madvdontneed: madvdontneed=0を設定すると、Linuxではメモリをカーネルに返すときにMADV_DONTNEEDの代わりにMADV_FREEを使用します。
   112  	これはより効率的ですが、OSがメモリ圧力下にある場合にのみRSS数が減少することを意味します。
   113  	BSDおよびIllumos/Solarisでは、madvdontneed=1を設定すると、MADV_FREEの代わりにMADV_DONTNEEDを使用します。
   114  	これはより効率的ではありませんが、RSS数がより速く減少するようになります。
   115  
   116  	memprofilerate: memprofilerate=Xを設定すると、runtime.MemProfileRateの値が更新されます。
   117  	0に設定すると、メモリプロファイリングが無効になります。デフォルト値についてはMemProfileRateの説明を参照してください。
   118  
   119  	pagetrace: pagetrace=/path/to/fileを設定すると、ページイベントのトレースが書き出され、
   120  	x/debug/cmd/pagetraceツールを使用して表示、分析、および可視化できます。この機能を有効にするには、
   121  	プログラムをGOEXPERIMENT=pagetraceでビルドしてください。
   122  	この機能は、セットUIDバイナリの場合にセキュリティリスクを導入するため、
   123  	プログラムがセットUIDバイナリである場合はこの機能を有効にしないでください。
   124  	現在、Windows、plan9、js/wasmではサポートされていません。
   125  	一部のアプリケーションでこのオプションを設定すると、大きなトレースが生成される場合があるため、注意して使用してください。
   126  
   127  	panicnil: panicnil=1を設定すると、nilのインターフェース値または型指定されていないnilを引数にpanicを呼び出したときのランタイムエラーが無効になります。
   128  
   129  	runtimecontentionstacks: runtimecontentionstacks=1を設定すると、"mutex"プロファイルに
   130  	ランタイム内部のロックに関連するコールスタックが含まれるようになります。これは
   131  	MutexProfileFraction設定に従います。runtimecontentionstacks=0の場合、
   132  	ランタイム内部のロックに対する競合は"runtime._LostContendedRuntimeLock"として報告されます。
   133  	runtimecontentionstacks=1の場合、コールスタックはロックを解放したunlock呼び出しに対応します。
   134  	しかし、その値はそのコールスタックが引き起こした競合の量に対応するのではなく、
   135  	unlockの呼び出し元が元のlock呼び出しで待たなければならなかった時間に対応します。
   136  	これらを揃えてこの設定を削除することが期待される未来のリリースがあります。
   137  
   138  	runtimecontentionstacks: runtimecontentionstacks=1を設定すると、"mutex"プロファイルに
   139  	runtime内部のロックの競合に関連する呼び出しスタックが含まれるようになります。これは
   140  	MutexProfileFraction設定に従います。runtimecontentionstacks=0の場合、
   141  	runtime内部のロックの競合は "runtime._LostContendedRuntimeLock"として報告されます。
   142  	runtimecontentionstacks=1の場合、呼び出しスタックはロックを解放したunlock呼び出しに対応します。
   143  	しかし、その値はその呼び出しスタックが引き起こした競合の量に対応するのではなく、
   144  	unlockの呼び出し元が元のロック呼び出しで待たなければならなかった時間に対応します。
   145  	これらを揃えてこの設定を削除することが期待される未来のリリースがあります。
   146  
   147  	invalidptr: invalidptr=1(デフォルト)は、無効なポインタ値(例えば、1)がポインタ型の位置に見つかった場合、
   148  	ガベージコレクタとスタックコピーアがプログラムをクラッシュさせます。invalidptr=0を設定すると、このチェックが無効になります。
   149  	これはバグのあるコードを診断するための一時的な回避策としてのみ使用すべきです。
   150  	本当の修正は、整数をポインタ型の位置に格納しないことです。
   151  
   152  	sbrk: sbrk=1を設定すると、メモリアロケータとガベージコレクタが置き換えられ、オペレーティングシステムからメモリを取得し、メモリを回収しない単純なアロケータになります。
   153  
   154  	scavtrace: scavtrace=1を設定すると、ランタイムが、スキャベンジャーによって実行された作業量、
   155  	オペレーティングシステムに返された総メモリ量、および物理メモリ使用量の推定を要約した、標準エラーに1行の情報を出力します。
   156  	この行の形式は変更される可能性があります。現在の形式は次のとおりです。
   157  		scav # KiB work (bg), # KiB work (eager), # KiB total, #% util
   158  	extern.goファイルから、フィールドは次のようになります。
   159  		# KiB work (bg)    前回の行以降にバックグラウンドでOSに返されたメモリ量
   160  		# KiB work (eager) 前回の行以降にイーガーモードでOSに返されたメモリ量
   161  		# KiB now          現在OSに返されているアドレス空間の量
   162  		#% util            スキャベンジングされていないヒープメモリのうち、使用中の割合
   163  	もし行が"(forced)"で終わる場合、スキャベンジングはdebug.FreeOSMemory()呼び出しによって強制されました。
   164  
   165  	scheddetail: schedtrace=Xおよびscheddetail=1を設定すると、
   166  	スケジューラがXミリ秒ごとに詳細な複数行情報を出力し、スケジューラ、プロセッサ、スレッド、およびゴルーチンの状態を説明します。
   167  
   168  	schedtrace: schedtrace=Xを設定すると、スケジューラがXミリ秒ごとに、スケジューラの状態を要約した1行を標準エラーに出力します。
   169  
   170  	tracebackancestors: tracebackancestors=Nを設定すると、トレースバックに、ゴルーチンが作成されたスタックが追加されます。
   171  	Nは報告する祖先ゴルーチンの数を制限します。これにより、runtime.Stackが返す情報も拡張されます。
   172  	祖先のゴルーチンIDは、作成時のゴルーチンIDを参照します。このIDは、別のゴルーチンで再利用される可能性があります。Nを0に設定すると、祖先情報は報告されません。
   173  
   174  	tracefpunwindoff: tracefpunwindoff=1を設定すると、実行トレーサーがフレームポインタアンワインディングの代わりに
   175  	ランタイムのデフォルトスタックアンワインダーを使用するようになります。これにより、トレーサーのオーバーヘッドが増加しますが、
   176  	フレームポインタアンワインディングによって引き起こされる予期しないリグレッションのワークアラウンドやデバッグに役立つ場合があります。
   177  
   178  	traceadvanceperiod: トレース生成間のおおよその周期(ナノ秒単位)。GOEXPERIMENT=exectracer2でプログラムがビルドされている場合にのみ適用されます。
   179  	主に実行トレーサーのテストとデバッグに使用されます。
   180  
   181  	asyncpreemptoff: asyncpreemptoff=1は、信号ベースの非同期ゴルーチンの事前停止を無効にします。
   182  	これにより、一部のループが長期間にわたって非事前停止可能になり、GCとゴルーチンのスケジューリングが遅延する可能性があります。
   183  	これは、非同期に事前停止されたゴルーチン用の保守的なスタックスキャンも無効にするため、GCの問題をデバッグするのに役立ちます。
   184  
   185  [net] および [net/http] パッケージも、GODEBUGのデバッグ変数を参照しています。
   186  詳細については、それらのパッケージのドキュメントを参照してください。
   187  
   188  GOMAXPROCS変数は、ユーザーレベルのGoコードを同時に実行できるオペレーティングシステムスレッドの数を制限します。
   189  Goコードの代わりにシステムコールでブロックされているスレッドの数に制限はありません。
   190  これらはGOMAXPROCSの制限には含まれません。このパッケージの [GOMAXPROCS] 関数は、制限をクエリおよび変更します。
   191  
   192  GORACE変数は、-raceを使用してビルドされたプログラムのレースディテクタを設定します。
   193  詳細については、[Race Detector article] を参照してください。
   194  
   195  GOTRACEBACK変数は、Goプログラムが回復不能なパニックまたは予期しないランタイム条件によって失敗した場合に生成される出力量を制御します。
   196  デフォルトでは、失敗は現在のゴルーチンのスタックトレースを出力し、ランタイムシステム内部の関数を省略して、終了コード2で終了します。
   197  現在のゴルーチンが存在しない場合や、失敗がランタイム内部で発生した場合は、すべてのゴルーチンのスタックトレースが出力されます。
   198  GOTRACEBACK=noneは、ゴルーチンのスタックトレースを完全に省略します。
   199  GOTRACEBACK=single(デフォルト)は、上記の説明のように動作します。
   200  GOTRACEBACK=allは、すべてのユーザー作成ゴルーチンのスタックトレースを追加します。
   201  GOTRACEBACK=systemは、「all」と同様ですが、ランタイム関数のスタックフレームを追加します。
   202  extern.goファイルから、フィールドは次のようになります。
   203  ランタイムによって内部的に作成されたゴルーチンを表示します。
   204  GOTRACEBACK=crashは、「system」と同様ですが、OS固有の方法でクラッシュします。たとえば、Unixシステムでは、クラッシュはSIGABRTを発生させてコアダンプをトリガーします。
   205  GOTRACEBACK=werは、「crash」と同様ですが、Windows Error Reporting(WER)を無効にしません。
   206  歴史的な理由から、GOTRACEBACK設定0、1、および2は、それぞれnone、all、およびsystemの同義語です。
   207  runtime/debugパッケージのSetTraceback関数を使用すると、実行時に出力量を増やすことができますが、環境変数で指定された量を下回ることはできません。
   208  [runtime/debug.SetTraceback] 関数を参照してください。
   209  
   210  GOARCH、GOOS、GOPATH、およびGOROOT環境変数は、Goプログラムのビルドに影響を与えます
   211  ([cmd/go] および [go/build] を参照)。
   212  GOARCH、GOOS、およびGOROOTは、コンパイル時に記録され、このパッケージの定数または関数によって利用可能になりますが、
   213  ランタイムシステムの実行には影響しません。
   214  
   215  # セキュリティ
   216  
   217  Unixプラットフォームでは、危険な動作を防止するために、バイナリがsetuid/setgidに設定されているか、
   218  setuid/setgidのようなプロパティで実行されている場合、Goのランタイムシステムはわずかに異なる動作をします。
   219  Linuxでは、補助ベクトルでAT_SECUREフラグをチェックし、BSDおよびSolaris/Illumosではissetugidシスコールをチェックし、
   220  AIXではuid/gidが有効なuid/gidと一致するかどうかをチェックします。
   221  
   222  ランタイムがバイナリがsetuid/setgidのようであると判断した場合、次の3つの主な処理が行われます。
   223    - 標準入出力ファイルディスクリプタ(0、1、2)が開いているかどうかを確認します。いずれかが閉じられている場合、/dev/nullを指すように開きます。
   224    - GOTRACEBACK環境変数の値を'none'に設定します。
   225    - プログラムを終了するシグナルが受信された場合、またはGOTRACEBACKの値を上書きする回復不能なパニックが発生した場合、ゴルーチンのスタック、レジスタ、およびその他のメモリ関連情報が省略されます。
   226  
   227  [Race Detector article]: https://go.dev/doc/articles/race_detector
   228  */
   229  package runtime
   230  
   231  import (
   232  	"github.com/shogo82148/std/internal/goarch"
   233  	"github.com/shogo82148/std/internal/goos"
   234  )
   235  
   236  // Callerは、呼び出し元のゴルーチンのスタック上での関数呼び出しに関するファイルと行番号情報を報告します。
   237  // 引数skipは、上昇するスタックフレームの数であり、0はCallerの呼び出し元を識別します。
   238  // (歴史的な理由から、skipの意味はCallerと [Callers] で異なります。)
   239  // 戻り値は、対応する呼び出しのプログラムカウンタ、ファイル名、およびファイル内の行番号を報告します。
   240  // 情報を回復できなかった場合、ブール値okはfalseです。
   241  func Caller(skip int) (pc uintptr, file string, line int, ok bool)
   242  
   243  // Callersは、呼び出し元のゴルーチンのスタック上での関数呼び出しの戻りプログラムカウンタを、スライスpcで埋めます。
   244  // 引数skipは、pcに記録する前にスキップするスタックフレームの数であり、0はCallers自体のフレームを識別し、1はCallersの呼び出し元を識別します。
   245  // pcに書き込まれたエントリ数を返します。
   246  //
   247  // これらのPCを関数名や行番号などの記号情報に変換するには、[CallersFrames] を使用します。
   248  // CallersFramesはインライン化された関数を考慮に入れ、戻りプログラムカウンタを
   249  // 呼び出しプログラムカウンタに調整します。返されたPCのスライスを直接反復処理することは
   250  // 勧められません。また、返されたPCのいずれかに [FuncForPC] を使用することも、
   251  // インライン化や戻りプログラムカウンタの調整を考慮に入れられないため、勧められません。
   252  func Callers(skip int, pc []uintptr) int
   253  
   254  // GOROOTは、Goツリーのルートを返します。プロセス開始時に設定されている場合はGOROOT環境変数を使用し、
   255  // それ以外の場合はGoビルド中に使用されたルートを使用します。
   256  func GOROOT() string
   257  
   258  // Versionは、Goツリーのバージョン文字列を返します。
   259  // ビルド時のコミットハッシュと日付、または可能な場合は「go1.3」のようなリリースタグです。
   260  func Version() string
   261  
   262  // GOOSは実行中のプログラムのオペレーティングシステムターゲットです。
   263  // darwin、freebsd、linuxなどのいずれかです。
   264  // GOOSとGOARCHの可能な組み合わせを表示するには、「go tool dist list」と入力してください。
   265  const GOOS string = goos.GOOS
   266  
   267  // GOARCHは、実行中のプログラムのアーキテクチャターゲットです。
   268  // 386、amd64、arm、s390xなどのいずれかです。
   269  const GOARCH string = goarch.GOARCH