<html><body>
<style>

body, h1, h2, h3, div, span, p, pre, a {
  margin: 0;
  padding: 0;
  border: 0;
  font-weight: inherit;
  font-style: inherit;
  font-size: 100%;
  font-family: inherit;
  vertical-align: baseline;
}

body {
  font-size: 13px;
  padding: 1em;
}

h1 {
  font-size: 26px;
  margin-bottom: 1em;
}

h2 {
  font-size: 24px;
  margin-bottom: 1em;
}

h3 {
  font-size: 20px;
  margin-bottom: 1em;
  margin-top: 1em;
}

pre, code {
  line-height: 1.5;
  font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace;
}

pre {
  margin-top: 0.5em;
}

h1, h2, h3, p {
  font-family: Arial, sans serif;
}

h1, h2, h3 {
  border-bottom: solid #CCC 1px;
}

.toc_element {
  margin-top: 0.5em;
}

.firstline {
  margin-left: 2 em;
}

.method  {
  margin-top: 1em;
  border: solid 1px #CCC;
  padding: 1em;
  background: #EEE;
}

.details {
  font-weight: bold;
  font-size: 14px;
}

</style>

<h1><a href="clouddebugger_v2.html">Cloud Debugger API</a> . <a href="clouddebugger_v2.controller.html">controller</a> . <a href="clouddebugger_v2.controller.debuggees.html">debuggees</a> . <a href="clouddebugger_v2.controller.debuggees.breakpoints.html">breakpoints</a></h1>
<h2>Instance Methods</h2>
<p class="toc_element">
  <code><a href="#list">list(debuggeeId, agentId=None, successOnTimeout=None, waitToken=None, x__xgafv=None)</a></code></p>
