When generating a `display_value` for a variable the current approach
calls `SBValue::GetValue()` and `SBValue::GetSummary()` to generate a
`display_value` for the `SBValue`. However, there are cases where both
of these return an empty string and the fallback is to print a pointer
and type name instead (e.g. `FooBarType @ 0x00321`).
For swift types, lldb includes a langauge runtime plugin that can
generate a description of the object but this is only used with
`SBValue::GetDescription()`.
For example:
```
$ lldb swift-binary
... stop at breakpoint ...
lldb> script
>>> event = lldb.frame.GetValueForVariablePath("event")
>>> print("Value", event.GetValue())
Value None
>>> print("Summary", event.GetSummary())
Summary None
>>> print("Description", event) # __str__ calls SBValue::GetDescription()
Description (main.Event) event = (name = "Greetings", time = 2024-01-04 23:38:06 UTC)
```
With this change, if GetValue and GetSummary return empty then we try
`SBValue::GetDescription()` as a fallback before using the previous
logic of printing `<type> @ <addr>`.
37 lines
798 B
C++
37 lines
798 B
C++
|
|
#define BUFFER_SIZE 16
|
|
struct PointType {
|
|
int x;
|
|
int y;
|
|
int buffer[BUFFER_SIZE];
|
|
};
|
|
#include <vector>
|
|
int g_global = 123;
|
|
static int s_global = 234;
|
|
int test_indexedVariables();
|
|
int main(int argc, char const *argv[]) {
|
|
static float s_local = 2.25;
|
|
PointType pt = {11, 22, {0}};
|
|
for (int i = 0; i < BUFFER_SIZE; ++i)
|
|
pt.buffer[i] = i;
|
|
int x = s_global - g_global - pt.y; // breakpoint 1
|
|
{
|
|
int x = 42;
|
|
{
|
|
int x = 72;
|
|
s_global = x; // breakpoint 2
|
|
}
|
|
}
|
|
return test_indexedVariables(); // breakpoint 3
|
|
}
|
|
|
|
int test_indexedVariables() {
|
|
int small_array[5] = {1, 2, 3, 4, 5};
|
|
int large_array[200];
|
|
std::vector<int> small_vector;
|
|
std::vector<int> large_vector;
|
|
small_vector.assign(5, 0);
|
|
large_vector.assign(200, 0);
|
|
return 0; // breakpoint 4
|
|
}
|