iOSの暴走とKDBプロセス

title

昨年からiPhoneの何かしらのプロセスが暴走し、電池の消耗が異常に早くなるというコトが多々発生していた。
似たような事例はいくつか検索すると出てくるのだが、どれも確信に迫った答えが無く、仕方なく初期化 -> バックアップから復旧などを繰り返すも、治らなかったり、時間を置いてまた暴走し始めたりということがあった。

そして、先日下記の記事になんとかたどり着いて解決することが出来た。

[[寄稿] iPhone 5s の異常発熱とユーザ辞書の不一致の因果関係について gbsブログ ](http://daiskegbs.tumblr.com/post/66359843054/iphone5s-conflict)

詳しくはリンク先をチェックして頂くこと分かるので、割愛。

記事に辿り着くまで

iOS 7 / iPhone 5s の Jailbreak がついに出来るようになり、数日したころ iPhone の暴走が再開した。

iPhoneはアプリや、プロセス毎のCPU使用率などが把握できない仕様になっている。けれども、Jailbreakしてしまえばコマンドラインを経由してその辺りを調べることが出来る!!ということに気が付き調べてみることにした。

top コマンドのインストール

プロセスのCPU使用率を調べるにはtopというコマンドを使う。

  • Jailbreakする
  • Cydia を Developer or Hacker モードにする
  • MobileTerminal と top をインストール

Cydia のモードは Manage タブに切り替えた後、左上の Settings から行える。

User モードのままでは検索しても top コマンドが出てこない。

top コマンドの使い方

細かい使い方は割愛して、CPU使用率を調べる方法。

  • MobileTerminal を起動
  • top と入力すると、プロセス一覧が出てくる
  • o と入力し、
  • primary key [+cpu]: と7行目あたりに出てきたら
  • cpu と入力し、Return を押す

これで、CPU使用率順でプロセスを確認することが出来る。

終了する場合はキーボードで q と打つだけ。

暴走しているプロセスKDB

結果、kdb というプロセスが暴走していることが発覚した。

kdb とは、どうやら Keyboard Data Base の略か何からしく、Keyboard あたりが怪しいということがわかった。

そして、最初に述べた記事にたどり着くことが出来た。

ユーザ辞書の初期化

原因はユーザ辞書の同期が上手く行かず、ユーザ辞書をのなんらかの処理を行っている kdb プロセスが暴走するということらしい。その為ユーザ辞書を初期化する必要が出てくるのだが、リンク先の記事のユーザ辞書の初期化方法では上手く行かなかった。

仕方ないので、iOS 側のユーザ辞書も Terminal を使って初期化することにした。

リンク先の記事で行われているように、事前に 書類とデータ の同期を OFF にし、下記の作業を行った。

  • OpenSSH を iPhone 及び、iPad にインストール
  • Mac から SSH を使って iOS に接続
  • find /private/var/mobile/Library/ -name 'UserDictionary*' と入力し、デバイス上の全てのユーザ辞書を検索

コマンドの結果は下記の通り(一部 # で隠してある)

/private/var/mobile/Library/Keyboard/CoreDataUbiquitySupport/mobile~########-####-####-####-############/UserDictionary
/private/var/mobile/Library/Mobile Documents/com~apple~TextInput/Dictionaries/.baseline/UserDictionary
/private/var/mobile/Library/Mobile Documents/com~apple~TextInput/Dictionaries/mobile~########-####-####-####-############/UserDictionary
/private/var/mobile/Library/Mobile Documents/com~apple~TextInput/Dictionaries/mobile~########-####-####-####-############/UserDictionary
/private/var/mobile/Library/Mobile Documents/com~apple~TextInput/Dictionaries/#######~#######-####-####-####-#############/UserDictionary
/private/var/mobile/Library/Mobile Documents/com~apple~TextInput/fork~mobile~########-####-####-####-############/mobile.########-####-####-####-############/UserDictionary
/private/var/mobile/Library/Mobile Documents/com~apple~TextInput/fork~mobile~########-####-####-####-############/mobile.########-####-####-####-############/UserDictionary
/private/var/mobile/Library/Mobile Documents/com~apple~TextInput/fork~mobile~########-####-####-####-############/mobile.########-####-####-####-############/UserDictionary
/private/var/mobile/Library/Mobile Documents/com~apple~TextInput/fork~mobile~########-####-####-####-############/mobile~########-####-####-####-############/UserDictionary
/private/var/mobile/Library/Mobile Documents/com~apple~TextInput/fork~mobile~########-####-####-####-############/mobile~########-####-####-####-############/UserDictionary
/private/var/mobile/Library/Mobile Documents/com~apple~TextInput/fork~mobile~########-####-####-####-############/mobile~########-####-####-####-############/UserDictionary
/private/var/mobile/Library/Mobile Documents/com~apple~TextInput/fork~mobile~########-####-####-####-############/mobile~########-####-####-####-############/UserDictionary
/private/var/mobile/Library/Mobile Documents/com~apple~TextInput/fork~mobile~########-####-####-####-############/#########~########-####-####-####-############/UserDictionary

この結果を元に、 mobile~###… や、fork~mobile~####… となっているディレクトリをまるまるコマンドで削除する。

例えば

/private/var/mobile/Library/Mobile Documents/com~apple~TextInput/fork~mobile~########-####-####-####-############/mobile.########-####-####-####-############/UserDictionary

の場合は

rm -Rf /private/var/mobile/Library/Mobile\ Documents/com\~apple\~TextInput/fork\~mobile\~########-####-####-####-############

といった形で。 ~とスペースの手前はバックスラッシュでエスケープするように。
ペースト時に Cmd + Shift + v を使えば自動的にエスケープされるので、活用しよう。

あとは、iPhone を念のため再起動し、同期を再開して完了。

終わりに

ここ数年なやまされた iOS の暴走から脱することが出来た。

何年も前の、Mobile me 時代にも似たような同期によるファイルの破損及び、プロセスの暴走があった。当時は iPhone ではなく、Mac同士の Keychain Access の同期だったが。

Appleはこの辺の破損に弱いのだろうか…。SQLiteで保存されている設定ファイル同期が苦手なのだろうか?
Mailでも膨大化して壊れること多々あるよね。

壊れるのは仕方ないがなんとか修復を行うところや、最低限警告を出すなどの対応をして欲しいところだ…。