<p class="firstline">Returns the list of all active breakpoints for the debuggee.</p>
<p class="toc_element">
  <code><a href="#update">update(debuggeeId, id, body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Updates the breakpoint state or mutable fields.</p>
<h3>Method Details</h3>
<div class="method">
    <code class="details" id="list">list(debuggeeId, agentId=None, successOnTimeout=None, waitToken=None, x__xgafv=None)</code>
  <pre>Returns the list of all active breakpoints for the debuggee.

The breakpoint specification (`location`, `condition`, and `expressions`
fields) is semantically immutable, although the field values may
change. For example, an agent may update the location line number
to reflect the actual line where the breakpoint was set, but this
doesn&#x27;t change the breakpoint semantics.

This means that an agent does not need to check if a breakpoint has changed
when it encounters the same breakpoint on a successive call.
Moreover, an agent should remember the breakpoints that are completed
until the controller removes them from the active list to avoid
setting those breakpoints again.

Args:
  debuggeeId: string, Required. Identifies the debuggee. (required)
  agentId: string, Identifies the agent.
This is the ID returned in the RegisterDebuggee response.
  successOnTimeout: boolean, If set to `true` (recommended), returns `google.rpc.Code.OK` status and
sets the `wait_expired` response field to `true` when the server-selected
timeout has expired.

If set to `false` (deprecated), returns `google.rpc.Code.ABORTED` status
when the server-selected timeout has expired.
  waitToken: string, A token that, if specified, blocks the method call until the list
of active breakpoints has changed, or a server-selected timeout has
expired. The value should be set from the `next_wait_token` field in
the last response. The initial value should be set to `&quot;init&quot;`.
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # Response for listing active breakpoints.
    &quot;breakpoints&quot;: [ # List of all active breakpoints.
        # The fields `id` and `location` are guaranteed to be set on each breakpoint.
      { # ------------------------------------------------------------------------------
          # ## Breakpoint (the resource)
          #
          # Represents the breakpoint specification, status and results.
        &quot;expressions&quot;: [ # List of read-only expressions to evaluate at the breakpoint location.
            # The expressions are composed using expressions in the programming language
            # at the source location. If the breakpoint action is `LOG`, the evaluated
            # expressions are included in log statements.
          &quot;A String&quot;,
        ],
        &quot;evaluatedExpressions&quot;: [ # Values of evaluated expressions at breakpoint time.
            # The evaluated expressions appear in exactly the same order they
            # are listed in the `expressions` field.
            # The `name` field holds the original expression text, the `value` or
            # `members` field holds the result of the evaluated expression.
            # If the expression cannot be evaluated, the `status` inside the `Variable`
            # will indicate an error and contain the error text.
          { # Represents a variable or an argument possibly of a compound object type.
              # Note how the following variables are represented:
              #
              # 1) A simple variable:
              #
              #     int x = 5
              #
              #     { name: &quot;x&quot;, value: &quot;5&quot;, type: &quot;int&quot; }  // Captured variable
              #
              # 2) A compound object:
              #
              #     struct T {
              #         int m1;
              #         int m2;
              #     };
              #     T x = { 3, 7 };
              #
              #     {  // Captured variable
              #         name: &quot;x&quot;,
              #         type: &quot;T&quot;,
              #         members { name: &quot;m1&quot;, value: &quot;3&quot;, type: &quot;int&quot; },
              #         members { name: &quot;m2&quot;, value: &quot;7&quot;, type: &quot;int&quot; }
              #     }
              #
              # 3) A pointer where the pointee was captured:
              #
              #     T x = { 3, 7 };
              #     T* p = &amp;x;
              #
              #     {   // Captured variable
              #         name: &quot;p&quot;,
              #         type: &quot;T*&quot;,
              #         value: &quot;0x00500500&quot;,
              #         members { name: &quot;m1&quot;, value: &quot;3&quot;, type: &quot;int&quot; },
              #         members { name: &quot;m2&quot;, value: &quot;7&quot;, type: &quot;int&quot; }
              #     }
              #
              # 4) A pointer where the pointee was not captured:
              #
              #     T* p = new T;
              #
              #     {   // Captured variable
              #         name: &quot;p&quot;,
              #         type: &quot;T*&quot;,
              #         value: &quot;0x00400400&quot;
              #         status { is_error: true, description { format: &quot;unavailable&quot; } }
              #     }
              #
              # The status should describe the reason for the missing value,
              # such as `&lt;optimized out&gt;`, `&lt;inaccessible&gt;`, `&lt;pointers limit reached&gt;`.
              #
              # Note that a null pointer should not have members.
              #
              # 5) An unnamed value:
              #
              #     int* p = new int(7);
              #
              #     {   // Captured variable
              #         name: &quot;p&quot;,
              #         value: &quot;0x00500500&quot;,
              #         type: &quot;int*&quot;,
              #         members { value: &quot;7&quot;, type: &quot;int&quot; } }
              #
              # 6) An unnamed pointer where the pointee was not captured:
              #
              #     int* p = new int(7);
              #     int** pp = &amp;p;
              #
              #     {  // Captured variable
              #         name: &quot;pp&quot;,
              #         value: &quot;0x00500500&quot;,
              #         type: &quot;int**&quot;,
              #         members {
              #             value: &quot;0x00400400&quot;,
              #             type: &quot;int*&quot;
              #             status {
              #                 is_error: true,
              #                 description: { format: &quot;unavailable&quot; } }
              #             }
              #         }
              #     }
              #
              # To optimize computation, memory and network traffic, variables that
              # repeat in the output multiple times can be stored once in a shared
              # variable table and be referenced using the `var_table_index` field.  The
              # variables stored in the shared table are nameless and are essentially
              # a partition of the complete variable. To reconstruct the complete
              # variable, merge the referencing variable with the referenced variable.
              #
              # When using the shared variable table, the following variables:
              #
              #     T x = { 3, 7 };
              #     T* p = &amp;x;
              #     T&amp; r = x;
              #
              #     { name: &quot;x&quot;, var_table_index: 3, type: &quot;T&quot; }  // Captured variables
              #     { name: &quot;p&quot;, value &quot;0x00500500&quot;, type=&quot;T*&quot;, var_table_index: 3 }
              #     { name: &quot;r&quot;, type=&quot;T&amp;&quot;, var_table_index: 3 }
              #
              #     {  // Shared variable table entry #3:
              #         members { name: &quot;m1&quot;, value: &quot;3&quot;, type: &quot;int&quot; },
              #         members { name: &quot;m2&quot;, value: &quot;7&quot;, type: &quot;int&quot; }
              #     }
              #
              # Note that the pointer address is stored with the referencing variable
              # and not with the referenced variable. This allows the referenced variable
              # to be shared between pointers and references.
              #
              # The type field is optional. The debugger agent may or may not support it.
            &quot;members&quot;: [ # Members contained or pointed to by the variable.
              # Object with schema name: Variable
            ],
            &quot;status&quot;: { # Represents a contextual status message. # Status associated with the variable. This field will usually stay
                # unset. A status of a single variable only applies to that variable or
                # expression. The rest of breakpoint data still remains valid. Variables
                # might be reported in error state even when breakpoint is not in final
                # state.
                #
                # The message may refer to variable name with `refers_to` set to
                # `VARIABLE_NAME`. Alternatively `refers_to` will be set to `VARIABLE_VALUE`.
                # In either case variable value and members will be unset.
                #
                # Example of error message applied to name: `Invalid expression syntax`.
                #
                # Example of information message applied to value: `Not captured`.
                #
                # Examples of error message applied to value:
                #
                # *   `Malformed string`,
                # *   `Field f not found in class C`
                # *   `Null pointer dereference`
                # The message can indicate an error or informational status, and refer to
                # specific parts of the containing object.
                # For example, the `Breakpoint.status` field can indicate an error referring
                # to the `BREAKPOINT_SOURCE_LOCATION` with the message `Location not found`.
              &quot;isError&quot;: True or False, # Distinguishes errors from informational messages.
              &quot;description&quot;: { # Represents a message with parameters. # Status message text.
                &quot;format&quot;: &quot;A String&quot;, # Format template for the message. The `format` uses placeholders `$0`,
                    # `$1`, etc. to reference parameters. `$$` can be used to denote the `$`
                    # character.
                    #
                    # Examples:
                    #
                    # *   `Failed to load &#x27;$0&#x27; which helps debug $1 the first time it
                    #     is loaded.  Again, $0 is very important.`
                    # *   `Please pay $$10 to use $0 instead of $1.`
                &quot;parameters&quot;: [ # Optional parameters to be embedded into the message.
                  &quot;A String&quot;,
                ],
              },
              &quot;refersTo&quot;: &quot;A String&quot;, # Reference to which the message applies.
            },
            &quot;name&quot;: &quot;A String&quot;, # Name of the variable, if any.
            &quot;type&quot;: &quot;A String&quot;, # Variable type (e.g. `MyClass`). If the variable is split with
                # `var_table_index`, `type` goes next to `value`. The interpretation of
                # a type is agent specific. It is recommended to include the dynamic type
                # rather than a static type of an object.
            &quot;value&quot;: &quot;A String&quot;, # Simple value of the variable.
            &quot;varTableIndex&quot;: 42, # Reference to a variable in the shared variable table. More than
                # one variable can reference the same variable in the table. The
                # `var_table_index` field is an index into `variable_table` in Breakpoint.
          },
        ],
        &quot;isFinalState&quot;: True or False, # When true, indicates that this is a final result and the
            # breakpoint state will not change from here on.
        &quot;stackFrames&quot;: [ # The stack at breakpoint time, where stack_frames[0] represents the most
            # recently entered function.
          { # Represents a stack frame context.
            &quot;locals&quot;: [ # Set of local variables at the stack frame location.
                # Note that this might not be populated for all stack frames.
              { # Represents a variable or an argument possibly of a compound object type.
                  # Note how the following variables are represented:
                  #
                  # 1) A simple variable:
                  #
                  #     int x = 5
                  #
                  #     { name: &quot;x&quot;, value: &quot;5&quot;, type: &quot;int&quot; }  // Captured variable
                  #
                  # 2) A compound object:
                  #
                  #     struct T {
                  #         int m1;
                  #         int m2;
                  #     };
                  #     T x = { 3, 7 };
                  #
                  #     {  // Captured variable
                  #         name: &quot;x&quot;,
                  #         type: &quot;T&quot;,
                  #         members { name: &quot;m1&quot;, value: &quot;3&quot;, type: &quot;int&quot; },
                  #         members { name: &quot;m2&quot;, value: &quot;7&quot;, type: &quot;int&quot; }
                  #     }
                  #
                  # 3) A pointer where the pointee was captured:
                  #
                  #     T x = { 3, 7 };
                  #     T* p = &amp;x;
                  #
                  #     {   // Captured variable
                  #         name: &quot;p&quot;,
                  #         type: &quot;T*&quot;,
                  #         value: &quot;0x00500500&quot;,
                  #         members { name: &quot;m1&quot;, value: &quot;3&quot;, type: &quot;int&quot; },
                  #         members { name: &quot;m2&quot;, value: &quot;7&quot;, type: &quot;int&quot; }
                  #     }
                  #
                  # 4) A pointer where the pointee was not captured:
                  #
                  #     T* p = new T;
                  #
                  #     {   // Captured variable
                  #         name: &quot;p&quot;,
                  #         type: &quot;T*&quot;,
                  #         value: &quot;0x00400400&quot;
                  #         status { is_error: true, description { format: &quot;unavailable&quot; } }
                  #     }
                  #
                  # The status should describe the reason for the missing value,
                  # such as `&lt;optimized out&gt;`, `&lt;inaccessible&gt;`, `&lt;pointers limit reached&gt;`.
                  #
                  # Note that a null pointer should not have members.
                  #
                  # 5) An unnamed value:
                  #
                  #     int* p = new int(7);
                  #
                  #     {   // Captured variable
                  #         name: &quot;p&quot;,
                  #         value: &quot;0x00500500&quot;,
                  #         type: &quot;int*&quot;,
                  #         members { value: &quot;7&quot;, type: &quot;int&quot; } }
                  #
                  # 6) An unnamed pointer where the pointee was not captured:
                  #
                  #     int* p = new int(7);
                  #     int** pp = &amp;p;
                  #
                  #     {  // Captured variable
                  #         name: &quot;pp&quot;,
                  #         value: &quot;0x00500500&quot;,
                  #         type: &quot;int**&quot;,
                  #         members {
                  #             value: &quot;0x00400400&quot;,
                  #             type: &quot;int*&quot;
                  #             status {
                  #                 is_error: true,
                  #                 description: { format: &quot;unavailable&quot; } }
                  #             }
                  #         }
                  #     }
                  #
                  # To optimize computation, memory and network traffic, variables that
                  # repeat in the output multiple times can be stored once in a shared
                  # variable table and be referenced using the `var_table_index` field.  The
                  # variables stored in the shared table are nameless and are essentially
                  # a partition of the complete variable. To reconstruct the complete
                  # variable, merge the referencing variable with the referenced variable.
                  #
                  # When using the shared variable table, the following variables:
                  #
                  #     T x = { 3, 7 };
                  #     T* p = &amp;x;
                  #     T&amp; r = x;
                  #
                  #     { name: &quot;x&quot;, var_table_index: 3, type: &quot;T&quot; }  // Captured variables
                  #     { name: &quot;p&quot;, value &quot;0x00500500&quot;, type=&quot;T*&quot;, var_table_index: 3 }
                  #     { name: &quot;r&quot;, type=&quot;T&amp;&quot;, var_table_index: 3 }
                  #
                  #     {  // Shared variable table entry #3:
                  #         members { name: &quot;m1&quot;, value: &quot;3&quot;, type: &quot;int&quot; },
                  #         members { name: &quot;m2&quot;, value: &quot;7&quot;, type: &quot;int&quot; }
                  #     }
                  #
                  # Note that the pointer address is stored with the referencing variable
                  # and not with the referenced variable. This allows the referenced variable
                  # to be shared between pointers and references.
                  #
                  # The type field is optional. The debugger agent may or may not support it.
                &quot;members&quot;: [ # Members contained or pointed to by the variable.
                  # Object with schema name: Variable
                ],
                &quot;status&quot;: { # Represents a contextual status message. # Status associated with the variable. This field will usually stay
                    # unset. A status of a single variable only applies to that variable or
                    # expression. The rest of breakpoint data still remains valid. Variables
                    # might be reported in error state even when breakpoint is not in final
                    # state.
                    #
                    # The message may refer to variable name with `refers_to` set to
                    # `VARIABLE_NAME`. Alternatively `refers_to` will be set to `VARIABLE_VALUE`.
                    # In either case variable value and members will be unset.
                    #
                    # Example of error message applied to name: `Invalid expression syntax`.
                    #
                    # Example of information message applied to value: `Not captured`.
                    #
                    # Examples of error message applied to value:
                    #
                    # *   `Malformed string`,
                    # *   `Field f not found in class C`
                    # *   `Null pointer dereference`
                    # The message can indicate an error or informational status, and refer to
                    # specific parts of the containing object.
                    # For example, the `Breakpoint.status` field can indicate an error referring
                    # to the `BREAKPOINT_SOURCE_LOCATION` with the message `Location not found`.
                  &quot;isError&quot;: True or False, # Distinguishes errors from informational messages.
                  &quot;description&quot;: { # Represents a message with parameters. # Status message text.
                    &quot;format&quot;: &quot;A String&quot;, # Format template for the message. The `format` uses placeholders `$0`,
                        # `$1`, etc. to reference parameters. `$$` can be used to denote the `$`
                        # character.
                        #
                        # Examples:
                        #
                        # *   `Failed to load &#x27;$0&#x27; which helps debug $1 the first time it
                        #     is loaded.  Again, $0 is very important.`
                        # *   `Please pay $$10 to use $0 instead of $1.`
                    &quot;parameters&quot;: [ # Optional parameters to be embedded into the message.
                      &quot;A String&quot;,
                    ],
                  },
                  &quot;refersTo&quot;: &quot;A String&quot;, # Reference to which the message applies.
                },
                &quot;name&quot;: &quot;A String&quot;, # Name of the variable, if any.
                &quot;type&quot;: &quot;A String&quot;, # Variable type (e.g. `MyClass`). If the variable is split with
                    # `var_table_index`, `type` goes next to `value`. The interpretation of
                    # a type is agent specific. It is recommended to include the dynamic type
                    # rather than a static type of an object.
                &quot;value&quot;: &quot;A String&quot;, # Simple value of the variable.
                &quot;varTableIndex&quot;: 42, # Reference to a variable in the shared variable table. More than
                    # one variable can reference the same variable in the table. The
                    # `var_table_index` field is an index into `variable_table` in Breakpoint.
              },
            ],
            &quot;location&quot;: { # Represents a location in the source code. # Source location of the call site.
              &quot;path&quot;: &quot;A String&quot;, # Path to the source file within the source context of the target binary.
              &quot;column&quot;: 42, # Column within a line. The first column in a line as the value `1`.
                  # Agents that do not support setting breakpoints on specific columns ignore
                  # this field.
              &quot;line&quot;: 42, # Line inside the file. The first line in the file has the value `1`.
            },
            &quot;function&quot;: &quot;A String&quot;, # Demangled function name at the call site.
            &quot;arguments&quot;: [ # Set of arguments passed to this function.
                # Note that this might not be populated for all stack frames.
              { # Represents a variable or an argument possibly of a compound object type.
                  # Note how the following variables are represented:
                  #
                  # 1) A simple variable:
                  #
                  #     int x = 5
                  #
                  #     { name: &quot;x&quot;, value: &quot;5&quot;, type: &quot;int&quot; }  // Captured variable
                  #
                  # 2) A compound object:
                  #
                  #     struct T {
                  #         int m1;
                  #         int m2;
                  #     };
                  #     T x = { 3, 7 };
                  #
                  #     {  // Captured variable
                  #         name: &quot;x&quot;,
                  #         type: &quot;T&quot;,
                  #         members { name: &quot;m1&quot;, value: &quot;3&quot;, type: &quot;int&quot; },
                  #         members { name: &quot;m2&quot;, value: &quot;7&quot;, type: &quot;int&quot; }
                  #     }
                  #
                  # 3) A pointer where the pointee was captured:
                  #
                  #     T x = { 3, 7 };
                  #     T* p = &amp;x;
                  #
                  #     {   // Captured variable
                  #         name: &quot;p&quot;,
                  #         type: &quot;T*&quot;,
                  #         value: &quot;0x00500500&quot;,
                  #         members { name: &quot;m1&quot;, value: &quot;3&quot;, type: &quot;int&quot; },
                  #         members { name: &quot;m2&quot;, value: &quot;7&quot;, type: &quot;int&quot; }
                  #     }
                  #
                  # 4) A pointer where the pointee was not captured:
                  #
                  #     T* p = new T;
                  #
                  #     {   // Captured variable
                  #         name: &quot;p&quot;,
                  #         type: &quot;T*&quot;,
                  #         value: &quot;0x00400400&quot;
                  #         status { is_error: true, description { format: &quot;unavailable&quot; } }
                  #     }
                  #
                  # The status should describe the reason for the missing value,
                  # such as `&lt;optimized out&gt;`, `&lt;inaccessible&gt;`, `&lt;pointers limit reached&gt;`.
                  #
                  # Note that a null pointer should not have members.
                  #
                  # 5) An unnamed value:
                  #
                  #     int* p = new int(7);
                  #
                  #     {   // Captured variable
                  #         name: &quot;p&quot;,
                  #         value: &quot;0x00500500&quot;,
                  #         type: &quot;int*&quot;,
                  #         members { value: &quot;7&quot;, type: &quot;int&quot; } }
                  #
                  # 6) An unnamed pointer where the pointee was not captured:
                  #
                  #     int* p = new int(7);
                  #     int** pp = &amp;p;
                  #
                  #     {  // Captured variable
                  #         name: &quot;pp&quot;,
                  #         value: &quot;0x00500500&quot;,
                  #         type: &quot;int**&quot;,
                  #         members {
                  #             value: &quot;0x00400400&quot;,
                  #             type: &quot;int*&quot;
                  #             status {
                  #                 is_error: true,
                  #                 description: { format: &quot;unavailable&quot; } }
                  #             }
                  #         }
                  #     }
                  #
                  # To optimize computation, memory and network traffic, variables that
                  # repeat in the output multiple times can be stored once in a shared
                  # variable table and be referenced using the `var_table_index` field.  The
                  # variables stored in the shared table are nameless and are essentially
                  # a partition of the complete variable. To reconstruct the complete
                  # variable, merge the referencing variable with the referenced variable.
                  #
                  # When using the shared variable table, the following variables:
                  #
                  #     T x = { 3, 7 };
                  #     T* p = &amp;x;
                  #     T&amp; r = x;
                  #
                  #     { name: &quot;x&quot;, var_table_index: 3, type: &quot;T&quot; }  // Captured variables
                  #     { name: &quot;p&quot;, value &quot;0x00500500&quot;, type=&quot;T*&quot;, var_table_index: 3 }
                  #     { name: &quot;r&quot;, type=&quot;T&amp;&quot;, var_table_index: 3 }
                  #
                  #     {  // Shared variable table entry #3:
                  #         members { name: &quot;m1&quot;, value: &quot;3&quot;, type: &quot;int&quot; },
                  #         members { name: &quot;m2&quot;, value: &quot;7&quot;, type: &quot;int&quot; }
                  #     }
                  #
                  # Note that the pointer address is stored with the referencing variable
                  # and not with the referenced variable. This allows the referenced variable
                  # to be shared between pointers and references.
                  #
                  # The type field is optional. The debugger agent may or may not support it.
                &quot;members&quot;: [ # Members contained or pointed to by the variable.
                  # Object with schema name: Variable
                ],
                &quot;status&quot;: { # Represents a contextual status message. # Status associated with the variable. This field will usually stay
                    # unset. A status of a single variable only applies to that variable or
                    # expression. The rest of breakpoint data still remains valid. Variables
                    # might be reported in error state even when breakpoint is not in final
                    # state.
                    #
                    # The message may refer to variable name with `refers_to` set to
                    # `VARIABLE_NAME`. Alternatively `refers_to` will be set to `VARIABLE_VALUE`.
                    # In either case variable value and members will be unset.
                    #
                    # Example of error message applied to name: `Invalid expression syntax`.
                    #
                    # Example of information message applied to value: `Not captured`.
                    #
                    # Examples of error message applied to value:
                    #
                    # *   `Malformed string`,
                    # *   `Field f not found in class C`
                    # *   `Null pointer dereference`
                    # The message can indicate an error or informational status, and refer to
                    # specific parts of the containing object.
                    # For example, the `Breakpoint.status` field can indicate an error referring
                    # to the `BREAKPOINT_SOURCE_LOCATION` with the message `Location not found`.
                  &quot;isError&quot;: True or False, # Distinguishes errors from informational messages.
                  &quot;description&quot;: { # Represents a message with parameters. # Status message text.
                    &quot;format&quot;: &quot;A String&quot;, # Format template for the message. The `format` uses placeholders `$0`,
                        # `$1`, etc. to reference parameters. `$$` can be used to denote the `$`
                        # character.
                        #
                        # Examples:
                        #
                        # *   `Failed to load &#x27;$0&#x27; which helps debug $1 the first time it
                        #     is loaded.  Again, $0 is very important.`
                        # *   `Please pay $$10 to use $0 instead of $1.`
                    &quot;parameters&quot;: [ # Optional parameters to be embedded into the message.
                      &quot;A String&quot;,
                    ],
                  },
                  &quot;refersTo&quot;: &quot;A String&quot;, # Reference to which the message applies.
                },
                &quot;name&quot;: &quot;A String&quot;, # Name of the variable, if any.
                &quot;type&quot;: &quot;A String&quot;, # Variable type (e.g. `MyClass`). If the variable is split with
                    # `var_table_index`, `type` goes next to `value`. The interpretation of
                    # a type is agent specific. It is recommended to include the dynamic type
                    # rather than a static type of an object.
                &quot;value&quot;: &quot;A String&quot;, # Simple value of the variable.
                &quot;varTableIndex&quot;: 42, # Reference to a variable in the shared variable table. More than
                    # one variable can reference the same variable in the table. The
                    # `var_table_index` field is an index into `variable_table` in Breakpoint.
              },
            ],
          },
        ],
        &quot;condition&quot;: &quot;A String&quot;, # Condition that triggers the breakpoint.
            # The condition is a compound boolean expression composed using expressions
            # in a programming language at the source location.
        &quot;canaryExpireTime&quot;: &quot;A String&quot;, # The deadline for the breakpoint to stay in CANARY_ACTIVE state. The value
            # is meaningless when the breakpoint is not in CANARY_ACTIVE state.
        &quot;status&quot;: { # Represents a contextual status message. # Breakpoint status.
            #
            # The status includes an error flag and a human readable message.
            # This field is usually unset. The message can be either
            # informational or an error message. Regardless, clients should always
            # display the text message back to the user.
            #
            # Error status indicates complete failure of the breakpoint.
            #
            # Example (non-final state): `Still loading symbols...`
            #
            # Examples (final state):
            #
            # *   `Invalid line number` referring to location
            # *   `Field f not found in class C` referring to condition
            # The message can indicate an error or informational status, and refer to
            # specific parts of the containing object.
            # For example, the `Breakpoint.status` field can indicate an error referring
            # to the `BREAKPOINT_SOURCE_LOCATION` with the message `Location not found`.
          &quot;isError&quot;: True or False, # Distinguishes errors from informational messages.
          &quot;description&quot;: { # Represents a message with parameters. # Status message text.
            &quot;format&quot;: &quot;A String&quot;, # Format template for the message. The `format` uses placeholders `$0`,
                # `$1`, etc. to reference parameters. `$$` can be used to denote the `$`
                # character.
                #
                # Examples:
                #
                # *   `Failed to load &#x27;$0&#x27; which helps debug $1 the first time it
                #     is loaded.  Again, $0 is very important.`
                # *   `Please pay $$10 to use $0 instead of $1.`
            &quot;parameters&quot;: [ # Optional parameters to be embedded into the message.
              &quot;A String&quot;,
            ],
          },
          &quot;refersTo&quot;: &quot;A String&quot;, # Reference to which the message applies.
        },
        &quot;state&quot;: &quot;A String&quot;, # The current state of the breakpoint.
        &quot;userEmail&quot;: &quot;A String&quot;, # E-mail address of the user that created this breakpoint
        &quot;action&quot;: &quot;A String&quot;, # Action that the agent should perform when the code at the
            # breakpoint location is hit.
        &quot;logLevel&quot;: &quot;A String&quot;, # Indicates the severity of the log. Only relevant when action is `LOG`.
        &quot;id&quot;: &quot;A String&quot;, # Breakpoint identifier, unique in the scope of the debuggee.
        &quot;location&quot;: { # Represents a location in the source code. # Breakpoint source location.
          &quot;path&quot;: &quot;A String&quot;, # Path to the source file within the source context of the target binary.
          &quot;column&quot;: 42, # Column within a line. The first column in a line as the value `1`.
              # Agents that do not support setting breakpoints on specific columns ignore
              # this field.
          &quot;line&quot;: 42, # Line inside the file. The first line in the file has the value `1`.
        },
        &quot;finalTime&quot;: &quot;A String&quot;, # Time this breakpoint was finalized as seen by the server in seconds
            # resolution.
        &quot;variableTable&quot;: [ # The `variable_table` exists to aid with computation, memory and network
            # traffic optimization.  It enables storing a variable once and reference
            # it from multiple variables, including variables stored in the
            # `variable_table` itself.
            # For example, the same `this` object, which may appear at many levels of
            # the stack, can have all of its data stored once in this table.  The
            # stack frame variables then would hold only a reference to it.
            #
            # The variable `var_table_index` field is an index into this repeated field.
            # The stored objects are nameless and get their name from the referencing
            # variable. The effective variable is a merge of the referencing variable
            # and the referenced variable.
          { # Represents a variable or an argument possibly of a compound object type.
              # Note how the following variables are represented:
              #
              # 1) A simple variable:
              #
              #     int x = 5
              #
              #     { name: &quot;x&quot;, value: &quot;5&quot;, type: &quot;int&quot; }  // Captured variable
              #
              # 2) A compound object:
              #
              #     struct T {
              #         int m1;
              #         int m2;
              #     };
              #     T x = { 3, 7 };
              #
              #     {  // Captured variable
              #         name: &quot;x&quot;,
              #         type: &quot;T&quot;,
              #         members { name: &quot;m1&quot;, value: &quot;3&quot;, type: &quot;int&quot; },
              #         members { name: &quot;m2&quot;, value: &quot;7&quot;, type: &quot;int&quot; }
              #     }
              #
              # 3) A pointer where the pointee was captured:
              #
              #     T x = { 3, 7 };
              #     T* p = &amp;x;
              #
              #     {   // Captured variable
              #         name: &quot;p&quot;,
              #         type: &quot;T*&quot;,
              #         value: &quot;0x00500500&quot;,
              #         members { name: &quot;m1&quot;, value: &quot;3&quot;, type: &quot;int&quot; },
              #         members { name: &quot;m2&quot;, value: &quot;7&quot;, type: &quot;int&quot; }
              #     }
              #
              # 4) A pointer where the pointee was not captured:
              #
              #     T* p = new T;
              #
              #     {   // Captured variable
              #         name: &quot;p&quot;,
              #         type: &quot;T*&quot;,
              #         value: &quot;0x00400400&quot;
              #         status { is_error: true, description { format: &quot;unavailable&quot; } }
              #     }
              #
              # The status should describe the reason for the missing value,
              # such as `&lt;optimized out&gt;`, `&lt;inaccessible&gt;`, `&lt;pointers limit reached&gt;`.
              #
              # Note that a null pointer should not have members.
              #
              # 5) An unnamed value:
              #
              #     int* p = new int(7);
              #
              #     {   // Captured variable
              #         name: &quot;p&quot;,
              #         value: &quot;0x00500500&quot;,
              #         type: &quot;int*&quot;,
              #         members { value: &quot;7&quot;, type: &quot;int&quot; } }
              #
              # 6) An unnamed pointer where the pointee was not captured:
              #
              #     int* p = new int(7);
              #     int** pp = &amp;p;
              #
              #     {  // Captured variable
              #         name: &quot;pp&quot;,
              #         value: &quot;0x00500500&quot;,
              #         type: &quot;int**&quot;,
              #         members {
              #             value: &quot;0x00400400&quot;,
              #             type: &quot;int*&quot;
              #             status {
              #                 is_error: true,
              #                 description: { format: &quot;unavailable&quot; } }
              #             }
              #         }
              #     }
              #
              # To optimize computation, memory and network traffic, variables that
              # repeat in the output multiple times can be stored once in a shared
              # variable table and be referenced using the `var_table_index` field.  The
              # variables stored in the shared table are nameless and are essentially
              # a partition of the complete variable. To reconstruct the complete
              # variable, merge the referencing variable with the referenced variable.
              #
              # When using the shared variable table, the following variables:
              #
              #     T x = { 3, 7 };
              #     T* p = &amp;x;
              #     T&amp; r = x;
              #
              #     { name: &quot;x&quot;, var_table_index: 3, type: &quot;T&quot; }  // Captured variables
              #     { name: &quot;p&quot;, value &quot;0x00500500&quot;, type=&quot;T*&quot;, var_table_index: 3 }
              #     { name: &quot;r&quot;, type=&quot;T&amp;&quot;, var_table_index: 3 }
              #
              #     {  // Shared variable table entry #3:
              #         members { name: &quot;m1&quot;, value: &quot;3&quot;, type: &quot;int&quot; },
              #         members { name: &quot;m2&quot;, value: &quot;7&quot;, type: &quot;int&quot; }
              #     }
              #
              # Note that the pointer address is stored with the referencing variable
              # and not with the referenced variable. This allows the referenced variable
              # to be shared between pointers and references.
              #
              # The type field is optional. The debugger agent may or may not support it.
            &quot;members&quot;: [ # Members contained or pointed to by the variable.
              # Object with schema name: Variable
            ],
            &quot;status&quot;: { # Represents a contextual status message. # Status associated with the variable. This field will usually stay
                # unset. A status of a single variable only applies to that variable or
                # expression. The rest of breakpoint data still remains valid. Variables
                # might be reported in error state even when breakpoint is not in final
                # state.
                #
                # The message may refer to variable name with `refers_to` set to
                # `VARIABLE_NAME`. Alternatively `refers_to` will be set to `VARIABLE_VALUE`.
                # In either case variable value and members will be unset.
                #
                # Example of error message applied to name: `Invalid expression syntax`.
                #
                # Example of information message applied to value: `Not captured`.
                #
                # Examples of error message applied to value:
                #
                # *   `Malformed string`,
                # *   `Field f not found in class C`
                # *   `Null pointer dereference`
                # The message can indicate an error or informational status, and refer to
                # specific parts of the containing object.
                # For example, the `Breakpoint.status` field can indicate an error referring
                # to the `BREAKPOINT_SOURCE_LOCATION` with the message `Location not found`.
              &quot;isError&quot;: True or False, # Distinguishes errors from informational messages.
              &quot;description&quot;: { # Represents a message with parameters. # Status message text.
                &quot;format&quot;: &quot;A String&quot;, # Format template for the message. The `format` uses placeholders `$0`,
                    # `$1`, etc. to reference parameters. `$$` can be used to denote the `$`
                    # character.
                    #
                    # Examples:
                    #
                    # *   `Failed to load &#x27;$0&#x27; which helps debug $1 the first time it
                    #     is loaded.  Again, $0 is very important.`
                    # *   `Please pay $$10 to use $0 instead of $1.`
                &quot;parameters&quot;: [ # Optional parameters to be embedded into the message.
                  &quot;A String&quot;,
                ],
              },
              &quot;refersTo&quot;: &quot;A String&quot;, # Reference to which the message applies.
            },
            &quot;name&quot;: &quot;A String&quot;, # Name of the variable, if any.
            &quot;type&quot;: &quot;A String&quot;, # Variable type (e.g. `MyClass`). If the variable is split with
                # `var_table_index`, `type` goes next to `value`. The interpretation of
                # a type is agent specific. It is recommended to include the dynamic type
                # rather than a static type of an object.
            &quot;value&quot;: &quot;A String&quot;, # Simple value of the variable.
            &quot;varTableIndex&quot;: 42, # Reference to a variable in the shared variable table. More than
                # one variable can reference the same variable in the table. The
                # `var_table_index` field is an index into `variable_table` in Breakpoint.
          },
        ],
        &quot;createTime&quot;: &quot;A String&quot;, # Time this breakpoint was created by the server in seconds resolution.
        &quot;logMessageFormat&quot;: &quot;A String&quot;, # Only relevant when action is `LOG`. Defines the message to log when
            # the breakpoint hits. The message may include parameter placeholders `$0`,
            # `$1`, etc. These placeholders are replaced with the evaluated value
            # of the appropriate expression. Expressions not referenced in
            # `log_message_format` are not logged.
            #
            # Example: `Message received, id = $0, count = $1` with
            # `expressions` = `[ message.id, message.count ]`.
        &quot;labels&quot;: { # A set of custom breakpoint properties, populated by the agent, to be
            # displayed to the user.
          &quot;a_key&quot;: &quot;A String&quot;,
        },
      },
    ],
    &quot;waitExpired&quot;: True or False, # If set to `true`, indicates that there is no change to the
        # list of active breakpoints and the server-selected timeout has expired.
        # The `breakpoints` field would be empty and should be ignored.
    &quot;nextWaitToken&quot;: &quot;A String&quot;, # A token that can be used in the next method call to block until
        # the list of breakpoints changes.
  }</pre>
