XcodeでLLDBを使用してデバッグ中に変数値を変更するにはどうすればよいですか?


173

Xcodeでは、GDBを使用すると、デバッグ中にローカル変数を変更できます(XCodeでデバッグ中にNSString値を変更する方法を参照してください)。LLDBは同様の機能を提供しますか?もしそうなら、それをどのように使用できますか?


iOSの高度なデバッグをご覧ください。素晴らしい
ハニー

文字列の長さが0〜15文字の場合に機能するオブジェクトプロパティを設定しようとしています。16文字以上の文字列の設定は受け入れられますが、それを印刷すると、意味のない文字列po myObj.someString = "1234567890123456"が表示されますが、これは機能しますが、印刷すると(String?$ R68 = " \ 0 \ 0 \ 0 \ 0 @ \ a \ u {1} \ c {5} \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ "
Nick Wright

回答:


267
expr myString = @"Foo"

(lldb)help expr
現在スコープ内にある変数を使用して、現在のプログラムコンテキストでC / ObjC / C ++式を評価します。このコマンドは「生の」入力を受け取ります(引用符で囲む必要はありません)。

構文:式-

コマンドオプション使用法:式[-f] [-G] [-d] [-u]-式[-o] [-d] [-u]-式

   -G <gdb-format>  ( --gdb-format <gdb-format> )
        Specify a format using a GDB format specifier string.

   -d <boolean>  ( --dynamic-value <boolean> )
        Upcast the value resulting from the expression to its dynamic type
        if available.

   -f <format>  ( --format <format> )
        Specify a format to be used for display.

   -o  ( --object-description )
        Print the object description of the value resulting from the
        expression.

   -u <boolean>  ( --unwind-on-error <boolean> )
        Clean up program state if the expression causes a crash, breakpoint
        hit or signal.

例:

expr my_struct-> a = my_array [3]
expr -f bin- (index * 8)+ 5
expr char c [] = "foo"; c [0]

重要な注意:このコマンドは「raw」入力を取得するため、コマンドオプションを使用する場合は、コマンドオプションの最後とraw入力の最初の間に「-」を使用する必要があります。

'expr'は 'expression'の省略形です


1
本当に、ありがとう!もう1つ小さな質問:UILabelのテキストを変更するためにこれを行っています:'expr myLabel.text = @"hello!"しかし、error: property 'text' not found on object of type 'UILabel *'...何か考えはありますか?
Eric

10
expr (void)[label setText:@"Foo"]それを行う必要があります。通常、Dot-Syntaxはデバッガーでは機能しません。lldbは、おそらくc-structのメンバーにアクセスしたかったと解釈しますが、これが機能しない理由かどうかはわかりません。Dot-Syntaxも機能しませんpo。代わりpo label.textに使用する必要がありますpo [label text]
Matthias Bauch

4
実際、lldbはgdbよりもはるかに優れたドット構文を処理します。gdbは、C構造体のように処理していることを前提としていますが、失敗します。lldbはプロパティに正しくアクセスしますが、実際にで宣言されている場合のみです@property
BJホーマー

28
pショートカットとしても使用できexprます。例:(lldb) p url = @"http://google.com"
funroll

11
eショートカットとしても使用できexprます。ところで、pprintのエイリアスでありexpr --(evalueのraw入力のみで、フラグはありません)expr -o -- [object]po通常はオブジェクトに対してより有用な出力を提供します。
Jason Newell

21

次のものは私のために働きます。Xcode 8を使用しています。

いくつかの変数(たとえば、 "dict")をnilに設定してから、コードフローをテストする場合は、次のことを試すことができます。

  1. 目的の値に初期化した後、ブレークポイントを適切に設定します。
  2. 次に、lldbコマンドラインで "expression dict = nil"を実行して変更します。(例えば "nil")
  3. ブレークポイントを超えます。
  4. 次の行で変数「dict」を確認します。ゼロになります。

コンソールのようになります。

(lldb) expression dict = nil
(NSDictionary *) $5 = nil

3

Xcode 10または11を使用している場合は、必要な変数に初期化した後に適切にブレークポイントを設定すると、po myString = "Hello World"簡単に変数を変更できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.