ログは出てるが手がかりがないような場合ってありますよね
Xcodeでデバッグしていると、システム内部で何かしらのエラーが発生した時に以下のようなログが出力されることがあります。
ただ、どのメソッドやどの行の処理を実行した時に発生しているのかというところまでは確認できません。
This NSLayoutConstraint is being configured with a constant that exceeds internal limits. A smaller value will be substituted, but this problem should be fixed. Break on void _NSLayoutConstraintNumberExceedsLimit() to debug. This will be logged only once. This may break in the future.
そんなときはSymbolic Brakepointを使い、どの処理を実行した時にログが吐かれているのか洗い出しましょう。
Symbolic Brakepointを作成する
上記のログを参考に、Symbolic Brakepointを作成します。
GUIから作成する
はじめに、XcodeのGUIから _NSLayoutConstraintNumberExceedsLimit
という関数にブレークポイントを貼ってみます。
Brakepoint Navigatorの"+"ボタンから、"Add Symbolic Breakpoint..."を選択します。
"Symbol"に、_NSLayoutConstraintNumberExceedsLimit
を入力します。
関数のカッコをつけると、ブレークポイントを貼れないので注意しましょう。
この状態で上記のログが出力されるような処理を実行すると、_NSLayoutConstraintNumberExceedsLimit()
が呼び出されたタイミングでブレークされます。あとはスタックトレースを追うなどして自分の好きなように解析していきましょう。
デバッグコンソールから作成する
Symbolic Brakepointは、デバッグコンソールから設定することもできます。
br s -n <someSymbolToBrake>(= brakepoint set -name <someSymbolToBrake>)
のコマンドを実行します。
(lldb) br s -n _NSLayoutConstraintNumberExceedsLimit
Breakpoint 11: where = Foundation`_NSLayoutConstraintNumberExceedsLimit, address = 0x00000001845d136c
このコマンドと引数で指定した場合、デバッグが終了するとブレークポイントも削除されてしまいます。
次に開始する時にも同じようにブレークさせたい場合、再度コマンドを入力しましょう。
なお、GUIから設定する時と同じように、関数名のカッコが残っているとエラーになります。
(lldb) br s -n _NSLayoutConstraintNumberExceedsLimit()
Breakpoint 12: no locations (pending).
WARNING: Unable to resolve breakpoint to any actual locations.