</div>

<div class="method">
    <code class="details" id="update">update(debuggeeId, id, body=None, x__xgafv=None)</code>
  <pre>Updates the breakpoint state or mutable fields.
The entire Breakpoint message must be sent back to the controller service.

Updates to active breakpoint fields are only allowed if the new value
does not change the breakpoint specification. Updates to the `location`,
`condition` and `expressions` fields should not alter the breakpoint
semantics. These may only make changes such as canonicalizing a value
or snapping the location to the correct line of code.

Args:
  debuggeeId: string, Required. Identifies the debuggee being debugged. (required)
  id: string, Breakpoint identifier, unique in the scope of the debuggee. (required)
  body: object, The request body.
    The object takes the form of:

{ # Request to update an active breakpoint.
    &quot;breakpoint&quot;: { # ------------------------------------------------------------------------------ # Required. Updated breakpoint information.
        # The field `id` must be set.
        # The agent must echo all Breakpoint specification fields in the update.
        # ## Breakpoint (the resource)
        #
        # Represents the breakpoint specification, status and results.
      &quot;expressions&quot;: [ # List of read-only expressions to evaluate at the breakpoint location.
          # The expressions are composed using expressions in the programming language
          # at the source location. If the breakpoint action is `LOG`, the evaluated
          # expressions are included in log statements.
        &quot;A String&quot;,
      ],
      &quot;evaluatedExpressions&quot;: [ # Values of evaluated expressions at breakpoint time.
          # The evaluated expressions appear in exactly the same order they
          # are listed in the `expressions` field.
          # The `name` field holds the original expression text, the `value` or
          # `members` field holds the result of the evaluated expression.
          # If the expression cannot be evaluated, the `status` inside the `Variable`
          # will indicate an error and contain the error text.
        { # Represents a variable or an argument possibly of a compound object type.
            # Note how the following variables are represented:
            #
            # 1) A simple variable:
            #
            #     int x = 5
            #
            #     { name: &quot;x&quot;, value: &quot;5&quot;, type: &quot;int&quot; }  // Captured variable
            #
            # 2) A compound object:
            #
            #     struct T {
            #         int m1;
            #         int m2;
            #     };
            #     T x = { 3, 7 };
            #
            #     {  // Captured variable
            #         name: &quot;x&quot;,
            #         type: &quot;T&quot;,
            #         members { name: &quot;m1&quot;, value: &quot;3&quot;, type: &quot;int&quot; },
            #         members { name: &quot;m2&quot;, value: &quot;7&quot;, type: &quot;int&quot; }
            #     }
            #
            # 3) A pointer where the pointee was captured:
            #
            #     T x = { 3, 7 };
            #     T* p = &amp;x;
            #
            #     {   // Captured variable
            #         name: &quot;p&quot;,
            #         type: &quot;T*&quot;,
            #         value: &quot;0x00500500&quot;,
            #         members { name: &quot;m1&quot;, value: &quot;3&quot;, type: &quot;int&quot; },
            #         members { name: &quot;m2&quot;, value: &quot;7&quot;, type: &quot;int&quot; }
            #     }
            #
            # 4) A pointer where the pointee was not captured:
            #
            #     T* p = new T;
            #
            #     {   // Captured variable
            #         name: &quot;p&quot;,
            #         type: &quot;T*&quot;,
            #         value: &quot;0x00400400&quot;
            #         status { is_error: true, description { format: &quot;unavailable&quot; } }
            #     }
            #
            # The status should describe the reason for the missing value,
            # such as `&lt;optimized out&gt;`, `&lt;inaccessible&gt;`, `&lt;pointers limit reached&gt;`.
            #
            # Note that a null pointer should not have members.
            #
            # 5) An unnamed value:
            #
            #     int* p = new int(7);
            #
            #     {   // Captured variable
            #         name: &quot;p&quot;,
            #         value: &quot;0x00500500&quot;,
            #         type: &quot;int*&quot;,
            #         members { value: &quot;7&quot;, type: &quot;int&quot; } }
            #
            # 6) An unnamed pointer where the pointee was not captured:
            #
            #     int* p = new int(7);
            #     int** pp = &amp;p;
            #
            #     {  // Captured variable
            #         name: &quot;pp&quot;,
            #         value: &quot;0x00500500&quot;,
            #         type: &quot;int**&quot;,
            #         members {
            #             value: &quot;0x00400400&quot;,
            #             type: &quot;int*&quot;
            #             status {
            #                 is_error: true,
            #                 description: { format: &quot;unavailable&quot; } }
            #             }
            #         }
            #     }
            #
            # To optimize computation, memory and network traffic, variables that
            # repeat in the output multiple times can be stored once in a shared
            # variable table and be referenced using the `var_table_index` field.  The
            # variables stored in the shared table are nameless and are essentially
            # a partition of the complete variable. To reconstruct the complete
            # variable, merge the referencing variable with the referenced variable.
            #
            # When using the shared variable table, the following variables:
            #
            #     T x = { 3, 7 };
            #     T* p = &amp;x;
            #     T&amp; r = x;
            #
            #     { name: &quot;x&quot;, var_table_index: 3, type: &quot;T&quot; }  // Captured variables
            #     { name: &quot;p&quot;, value &quot;0x00500500&quot;, type=&quot;T*&quot;, var_table_index: 3 }
            #     { name: &quot;r&quot;, type=&quot;T&amp;&quot;, var_table_index: 3 }
            #
            #     {  // Shared variable table entry #3:
            #         members { name: &quot;m1&quot;, value: &quot;3&quot;, type: &quot;int&quot; },
            #         members { name: &quot;m2&quot;, value: &quot;7&quot;, type: &quot;int&quot; }
            #     }
            #
            # Note that the pointer address is stored with the referencing variable
            # and not with the referenced variable. This allows the referenced variable
            # to be shared between pointers and references.
            #
            # The type field is optional. The debugger agent may or may not support it.
          &quot;members&quot;: [ # Members contained or pointed to by the variable.
            # Object with schema name: Variable
          ],
          &quot;status&quot;: { # Represents a contextual status message. # Status associated with the variable. This field will usually stay
              # unset. A status of a single variable only applies to that variable or
              # expression. The rest of breakpoint data still remains valid. Variables
              # might be reported in error state even when breakpoint is not in final
              # state.
              #
              # The message may refer to variable name with `refers_to` set to
              # `VARIABLE_NAME`. Alternatively `refers_to` will be set to `VARIABLE_VALUE`.
              # In either case variable value and members will be unset.
              #
              # Example of error message applied to name: `Invalid expression syntax`.
              #
              # Example of information message applied to value: `Not captured`.
              #
              # Examples of error message applied to value:
              #
              # *   `Malformed string`,
              # *   `Field f not found in class C`
              # *   `Null pointer dereference`
              # The message can indicate an error or informational status, and refer to
              # specific parts of the containing object.
              # For example, the `Breakpoint.status` field can indicate an error referring
              # to the `BREAKPOINT_SOURCE_LOCATION` with the message `Location not found`.
            &quot;isError&quot;: True or False, # Distinguishes errors from informational messages.
            &quot;description&quot;: { # Represents a message with parameters. # Status message text.
              &quot;format&quot;: &quot;A String&quot;, # Format template for the message. The `format` uses placeholders `$0`,
                  # `$1`, etc. to reference parameters. `$$` can be used to denote the `$`
                  # character.
                  #
                  # Examples:
                  #
                  # *   `Failed to load &#x27;$0&#x27; which helps debug $1 the first time it
                  #     is loaded.  Again, $0 is very important.`
                  # *   `Please pay $$10 to use $0 instead of $1.`
              &quot;parameters&quot;: [ # Optional parameters to be embedded into the message.
                &quot;A String&quot;,
              ],
            },
            &quot;refersTo&quot;: &quot;A String&quot;, # Reference to which the message applies.
          },
          &quot;name&quot;: &quot;A String&quot;, # Name of the variable, if any.
          &quot;type&quot;: &quot;A String&quot;, # Variable type (e.g. `MyClass`). If the variable is split with
              # `var_table_index`, `type` goes next to `value`. The interpretation of
              # a type is agent specific. It is recommended to include the dynamic type
              # rather than a static type of an object.
          &quot;value&quot;: &quot;A String&quot;, # Simple value of the variable.
          &quot;varTableIndex&quot;: 42, # Reference to a variable in the shared variable table. More than
              # one variable can reference the same variable in the table. The
              # `var_table_index` field is an index into `variable_table` in Breakpoint.
        },
      ],
      &quot;isFinalState&quot;: True or False, # When true, indicates that this is a final result and the
          # breakpoint state will not change from here on.
      &quot;stackFrames&quot;: [ # The stack at breakpoint time, where stack_frames[0] represents the most
          # recently entered function.
        { # Represents a stack frame context.
          &quot;locals&quot;: [ # Set of local variables at the stack frame location.
              # Note that this might not be populated for all stack frames.
            { # Represents a variable or an argument possibly of a compound object type.
                # Note how the following variables are represented:
                #
                # 1) A simple variable:
                #
                #     int x = 5
                #
                #     { name: &quot;x&quot;, value: &quot;5&quot;, type: &quot;int&quot; }  // Captured variable
                #
                # 2) A compound object:
                #
                #     struct T {
                #         int m1;
                #         int m2;
                #     };
                #     T x = { 3, 7 };
                #
                #     {  // Captured variable
                #         name: &quot;x&quot;,
                #         type: &quot;T&quot;,
                #         members { name: &quot;m1&quot;, value: &quot;3&quot;, type: &quot;int&quot; },
                #         members { name: &quot;m2&quot;, value: &quot;7&quot;, type: &quot;int&quot; }
                #     }
                #
                # 3) A pointer where the pointee was captured:
                #
                #     T x = { 3, 7 };
                #     T* p = &amp;x;
                #
                #     {   // Captured variable
                #         name: &quot;p&quot;,
                #         type: &quot;T*&quot;,
                #         value: &quot;0x00500500&quot;,
                #         members { name: &quot;m1&quot;, value: &quot;3&quot;, type: &quot;int&quot; },
                #         members { name: &quot;m2&quot;, value: &quot;7&quot;, type: &quot;int&quot; }
                #     }
                #
                # 4) A pointer where the pointee was not captured:
                #
                #     T* p = new T;
                #
                #     {   // Captured variable
                #         name: &quot;p&quot;,
                #         type: &quot;T*&quot;,
                #         value: &quot;0x00400400&quot;
                #         status { is_error: true, description { format: &quot;unavailable&quot; } }
                #     }
                #
                # The status should describe the reason for the missing value,
                # such as `&lt;optimized out&gt;`, `&lt;inaccessible&gt;`, `&lt;pointers limit reached&gt;`.
                #
                # Note that a null pointer should not have members.
                #
                # 5) An unnamed value:
                #
                #     int* p = new int(7);
                #
                #     {   // Captured variable
                #         name: &quot;p&quot;,
                #         value: &quot;0x00500500&quot;,
                #         type: &quot;int*&quot;,
                #         members { value: &quot;7&quot;, type: &quot;int&quot; } }
                #
                # 6) An unnamed pointer where the pointee was not captured:
                #
                #     int* p = new int(7);
                #     int** pp = &amp;p;
                #
                #     {  // Captured variable
                #         name: &quot;pp&quot;,
                #         value: &quot;0x00500500&quot;,
                #         type: &quot;int**&quot;,
                #         members {
                #             value: &quot;0x00400400&quot;,
                #             type: &quot;int*&quot;
                #             status {
                #                 is_error: true,
                #                 description: { format: &quot;unavailable&quot; } }
                #             }
                #         }
                #     }
                #
                # To optimize computation, memory and network traffic, variables that
                # repeat in the output multiple times can be stored once in a shared
                # variable table and be referenced using the `var_table_index` field.  The
                # variables stored in the shared table are nameless and are essentially
                # a partition of the complete variable. To reconstruct the complete
                # variable, merge the referencing variable with the referenced variable.
                #
                # When using the shared variable table, the following variables:
                #
                #     T x = { 3, 7 };
                #     T* p = &amp;x;
                #     T&amp; r = x;
                #
                #     { name: &quot;x&quot;, var_table_index: 3, type: &quot;T&quot; }  // Captured variables
                #     { name: &quot;p&quot;, value &quot;0x00500500&quot;, type=&quot;T*&quot;, var_table_index: 3 }
                #     { name: &quot;r&quot;, type=&quot;T&amp;&quot;, var_table_index: 3 }
                #
                #     {  // Shared variable table entry #3:
                #         members { name: &quot;m1&quot;, value: &quot;3&quot;, type: &quot;int&quot; },
                #         members { name: &quot;m2&quot;, value: &quot;7&quot;, type: &quot;int&quot; }
                #     }
                #
                # Note that the pointer address is stored with the referencing variable
                # and not with the referenced variable. This allows the referenced variable
                # to be shared between pointers and references.
                #
                # The type field is optional. The debugger agent may or may not support it.
              &quot;members&quot;: [ # Members contained or pointed to by the variable.
                # Object with schema name: Variable
              ],
              &quot;status&quot;: { # Represents a contextual status message. # Status associated with the variable. This field will usually stay
                  # unset. A status of a single variable only applies to that variable or
                  # expression. The rest of breakpoint data still remains valid. Variables
                  # might be reported in error state even when breakpoint is not in final
                  # state.
                  #
                  # The message may refer to variable name with `refers_to` set to
                  # `VARIABLE_NAME`. Alternatively `refers_to` will be set to `VARIABLE_VALUE`.
                  # In either case variable value and members will be unset.
                  #
                  # Example of error message applied to name: `Invalid expression syntax`.
                  #
                  # Example of information message applied to value: `Not captured`.
                  #
                  # Examples of error message applied to value:
                  #
                  # *   `Malformed string`,
                  # *   `Field f not found in class C`
                  # *   `Null pointer dereference`
                  # The message can indicate an error or informational status, and refer to
                  # specific parts of the containing object.
                  # For example, the `Breakpoint.status` field can indicate an error referring
                  # to the `BREAKPOINT_SOURCE_LOCATION` with the message `Location not found`.
                &quot;isError&quot;: True or False, # Distinguishes errors from informational messages.
                &quot;description&quot;: { # Represents a message with parameters. # Status message text.
                  &quot;format&quot;: &quot;A String&quot;, # Format template for the message. The `format` uses placeholders `$0`,
                      # `$1`, etc. to reference parameters. `$$` can be used to denote the `$`
                      # character.
                      #
                      # Examples:
                      #
                      # *   `Failed to load &#x27;$0&#x27; which helps debug $1 the first time it
                      #     is loaded.  Again, $0 is very important.`
                      # *   `Please pay $$10 to use $0 instead of $1.`
                  &quot;parameters&quot;: [ # Optional parameters to be embedded into the message.
                    &quot;A String&quot;,
                  ],
                },
                &quot;refersTo&quot;: &quot;A String&quot;, # Reference to which the message applies.
              },
              &quot;name&quot;: &quot;A String&quot;, # Name of the variable, if any.
              &quot;type&quot;: &quot;A String&quot;, # Variable type (e.g. `MyClass`). If the variable is split with
                  # `var_table_index`, `type` goes next to `value`. The interpretation of
                  # a type is agent specific. It is recommended to include the dynamic type
                  # rather than a static type of an object.
              &quot;value&quot;: &quot;A String&quot;, # Simple value of the variable.
              &quot;varTableIndex&quot;: 42, # Reference to a variable in the shared variable table. More than
                  # one variable can reference the same variable in the table. The
                  # `var_table_index` field is an index into `variable_table` in Breakpoint.
            },
          ],
          &quot;location&quot;: { # Represents a location in the source code. # Source location of the call site.
            &quot;path&quot;: &quot;A String&quot;, # Path to the source file within the source context of the target binary.
            &quot;column&quot;: 42, # Column within a line. The first column in a line as the value `1`.
                # Agents that do not support setting breakpoints on specific columns ignore
                # this field.
            &quot;line&quot;: 42, # Line inside the file. The first line in the file has the value `1`.
          },
          &quot;function&quot;: &quot;A String&quot;, # Demangled function name at the call site.
          &quot;arguments&quot;: [ # Set of arguments passed to this function.
              # Note that this might not be populated for all stack frames.
            { # Represents a variable or an argument possibly of a compound object type.
                # Note how the following variables are represented:
                #
                # 1) A simple variable:
                #
                #     int x = 5
                #
                #     { name: &quot;x&quot;, value: &quot;5&quot;, type: &quot;int&quot; }  // Captured variable
                #
                # 2) A compound object:
                #
                #     struct T {
                #         int m1;
                #         int m2;
                #     };
                #     T x = { 3, 7 };
                #
                #     {  // Captured variable
                #         name: &quot;x&quot;,
                #         type: &quot;T&quot;,
                #         members { name: &quot;m1&quot;, value: &quot;3&quot;, type: &quot;int&quot; },
                #         members { name: &quot;m2&quot;, value: &quot;7&quot;, type: &quot;int&quot; }
                #     }
                #
                # 3) A pointer where the pointee was captured:
                #
                #     T x = { 3, 7 };
                #     T* p = &amp;x;
                #
                #     {   // Captured variable
                #         name: &quot;p&quot;,
                #         type: &quot;T*&quot;,
                #         value: &quot;0x00500500&quot;,
                #         members { name: &quot;m1&quot;, value: &quot;3&quot;, type: &quot;int&quot; },
                #         members { name: &quot;m2&quot;, value: &quot;7&quot;, type: &quot;int&quot; }
                #     }
                #
                # 4) A pointer where the pointee was not captured:
                #
                #     T* p = new T;
                #
                #     {   // Captured variable
                #         name: &quot;p&quot;,
                #         type: &quot;T*&quot;,
                #         value: &quot;0x00400400&quot;
                #         status { is_error: true, description { format: &quot;unavailable&quot; } }
                #     }
                #
                # The status should describe the reason for the missing value,
                # such as `&lt;optimized out&gt;`, `&lt;inaccessible&gt;`, `&lt;pointers limit reached&gt;`.
                #
                # Note that a null pointer should not have members.
                #
                # 5) An unnamed value:
                #
                #     int* p = new int(7);
                #
                #     {   // Captured variable
                #         name: &quot;p&quot;,
                #         value: &quot;0x00500500&quot;,
                #         type: &quot;int*&quot;,
                #         members { value: &quot;7&quot;, type: &quot;int&quot; } }
                #
                # 6) An unnamed pointer where the pointee was not captured:
                #
                #     int* p = new int(7);
                #     int** pp = &amp;p;
                #
                #     {  // Captured variable
                #         name: &quot;pp&quot;,
                #         value: &quot;0x00500500&quot;,
                #         type: &quot;int**&quot;,
                #         members {
                #             value: &quot;0x00400400&quot;,
                #             type: &quot;int*&quot;
                #             status {
                #                 is_error: true,
                #                 description: { format: &quot;unavailable&quot; } }
                #             }
                #         }
                #     }
                #
                # To optimize computation, memory and network traffic, variables that
                # repeat in the output multiple times can be stored once in a shared
                # variable table and be referenced using the `var_table_index` field.  The
                # variables stored in the shared table are nameless and are essentially
                # a partition of the complete variable. To reconstruct the complete
                # variable, merge the referencing variable with the referenced variable.
                #
                # When using the shared variable table, the following variables:
                #
                #     T x = { 3, 7 };
                #     T* p = &amp;x;
                #     T&amp; r = x;
                #
                #     { name: &quot;x&quot;, var_table_index: 3, type: &quot;T&quot; }  // Captured variables
                #     { name: &quot;p&quot;, value &quot;0x00500500&quot;, type=&quot;T*&quot;, var_table_index: 3 }
                #     { name: &quot;r&quot;, type=&quot;T&amp;&quot;, var_table_index: 3 }
                #
                #     {  // Shared variable table entry #3:
                #         members { name: &quot;m1&quot;, value: &quot;3&quot;, type: &quot;int&quot; },
                #         members { name: &quot;m2&quot;, value: &quot;7&quot;, type: &quot;int&quot; }
                #     }
                #
                # Note that the pointer address is stored with the referencing variable
                # and not with the referenced variable. This allows the referenced variable
                # to be shared between pointers and references.
                #
                # The type field is optional. The debugger agent may or may not support it.
              &quot;members&quot;: [ # Members contained or pointed to by the variable.
                # Object with schema name: Variable
              ],
              &quot;status&quot;: { # Represents a contextual status message. # Status associated with the variable. This field will usually stay
                  # unset. A status of a single variable only applies to that variable or
                  # expression. The rest of breakpoint data still remains valid. Variables
                  # might be reported in error state even when breakpoint is not in final
                  # state.
                  #
                  # The message may refer to variable name with `refers_to` set to
                  # `VARIABLE_NAME`. Alternatively `refers_to` will be set to `VARIABLE_VALUE`.
                  # In either case variable value and members will be unset.
                  #
                  # Example of error message applied to name: `Invalid expression syntax`.
                  #
                  # Example of information message applied to value: `Not captured`.
                  #
                  # Examples of error message applied to value:
                  #
                  # *   `Malformed string`,
                  # *   `Field f not found in class C`
                  # *   `Null pointer dereference`
                  # The message can indicate an error or informational status, and refer to
                  # specific parts of the containing object.
                  # For example, the `Breakpoint.status` field can indicate an error referring
                  # to the `BREAKPOINT_SOURCE_LOCATION` with the message `Location not found`.
                &quot;isError&quot;: True or False, # Distinguishes errors from informational messages.
                &quot;description&quot;: { # Represents a message with parameters. # Status message text.
                  &quot;format&quot;: &quot;A String&quot;, # Format template for the message. The `format` uses placeholders `$0`,
                      # `$1`, etc. to reference parameters. `$$` can be used to denote the `$`
                      # character.
                      #
                      # Examples:
                      #
                      # *   `Failed to load &#x27;$0&#x27; which helps debug $1 the first time it
                      #     is loaded.  Again, $0 is very important.`
                      # *   `Please pay $$10 to use $0 instead of $1.`
                  &quot;parameters&quot;: [ # Optional parameters to be embedded into the message.
                    &quot;A String&quot;,
                  ],
                },
                &quot;refersTo&quot;: &quot;A String&quot;, # Reference to which the message applies.
              },
              &quot;name&quot;: &quot;A String&quot;, # Name of the variable, if any.
              &quot;type&quot;: &quot;A String&quot;, # Variable type (e.g. `MyClass`). If the variable is split with
                  # `var_table_index`, `type` goes next to `value`. The interpretation of
                  # a type is agent specific. It is recommended to include the dynamic type
                  # rather than a static type of an object.
              &quot;value&quot;: &quot;A String&quot;, # Simple value of the variable.
              &quot;varTableIndex&quot;: 42, # Reference to a variable in the shared variable table. More than
                  # one variable can reference the same variable in the table. The
                  # `var_table_index` field is an index into `variable_table` in Breakpoint.
            },
          ],
        },
      ],
      &quot;condition&quot;: &quot;A String&quot;, # Condition that triggers the breakpoint.
          # The condition is a compound boolean expression composed using expressions
          # in a programming language at the source location.
      &quot;canaryExpireTime&quot;: &quot;A String&quot;, # The deadline for the breakpoint to stay in CANARY_ACTIVE state. The value
          # is meaningless when the breakpoint is not in CANARY_ACTIVE state.
      &quot;status&quot;: { # Represents a contextual status message. # Breakpoint status.
          #
          # The status includes an error flag and a human readable message.
          # This field is usually unset. The message can be either
          # informational or an error message. Regardless, clients should always
          # display the text message back to the user.
          #
          # Error status indicates complete failure of the breakpoint.
          #
          # Example (non-final state): `Still loading symbols...`
          #
          # Examples (final state):
          #
          # *   `Invalid line number` referring to location
          # *   `Field f not found in class C` referring to condition
          # The message can indicate an error or informational status, and refer to
          # specific parts of the containing object.
          # For example, the `Breakpoint.status` field can indicate an error referring
          # to the `BREAKPOINT_SOURCE_LOCATION` with the message `Location not found`.
        &quot;isError&quot;: True or False, # Distinguishes errors from informational messages.
        &quot;description&quot;: { # Represents a message with parameters. # Status message text.
          &quot;format&quot;: &quot;A String&quot;, # Format template for the message. The `format` uses placeholders `$0`,
              # `$1`, etc. to reference parameters. `$$` can be used to denote the `$`
              # character.
              #
              # Examples:
              #
              # *   `Failed to load &#x27;$0&#x27; which helps debug $1 the first time it
              #     is loaded.  Again, $0 is very important.`
              # *   `Please pay $$10 to use $0 instead of $1.`
          &quot;parameters&quot;: [ # Optional parameters to be embedded into the message.
            &quot;A String&quot;,
          ],
        },
        &quot;refersTo&quot;: &quot;A String&quot;, # Reference to which the message applies.
      },
      &quot;state&quot;: &quot;A String&quot;, # The current state of the breakpoint.
      &quot;userEmail&quot;: &quot;A String&quot;, # E-mail address of the user that created this breakpoint
      &quot;action&quot;: &quot;A String&quot;, # Action that the agent should perform when the code at the
          # breakpoint location is hit.
      &quot;logLevel&quot;: &quot;A String&quot;, # Indicates the severity of the log. Only relevant when action is `LOG`.
      &quot;id&quot;: &quot;A String&quot;, # Breakpoint identifier, unique in the scope of the debuggee.
      &quot;location&quot;: { # Represents a location in the source code. # Breakpoint source location.
        &quot;path&quot;: &quot;A String&quot;, # Path to the source file within the source context of the target binary.
        &quot;column&quot;: 42, # Column within a line. The first column in a line as the value `1`.
            # Agents that do not support setting breakpoints on specific columns ignore
            # this field.
        &quot;line&quot;: 42, # Line inside the file. The first line in the file has the value `1`.
      },
      &quot;finalTime&quot;: &quot;A String&quot;, # Time this breakpoint was finalized as seen by the server in seconds
          # resolution.
      &quot;variableTable&quot;: [ # The `variable_table` exists to aid with computation, memory and network
          # traffic optimization.  It enables storing a variable once and reference
          # it from multiple variables, including variables stored in the
          # `variable_table` itself.
          # For example, the same `this` object, which may appear at many levels of
          # the stack, can have all of its data stored once in this table.  The
          # stack frame variables then would hold only a reference to it.
          #
          # The variable `var_table_index` field is an index into this repeated field.
          # The stored objects are nameless and get their name from the referencing
          # variable. The effective variable is a merge of the referencing variable
          # and the referenced variable.
        { # Represents a variable or an argument possibly of a compound object type.
            # Note how the following variables are represented:
            #
            # 1) A simple variable:
            #
            #     int x = 5
            #
            #     { name: &quot;x&quot;, value: &quot;5&quot;, type: &quot;int&quot; }  // Captured variable
            #
            # 2) A compound object:
            #
            #     struct T {
            #         int m1;
            #         int m2;
            #     };
            #     T x = { 3, 7 };
            #
            #     {  // Captured variable
            #         name: &quot;x&quot;,
            #         type: &quot;T&quot;,
            #         members { name: &quot;m1&quot;, value: &quot;3&quot;, type: &quot;int&quot; },
            #         members { name: &quot;m2&quot;, value: &quot;7&quot;, type: &quot;int&quot; }
            #     }
            #
            # 3) A pointer where the pointee was captured:
            #
            #     T x = { 3, 7 };
            #     T* p = &amp;x;
            #
            #     {   // Captured variable
            #         name: &quot;p&quot;,
            #         type: &quot;T*&quot;,
            #         value: &quot;0x00500500&quot;,
            #         members { name: &quot;m1&quot;, value: &quot;3&quot;, type: &quot;int&quot; },
            #         members { name: &quot;m2&quot;, value: &quot;7&quot;, type: &quot;int&quot; }
            #     }
            #
            # 4) A pointer where the pointee was not captured:
            #
            #     T* p = new T;
            #
            #     {   // Captured variable
            #         name: &quot;p&quot;,
            #         type: &quot;T*&quot;,
            #         value: &quot;0x00400400&quot;
            #         status { is_error: true, description { format: &quot;unavailable&quot; } }
            #     }
            #
            # The status should describe the reason for the missing value,
            # such as `&lt;optimized out&gt;`, `&lt;inaccessible&gt;`, `&lt;pointers limit reached&gt;`.
            #
            # Note that a null pointer should not have members.
            #
            # 5) An unnamed value:
            #
            #     int* p = new int(7);
            #
            #     {   // Captured variable
            #         name: &quot;p&quot;,
            #         value: &quot;0x00500500&quot;,
            #         type: &quot;int*&quot;,
            #         members { value: &quot;7&quot;, type: &quot;int&quot; } }
            #
            # 6) An unnamed pointer where the pointee was not captured:
            #
            #     int* p = new int(7);
            #     int** pp = &amp;p;
            #
            #     {  // Captured variable
            #         name: &quot;pp&quot;,
            #         value: &quot;0x00500500&quot;,
            #         type: &quot;int**&quot;,
            #         members {
            #             value: &quot;0x00400400&quot;,
            #             type: &quot;int*&quot;
            #             status {
            #                 is_error: true,
            #                 description: { format: &quot;unavailable&quot; } }
            #             }
            #         }
            #     }
            #
            # To optimize computation, memory and network traffic, variables that
            # repeat in the output multiple times can be stored once in a shared
            # variable table and be referenced using the `var_table_index` field.  The
            # variables stored in the shared table are nameless and are essentially
            # a partition of the complete variable. To reconstruct the complete
            # variable, merge the referencing variable with the referenced variable.
            #
            # When using the shared variable table, the following variables:
            #
            #     T x = { 3, 7 };
            #     T* p = &amp;x;
            #     T&amp; r = x;
            #
            #     { name: &quot;x&quot;, var_table_index: 3, type: &quot;T&quot; }  // Captured variables
            #     { name: &quot;p&quot;, value &quot;0x00500500&quot;, type=&quot;T*&quot;, var_table_index: 3 }
            #     { name: &quot;r&quot;, type=&quot;T&amp;&quot;, var_table_index: 3 }
            #
            #     {  // Shared variable table entry #3:
            #         members { name: &quot;m1&quot;, value: &quot;3&quot;, type: &quot;int&quot; },
            #         members { name: &quot;m2&quot;, value: &quot;7&quot;, type: &quot;int&quot; }
            #     }
            #
            # Note that the pointer address is stored with the referencing variable
            # and not with the referenced variable. This allows the referenced variable
            # to be shared between pointers and references.
            #
            # The type field is optional. The debugger agent may or may not support it.
          &quot;members&quot;: [ # Members contained or pointed to by the variable.
            # Object with schema name: Variable
          ],
          &quot;status&quot;: { # Represents a contextual status message. # Status associated with the variable. This field will usually stay
              # unset. A status of a single variable only applies to that variable or
              # expression. The rest of breakpoint data still remains valid. Variables
              # might be reported in error state even when breakpoint is not in final
              # state.
              #
              # The message may refer to variable name with `refers_to` set to
              # `VARIABLE_NAME`. Alternatively `refers_to` will be set to `VARIABLE_VALUE`.
              # In either case variable value and members will be unset.
              #
              # Example of error message applied to name: `Invalid expression syntax`.
              #
              # Example of information message applied to value: `Not captured`.
              #
              # Examples of error message applied to value:
              #
              # *   `Malformed string`,
              # *   `Field f not found in class C`
              # *   `Null pointer dereference`
              # The message can indicate an error or informational status, and refer to
              # specific parts of the containing object.
              # For example, the `Breakpoint.status` field can indicate an error referring
              # to the `BREAKPOINT_SOURCE_LOCATION` with the message `Location not found`.
            &quot;isError&quot;: True or False, # Distinguishes errors from informational messages.
            &quot;description&quot;: { # Represents a message with parameters. # Status message text.
              &quot;format&quot;: &quot;A String&quot;, # Format template for the message. The `format` uses placeholders `$0`,
                  # `$1`, etc. to reference parameters. `$$` can be used to denote the `$`
                  # character.
                  #
                  # Examples:
                  #
                  # *   `Failed to load &#x27;$0&#x27; which helps debug $1 the first time it
                  #     is loaded.  Again, $0 is very important.`
                  # *   `Please pay $$10 to use $0 instead of $1.`
              &quot;parameters&quot;: [ # Optional parameters to be embedded into the message.
                &quot;A String&quot;,
              ],
            },
            &quot;refersTo&quot;: &quot;A String&quot;, # Reference to which the message applies.
          },
          &quot;name&quot;: &quot;A String&quot;, # Name of the variable, if any.
          &quot;type&quot;: &quot;A String&quot;, # Variable type (e.g. `MyClass`). If the variable is split with
              # `var_table_index`, `type` goes next to `value`. The interpretation of
              # a type is agent specific. It is recommended to include the dynamic type
              # rather than a static type of an object.
          &quot;value&quot;: &quot;A String&quot;, # Simple value of the variable.
          &quot;varTableIndex&quot;: 42, # Reference to a variable in the shared variable table. More than
              # one variable can reference the same variable in the table. The
              # `var_table_index` field is an index into `variable_table` in Breakpoint.
        },
      ],
      &quot;createTime&quot;: &quot;A String&quot;, # Time this breakpoint was created by the server in seconds resolution.
      &quot;logMessageFormat&quot;: &quot;A String&quot;, # Only relevant when action is `LOG`. Defines the message to log when
          # the breakpoint hits. The message may include parameter placeholders `$0`,
          # `$1`, etc. These placeholders are replaced with the evaluated value
          # of the appropriate expression. Expressions not referenced in
          # `log_message_format` are not logged.
          #
          # Example: `Message received, id = $0, count = $1` with
          # `expressions` = `[ message.id, message.count ]`.
      &quot;labels&quot;: { # A set of custom breakpoint properties, populated by the agent, to be
          # displayed to the user.
        &quot;a_key&quot;: &quot;A String&quot;,
      },
    },
  }

  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # Response for updating an active breakpoint.
      # The message is defined to allow future extensions.
  }</pre>
</div>

</body></html>