[lldb-dev] Watching the current frame locals

jingham at apple.com jingham at apple.com
Tue Apr 8 11:04:05 PDT 2014


That is what the Summary is for.  The Summary, if it exists, is the preferred "interpreted" presentation of the data held by the SBValue.  So for a char *, the Value is the pointer value, but the Summary is the c-string contents.

Jim

On Apr 8, 2014, at 10:57 AM, Eran Ifrah <eran.ifrah at gmail.com> wrote:

> Hello Enrico / All,
> 
> I debugged it and it seems like a bug in my code.
> To get the frame locals (function args and locals) I was using this call:
> 
> frame.GetBlock().GetVariables()
> 
> While I should have simply call to frame.GetVariables()
> Which fixes the problem.
> 
> However, I am facing another issue:
> It seems like the function "const char* SBValue::GetValue()" returns the pointer address as string instead of the actual content
> 
> Any quick way to get the data as an actual c-str?
> 
> For example:
> 
> int main(int argc, char** argv) {
> return 0;
> }
> 
> My lldb UI for the "locals" view looks like this (best viewed in monospace font ;)) :
>  
> --------------------------------------------------------------------------------
> name             | type          | value
> --------------------------------------------------------------------------------
> argc             | int           | 1
> argv             | const char**  | 0xfffffab123 (some random address)
>    |             |               | 
>    +-*argv       | const char*   | 0xfffffab124 (some other address)
>         |        |               |
>         +- **argv| char          | '/'
> 
> In the code, I can identify that *argv is of type lldb::eBasicType*Char, however, I can't find a way to extract the string itself (it should be "/home/eran/test/TestLLDB")
> 
> Any hints?
> 
> Thanks!
> 
> 
> 
> 
> On Mon, Apr 7, 2014 at 5:31 AM, Eran Ifrah <eran.ifrah at gmail.com> wrote:
> Thanks, will debug this and see where it fails
> 
> Eran
> 
> 
> On Mon, Apr 7, 2014 at 1:43 AM, Enrico Granata <egranata at apple.com> wrote:
> Yeah the const char* definitely should have a value.
> I am guessing the variable is in scope all right. Does it have a summary if you ask for that?
> Does the same API call work if you stop directly within LLDB and use the Python API?
> More context (e.g. a repro case) would also help - or maybe if you can step through the LLDB code and see where we fail. If these are just frame locals I expect the relevant code to be in ValueObject.cpp GetValueAsCString
> 
> Sent from the iPhone of
> Enrico Granata <egranata@🍎.com>
> 
> On Apr 6, 2014, at 12:26 PM, Eran Ifrah <eran.ifrah at gmail.com> wrote:
> 
>> One of the local variables was 'const char*' so I would expect it to have a value and others were of type of 'wxString'
>> In the UI I expanded all the way to the _M_data which is of type 'wchar_t*' - and still nothing
>> 
>> Eran
>> 
>> 
>> 
>> On Sun, Apr 6, 2014 at 9:13 PM, Enrico Granata <egranata at apple.com> wrote:
>> What is the data type of your variables?
>> 
>> If they are aggregate types (structs, classes, ...) they won't have a value.
>> 
>> Only basic types (int, float, char, ..., you get the idea - and pointers) have a value.
>> 
>> For other types, they might have a summary, or they might have children, but definitely no value.
>> 
>> Sent from the iPhone of
>> Enrico Granata <egranata@🍎.com>
>> 
>> On Apr 6, 2014, at 7:02 AM, Eran Ifrah <eran.ifrah at gmail.com> wrote:
>> 
>>> Hello all,
>>> 
>>> I am at a phase where I want to display the current frame local variables whenever the debugger "stops"
>>> I was able to get a list of the selected frame's variables in the following manner:
>>> 
>>> lldb::SBFrame frame = m_target.GetProcess().GetSelectedThread().GetSelectedFrame();
>>> ...
>>> lldb::SBValueList args = frame.GetBlock().GetVariables(m_target, true, true, false);
>>> for(size_t i=0; i<args.GetSize(); ++i) {
>>>         lldb::SBValue value = args.GetValueAtIndex(i);
>>>         if ( value.IsValid() ) {
>>>             LLDBLocalVariable::Ptr_t var( new LLDBLocalVariable(value) );
>>>             locals.push_back( var );
>>>         }
>>> }
>>> 
>>> Now, LLDBLocalVariable is a thin wrapper class for UI purposes.
>>> What it does is basically copies values from lldb::SBValue:
>>> 
>>> LLDBLocalVariable::LLDBLocalVariable(lldb::SBValue value) {
>>>     SetName( value.GetName() );
>>>     SetType( value.GetTypeName() );
>>>     SetValue( value.GetValue() ); // always returns null
>>>     ... // code that handles children of value
>>> }
>>> 
>>> value.GetName() and value.GetTypeName() are working as expected (i.e. I get the correct type name and its name)
>>> However, I can't get the value as "string". I was naive enough to think that const char* SBValue::GetValue() will do the trick... but this always returns NULL.
>>> 
>>> Any suggestions on what am I doing wrong? an example on how to extract the variable's value in string format will be really appreciated
>>> 
>>> Thanks,
>>> 
>>> P.S.
>>> This is Linux 13.10 / 64 bit
>>> Self compiled lldb
>>> 
>>> -- 
>>> Eran Ifrah
>>> Author of codelite, a cross platform open source C/C++ IDE: http://www.codelite.org
>>> wxCrafter, a wxWidgets RAD: http://wxcrafter.codelite.org
>>> _______________________________________________
>>> lldb-dev mailing list
>>> lldb-dev at cs.uiuc.edu
>>> http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev
>> 
>> 
>> 
>> -- 
>> Eran Ifrah
>> Author of codelite, a cross platform open source C/C++ IDE: http://www.codelite.org
>> wxCrafter, a wxWidgets RAD: http://wxcrafter.codelite.org
> 
> 
> 
> -- 
> Eran Ifrah
> Author of codelite, a cross platform open source C/C++ IDE: http://www.codelite.org
> wxCrafter, a wxWidgets RAD: http://wxcrafter.codelite.org
> 
> 
> 
> -- 
> Eran Ifrah
> Author of codelite, a cross platform open source C/C++ IDE: http://www.codelite.org
> wxCrafter, a wxWidgets RAD: http://wxcrafter.codelite.org
> _______________________________________________
> lldb-dev mailing list
> lldb-dev at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev





More information about the lldb-dev mailing list