Imaginantia

思ったことを書きます

Udonデバッグ記 / HalfLine

折角なので残してみます。というか後で私が参照する為に。

うちのワールド HalfLine では度々「キューブがでなくなる」バグが発生していました。幾つか発見し潰したものの今もまだ残っているようでした。

幸いにもUdonがクラッシュするタイプのバグだったのでログから色々情報が取れました。

f:id:phi16_ind:20210611191130p:plain

もうこれ箇条書きでいい?

  • Heap Dump0x00000001 に書いてあるのがクラッシュした Udon がついてる GameObject の名前 (string)。
  • Program Counter was at: 18536 っていうのは 18536 = 0x00004868 番地でクラッシュしたっていうこと。
  • 該当する Udon Program Asset の Program Disassembly → Disassembled Program を眺める。

f:id:phi16_ind:20210611191205p:plain

  • 確かに EXTERN to 'UnityEngineVector4Array.__Get__SystemInt32__UnityEngineVector4' と名前が一致している。
  • この辺のアセンブリを元にして Compiled C# Udon Assembly → Assembly Code から似たような記述を探す。
    • 縦の長さが違うだけでほぼ同じ場所にあるはず (全体行数に対する行番号の割合がほぼ同一という話)。

f:id:phi16_ind:20210611191620p:plain

  • #コメントアウトされている行が「元々U#で書かれていたコード」なので、それをオリジナルコードから探す (関数名がわかるのですぐわかるはず)。

f:id:phi16_ind:20210611191817p:plain

  • 引数を知りたい。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 はたまに短くなったりするから範囲外は弾かなきゃいけないんだと思う。しらんけど。

まぁちょっと調べて直します。

では。