LoginSignup
1
2

More than 3 years have passed since last update.

メモリ不足でXcodeのValidateができない

Last updated at Posted at 2019-12-19

Validateできない問題

XcodeでApp StoreにiPhoneアプリをアップロードした時のことです。

Archiveまではスムーズだったのに、「Validate App」を実行したらめちゃくちゃ待たされた上にPCがクラッシュしました。
Validateを無視してDistributeしてもクラッシュ。
ipaファイルをコマンドで作成してもクラッシュ。
何度繰り返してもクラッシュ。

エラーじゃないので調べても出てこず、めちゃくちゃ困ったので誰かの役にたつことを願って展開します。

環境

iMac (21.5-inch, Late 2012)
OS Mojave 10.14.5
Xcode 11.3
メモリ 8GB
外付けSSDで起動 (APFSでフォーマット)

原因はメモリ不足

アクティビティモニタを起動しながら再度実行。
メモリタブを確認すると、見事にメモリプレッシャーが真っ赤。

どうやら私のiMacのメモリ8GBでは不足している模様。
(物理メモリ8GBに対し使用メモリが7.8GB付近をうろうろした挙句勝手に再起動する)

どうするか

メモリを増設すれば解決。
ただし、私のiMac2012はがっつり分解しないと増設できないため最終手段とします。

そもそも8GBでも普通にみなさんリリースできているため、何か別に原因があると推測。

アクティビティモニタを眺めていると妙なことに気づく。
どれだけ高負荷になってもスワップ使用領域が0Bから変わらない。
そして8GBに達した瞬間にフリーズからのクラッシュ。
メモリスワップしてなくない?

解決策

どうやら、
APFSでフォーマットしたSSDを起動に使用しているとスワップ領域がマウントされない不具合があるらしい。
とりあえずValidateの間メモリが足りてくれればよいので、手動でマウントします。

ターミナルを起動し以下コマンドを実行。

diskutil list

一覧で出たVolumeのうち、Volume VMとなっているdiskを探す。
(私の場合は、disk1s4でした)

diskutil info diskXXX(diskの名前)

diskutil infoで対象のdiskの状態を確認します。
Volume Name: VM
Mounted: No
こんな感じでMountedがNoになっていたらマウントされていないためスワップできないので、以下コマンドでマウントします。
(su権限のパスワード入力を求められます)

sudo diskutil mount -mountPoint /private/var/vm diskXXX

Volume VM on disk1s4 mounted
こんな感じになればOK
再度diskutil infoするとmountedがYesになっていることがわかります。

結果

マウント完了後、再度Validateを実行するとスワップ使用領域が適切に使用され無事アップロードすることができました。

1つ注意点として、PCを再起動するとまたアンマウントされてしまいます。
重い処理を実施する前にはマウントされてるか確認したほうが良いかと思います。

再起動してもマウントを続ける手段は不明です。
フォーマット方式を変えるべきか…。

追記

Automator使って再起動するたびにマウントするようにしました。
起動時にパスワード入力を求められるのがちょっとうざいですが快適です。
(詳細な手順は参考リンクをご覧ください)

osascript -e 'do shell script "sudo diskutil mount -mountPoint /private/var/vm disk1s4" with administrator privileges'

追記2

MacOSをバージョンアップしたら以下エラーが発生するようになりました。

0:103: execution error: Volume on disk1s4 failed to mount
Perhaps the operation is not allowed by the invoking user (kDAReturnNotPrivileged)
This appears to be an APFS Volume; note that locked APFS volumes
will not mount unless unlocked (e.g. "diskutil apfs unlockVolume") (1)

UnlockVolumeしてもそもそもロックされてないとのことで解決せず。
どうやらMacのセキュリティ機能であるSIP(System Integrity Protection)のせいっぽい。
リカバリモード(command + R で再起動)のターミナルから以下コマンドを実行し解除したところ問題なく動作するようになりました。
(詳細な手順は参考リンクをご覧ください)
$ csrutil disable

参考

スワップ領域が確保されない - Apple コミュニティ
Macの起動ディスクをAPFSフォーマットのUSB外付けSSDにするとハマる罠

Mac OSXで起動時にスクリプトを実行する方法
Automatorでsudoする方法

SIPの無効化

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2