LoginSignup
5
3

More than 5 years have passed since last update.

Symbolic Brakepointを設定して、意味がわからないログの手がかりを掴んでみる

Last updated at Posted at 2015-05-15

ログは出てるが手がかりがないような場合ってありますよね

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..."を選択します。
brakepointNavigator.png

"Symbol"に、_NSLayoutConstraintNumberExceedsLimit を入力します。
addSymbolicBrakepoint.png
関数のカッコをつけると、ブレークポイントを貼れないので注意しましょう。

この状態で上記のログが出力されるような処理を実行すると、_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.
5
3
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
5
3