とある個人の健康管理日誌

うつ状態である私の日々の健康状態を淡々と綴っていきます。

7月05日(日)の記録

7月05日(日)

今日も昼まで寝て、午後から例の件の続き。

とうとう不具合の原因までたどり着いた。64bit対応しているのだが、とある関数の戻り値(size_t = unsigned long)を、U32(unsigned int)で受けている箇所があって、その後の比較条件で外れてしまい無限ループ(をしてその中で malloc していたので OOM)という感じだった。U32 を size_t にすると症状はピタリと治まった。それにしても苦労の連続だった。

  • とあるメソッドを叩くと、2秒と立たずにOOM→再現は容易だが発生箇所特定が難しい
  • プロファイラでメモリの内訳をみると Java側ではなく Native 側→malloc から箇所を特定していくしかなさそう
  • Android 環境だと malloc に hook をかけることができるのだが、端末を root 化する必要がある
  • root 化するのに twrp とか magisk とか使え(使うのが楽)とのことだが、慣れてないもので四苦八苦(情報漁るのと試行錯誤で2日は潰れた)
  • malloc hook も公式にあるとおりにやってもなかなかうまくいかない(最終的にはどうにか機能した→これが大きかった)
  • hook で引っ掛けた箇所をデバッガで調べるのだが、呼び出し回数が非常に多い(当たり前)ため、どうにか工夫しないとダメかな?って思ってたら、特定のスレッドの特定の箇所が何度も呼ばれていることに気がついた(これが無限ループの箇所)

実際には、上記に加え、Android Studio の今回の対象箇所(ライブラリ)にブレークポイントを設定する、というのもネットで調べただけではわからなかった(ちょっとした閃きで発見)。等々、道のりがすごく長かった。

まだ不具合があるかも知れない(気になるところがあり修正要かも)が、ひとまず山を越えた気がする。

ここ2週間程度?これ以外のことを全くやっていないので、ぼちぼち3Dプリンタ作業も復活させたい。今日はもう疲れたので何もしないが。