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