I would like to view an array of elements pointed to by a pointer. In GDB this can be done by treating the pointed memory as an artificial array of a given length using the operator '@' as
*pointer @ length
where length
is the number of elements I want to view.
The above syntax does not work in LLDB supplied with Xcode 4.1.
Is there any way how to accomplish the above in LLDB?
Starting with the lldb in Xcode 8.0, there is a new built-in parray command. So you can say:
to print the memory pointed to by the result of the
EXPRESSION
as an array ofCOUNT
elements of the type pointed to by the expression.If the count is stored in a variable available in the current frame, then remember you can do:
That's a general lldb feature, any command-line argument in lldb surrounded in backticks gets evaluated as an expression that returns an integer, and then the integer gets substituted for the argument before command execution.
I tried to add a comment but that wasn't great for posting a full answer so I made my own answer. This solves the problem with getting "No Value". You need to get the current frame as I believe lldb.frame is set at module import time so it doesn't have the current frame when you stop at a breakpoint if you load the module from .lldbinit. The other version would work if you import or reloaded the script when you stopped at the breakpoint. The version below should always work.
Actually there is a simple way to do it, by casting the pointer to a pointer-to-array.
For example, if you have a
int* ptr
, and you want to view it as an array of ten integers, you can doBecause it relies only on standard C features, this method works without any plugins or special settings. It likewise works with other debuggers like GDB or CDB, even though they also have specialized syntaxes for printing arrays.
It doesn't seem to be supported yet.
You could use the memory read function (memory read / x), like
to print a float ten times from that pointer. This should be the same functionality as gdb's @.
Starting with Martin R answer I improved it as follow:
If the pointer is not a simple variable, e.g.:
Then "parray a.at 5" fails.
I fixed this by replacing "FindVariable" with "GetValueForVariablePath".
Now what if the elements in your array are aggregates, e.g.:
Then "parray a.at 5" prints: a.at->x, a.at->y, a.at[2], a.at[3], a.at[4] because GetChildAtIndex() returns members of aggregates.
I fixed this by resolving "a.at" + "[" + str(i) + "]" inside the loop instead of resolving "a.at" and then retrieving its children.
Added an optional "first" argument (Usage: parray [FIRST] COUNT), which is useful when you have a huge number of elements.
Made it do the "command script add -f parray.parray parray" at init
Here is my modified version:
With Xcode 4.5.1 (which may or may not help you now), you can do this in the lldb console:
This example assumes that 'pointer' is an array of 64 floats:
float pointer[64];