折角なので残してみます。というか後で私が参照する為に。
うちのワールド HalfLine では度々「キューブがでなくなる」バグが発生していました。幾つか発見し潰したものの今もまだ残っているようでした。
幸いにもUdonがクラッシュするタイプのバグだったのでログから色々情報が取れました。
もうこれ箇条書きでいい?
Heap Dump
の0x00000001
に書いてあるのがクラッシュした Udon がついてる GameObject の名前 (string)。Program Counter was at: 18536
っていうのは18536
=0x00004868
番地でクラッシュしたっていうこと。- 該当する Udon Program Asset の Program Disassembly → Disassembled Program を眺める。
- 確かに
EXTERN to 'UnityEngineVector4Array.__Get__SystemInt32__UnityEngineVector4'
と名前が一致している。 - この辺のアセンブリを元にして Compiled C# Udon Assembly → Assembly Code から似たような記述を探す。
- 縦の長さが違うだけでほぼ同じ場所にあるはず (全体行数に対する行番号の割合がほぼ同一という話)。
#
でコメントアウトされている行が「元々U#で書かれていたコード」なので、それをオリジナルコードから探す (関数名がわかるのですぐわかるはず)。
- 引数を知りたい。
Parameter Address: 0x00000012, 0x000000CA, 0x00000197
からそれぞれの値を探しに行く。- これは (EXTERN名から) 順に「呼び出し対象」「第一引数」「戻り値の格納先」であることがわかる (んだと思うけど仕様どこにあったっけね)。
- Udonには即値が無いのでこれは全部Heapへの参照。
0x00000012: UnityEngine.Vector4[]
これは上の方にあるのでメンバ変数っぽい[UdonSynced] Vector4[] data
っぽい (確かにコードと一致)
0x000000CA: 238
第一引数は 238 (int) っぽい0x00000197: (0.0, 0.0, 0.0, 0.0)
まぁなんか適当な格納先っぽい
ということで今回は「配列 data
に添字 238
での要素アクセスをした結果範囲外アクセスを起こした」ということがわかりました。おわり。
おわりです。後は知らん。多分うちのワールドだと配列 data
はたまに短くなったりするから範囲外は弾かなきゃいけないんだと思う。しらんけど。
まぁちょっと調べて直します。
では。