SBFrame.cpp revision 269024
1//===-- SBFrame.cpp ---------------------------------------------*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "lldb/API/SBFrame.h"
11
12#include <string>
13#include <algorithm>
14
15#include "lldb/lldb-types.h"
16
17#include "lldb/Core/Address.h"
18#include "lldb/Core/ConstString.h"
19#include "lldb/Core/Log.h"
20#include "lldb/Core/Stream.h"
21#include "lldb/Core/StreamFile.h"
22#include "lldb/Core/ValueObjectRegister.h"
23#include "lldb/Core/ValueObjectVariable.h"
24#include "lldb/Expression/ClangUserExpression.h"
25#include "lldb/Host/Host.h"
26#include "lldb/Symbol/Block.h"
27#include "lldb/Symbol/Function.h"
28#include "lldb/Symbol/Symbol.h"
29#include "lldb/Symbol/SymbolContext.h"
30#include "lldb/Symbol/VariableList.h"
31#include "lldb/Symbol/Variable.h"
32#include "lldb/Target/ExecutionContext.h"
33#include "lldb/Target/Target.h"
34#include "lldb/Target/Process.h"
35#include "lldb/Target/RegisterContext.h"
36#include "lldb/Target/StackFrame.h"
37#include "lldb/Target/StackID.h"
38#include "lldb/Target/Thread.h"
39
40#include "lldb/API/SBDebugger.h"
41#include "lldb/API/SBValue.h"
42#include "lldb/API/SBAddress.h"
43#include "lldb/API/SBExpressionOptions.h"
44#include "lldb/API/SBStream.h"
45#include "lldb/API/SBSymbolContext.h"
46#include "lldb/API/SBThread.h"
47
48using namespace lldb;
49using namespace lldb_private;
50
51
52SBFrame::SBFrame () :
53    m_opaque_sp (new ExecutionContextRef())
54{
55}
56
57SBFrame::SBFrame (const StackFrameSP &lldb_object_sp) :
58    m_opaque_sp (new ExecutionContextRef (lldb_object_sp))
59{
60    Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
61
62    if (log)
63    {
64        SBStream sstr;
65        GetDescription (sstr);
66        log->Printf ("SBFrame::SBFrame (sp=%p) => SBFrame(%p): %s",
67                     lldb_object_sp.get(), lldb_object_sp.get(), sstr.GetData());
68
69    }
70}
71
72SBFrame::SBFrame(const SBFrame &rhs) :
73    m_opaque_sp (new ExecutionContextRef (*rhs.m_opaque_sp))
74{
75}
76
77const SBFrame &
78SBFrame::operator = (const SBFrame &rhs)
79{
80    if (this != &rhs)
81        *m_opaque_sp = *rhs.m_opaque_sp;
82    return *this;
83}
84
85SBFrame::~SBFrame()
86{
87}
88
89StackFrameSP
90SBFrame::GetFrameSP() const
91{
92    if (m_opaque_sp)
93        return m_opaque_sp->GetFrameSP();
94    return StackFrameSP();
95}
96
97void
98SBFrame::SetFrameSP (const StackFrameSP &lldb_object_sp)
99{
100    return m_opaque_sp->SetFrameSP(lldb_object_sp);
101}
102
103bool
104SBFrame::IsValid() const
105{
106    return GetFrameSP().get() != NULL;
107}
108
109SBSymbolContext
110SBFrame::GetSymbolContext (uint32_t resolve_scope) const
111{
112    Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
113    SBSymbolContext sb_sym_ctx;
114    Mutex::Locker api_locker;
115    ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
116
117    StackFrame *frame = NULL;
118    Target *target = exe_ctx.GetTargetPtr();
119    Process *process = exe_ctx.GetProcessPtr();
120    if (target && process)
121    {
122        Process::StopLocker stop_locker;
123        if (stop_locker.TryLock(&process->GetRunLock()))
124        {
125            frame = exe_ctx.GetFramePtr();
126            if (frame)
127            {
128                sb_sym_ctx.SetSymbolContext(&frame->GetSymbolContext (resolve_scope));
129            }
130            else
131            {
132                if (log)
133                    log->Printf ("SBFrame::GetVariables () => error: could not reconstruct frame object for this SBFrame.");
134            }
135        }
136        else
137        {
138            if (log)
139                log->Printf ("SBFrame::GetSymbolContext () => error: process is running");
140        }
141    }
142
143    if (log)
144        log->Printf ("SBFrame(%p)::GetSymbolContext (resolve_scope=0x%8.8x) => SBSymbolContext(%p)",
145                     frame, resolve_scope, sb_sym_ctx.get());
146
147    return sb_sym_ctx;
148}
149
150SBModule
151SBFrame::GetModule () const
152{
153    Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
154    SBModule sb_module;
155    ModuleSP module_sp;
156    Mutex::Locker api_locker;
157    ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
158
159    StackFrame *frame = NULL;
160    Target *target = exe_ctx.GetTargetPtr();
161    Process *process = exe_ctx.GetProcessPtr();
162    if (target && process)
163    {
164        Process::StopLocker stop_locker;
165        if (stop_locker.TryLock(&process->GetRunLock()))
166        {
167            frame = exe_ctx.GetFramePtr();
168            if (frame)
169            {
170                module_sp = frame->GetSymbolContext (eSymbolContextModule).module_sp;
171                sb_module.SetSP (module_sp);
172            }
173            else
174            {
175                if (log)
176                    log->Printf ("SBFrame::GetModule () => error: could not reconstruct frame object for this SBFrame.");
177            }
178        }
179        else
180        {
181            if (log)
182                log->Printf ("SBFrame::GetModule () => error: process is running");
183        }
184    }
185
186    if (log)
187        log->Printf ("SBFrame(%p)::GetModule () => SBModule(%p)",
188                     frame, module_sp.get());
189
190    return sb_module;
191}
192
193SBCompileUnit
194SBFrame::GetCompileUnit () const
195{
196    Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
197    SBCompileUnit sb_comp_unit;
198    Mutex::Locker api_locker;
199    ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
200
201    StackFrame *frame = NULL;
202    Target *target = exe_ctx.GetTargetPtr();
203    Process *process = exe_ctx.GetProcessPtr();
204    if (target && process)
205    {
206        Process::StopLocker stop_locker;
207        if (stop_locker.TryLock(&process->GetRunLock()))
208        {
209            frame = exe_ctx.GetFramePtr();
210            if (frame)
211            {
212                sb_comp_unit.reset (frame->GetSymbolContext (eSymbolContextCompUnit).comp_unit);
213            }
214            else
215            {
216                if (log)
217                    log->Printf ("SBFrame::GetCompileUnit () => error: could not reconstruct frame object for this SBFrame.");
218            }
219        }
220        else
221        {
222            if (log)
223                log->Printf ("SBFrame::GetCompileUnit () => error: process is running");
224        }
225    }
226    if (log)
227        log->Printf ("SBFrame(%p)::GetCompileUnit () => SBCompileUnit(%p)",
228                     frame, sb_comp_unit.get());
229
230    return sb_comp_unit;
231}
232
233SBFunction
234SBFrame::GetFunction () const
235{
236    Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
237    SBFunction sb_function;
238    Mutex::Locker api_locker;
239    ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
240
241    StackFrame *frame = NULL;
242    Target *target = exe_ctx.GetTargetPtr();
243    Process *process = exe_ctx.GetProcessPtr();
244    if (target && process)
245    {
246        Process::StopLocker stop_locker;
247        if (stop_locker.TryLock(&process->GetRunLock()))
248        {
249            frame = exe_ctx.GetFramePtr();
250            if (frame)
251            {
252                sb_function.reset(frame->GetSymbolContext (eSymbolContextFunction).function);
253            }
254            else
255            {
256                if (log)
257                    log->Printf ("SBFrame::GetFunction () => error: could not reconstruct frame object for this SBFrame.");
258            }
259        }
260        else
261        {
262            if (log)
263                log->Printf ("SBFrame::GetFunction () => error: process is running");
264        }
265    }
266    if (log)
267        log->Printf ("SBFrame(%p)::GetFunction () => SBFunction(%p)",
268                     frame, sb_function.get());
269
270    return sb_function;
271}
272
273SBSymbol
274SBFrame::GetSymbol () const
275{
276    Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
277    SBSymbol sb_symbol;
278    Mutex::Locker api_locker;
279    ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
280
281    StackFrame *frame = NULL;
282    Target *target = exe_ctx.GetTargetPtr();
283    Process *process = exe_ctx.GetProcessPtr();
284    if (target && process)
285    {
286        Process::StopLocker stop_locker;
287        if (stop_locker.TryLock(&process->GetRunLock()))
288        {
289            frame = exe_ctx.GetFramePtr();
290            if (frame)
291            {
292                sb_symbol.reset(frame->GetSymbolContext (eSymbolContextSymbol).symbol);
293            }
294            else
295            {
296                if (log)
297                    log->Printf ("SBFrame::GetSymbol () => error: could not reconstruct frame object for this SBFrame.");
298            }
299        }
300        else
301        {
302            if (log)
303                log->Printf ("SBFrame::GetSymbol () => error: process is running");
304        }
305    }
306    if (log)
307        log->Printf ("SBFrame(%p)::GetSymbol () => SBSymbol(%p)",
308                     frame, sb_symbol.get());
309    return sb_symbol;
310}
311
312SBBlock
313SBFrame::GetBlock () const
314{
315    Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
316    SBBlock sb_block;
317    Mutex::Locker api_locker;
318    ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
319
320    StackFrame *frame = NULL;
321    Target *target = exe_ctx.GetTargetPtr();
322    Process *process = exe_ctx.GetProcessPtr();
323    if (target && process)
324    {
325        Process::StopLocker stop_locker;
326        if (stop_locker.TryLock(&process->GetRunLock()))
327        {
328            frame = exe_ctx.GetFramePtr();
329            if (frame)
330            {
331                sb_block.SetPtr (frame->GetSymbolContext (eSymbolContextBlock).block);
332            }
333            else
334            {
335                if (log)
336                    log->Printf ("SBFrame::GetBlock () => error: could not reconstruct frame object for this SBFrame.");
337            }
338        }
339        else
340        {
341            if (log)
342                log->Printf ("SBFrame(%p)::GetBlock () => error: process is running", frame);
343        }
344    }
345    if (log)
346        log->Printf ("SBFrame(%p)::GetBlock () => SBBlock(%p)",
347                     frame, sb_block.GetPtr());
348    return sb_block;
349}
350
351SBBlock
352SBFrame::GetFrameBlock () const
353{
354    SBBlock sb_block;
355    Mutex::Locker api_locker;
356    ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
357
358    StackFrame *frame = NULL;
359    Target *target = exe_ctx.GetTargetPtr();
360    Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
361    Process *process = exe_ctx.GetProcessPtr();
362    if (target && process)
363    {
364        Process::StopLocker stop_locker;
365        if (stop_locker.TryLock(&process->GetRunLock()))
366        {
367            frame = exe_ctx.GetFramePtr();
368            if (frame)
369            {
370                sb_block.SetPtr(frame->GetFrameBlock ());
371            }
372            else
373            {
374                if (log)
375                    log->Printf ("SBFrame::GetFrameBlock () => error: could not reconstruct frame object for this SBFrame.");
376            }
377        }
378        else
379        {
380            if (log)
381                log->Printf ("SBFrame::GetFrameBlock () => error: process is running");
382        }
383    }
384    if (log)
385        log->Printf ("SBFrame(%p)::GetFrameBlock () => SBBlock(%p)",
386                     frame, sb_block.GetPtr());
387    return sb_block;
388}
389
390SBLineEntry
391SBFrame::GetLineEntry () const
392{
393    Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
394    SBLineEntry sb_line_entry;
395    Mutex::Locker api_locker;
396    ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
397
398    StackFrame *frame = NULL;
399    Target *target = exe_ctx.GetTargetPtr();
400    Process *process = exe_ctx.GetProcessPtr();
401    if (target && process)
402    {
403        Process::StopLocker stop_locker;
404        if (stop_locker.TryLock(&process->GetRunLock()))
405        {
406            frame = exe_ctx.GetFramePtr();
407            if (frame)
408            {
409                sb_line_entry.SetLineEntry (frame->GetSymbolContext (eSymbolContextLineEntry).line_entry);
410            }
411            else
412            {
413                if (log)
414                    log->Printf ("SBFrame::GetLineEntry () => error: could not reconstruct frame object for this SBFrame.");
415            }
416        }
417        else
418        {
419            if (log)
420                log->Printf ("SBFrame::GetLineEntry () => error: process is running");
421        }
422    }
423    if (log)
424        log->Printf ("SBFrame(%p)::GetLineEntry () => SBLineEntry(%p)",
425                     frame, sb_line_entry.get());
426    return sb_line_entry;
427}
428
429uint32_t
430SBFrame::GetFrameID () const
431{
432    uint32_t frame_idx = UINT32_MAX;
433
434    ExecutionContext exe_ctx(m_opaque_sp.get());
435    StackFrame *frame = exe_ctx.GetFramePtr();
436    if (frame)
437        frame_idx = frame->GetFrameIndex ();
438
439    Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
440    if (log)
441        log->Printf ("SBFrame(%p)::GetFrameID () => %u",
442                     frame, frame_idx);
443    return frame_idx;
444}
445
446addr_t
447SBFrame::GetPC () const
448{
449    Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
450    addr_t addr = LLDB_INVALID_ADDRESS;
451    Mutex::Locker api_locker;
452    ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
453
454    StackFrame *frame = NULL;
455    Target *target = exe_ctx.GetTargetPtr();
456    Process *process = exe_ctx.GetProcessPtr();
457    if (target && process)
458    {
459        Process::StopLocker stop_locker;
460        if (stop_locker.TryLock(&process->GetRunLock()))
461        {
462            frame = exe_ctx.GetFramePtr();
463            if (frame)
464            {
465                addr = frame->GetFrameCodeAddress().GetOpcodeLoadAddress (target);
466            }
467            else
468            {
469                if (log)
470                    log->Printf ("SBFrame::GetPC () => error: could not reconstruct frame object for this SBFrame.");
471            }
472        }
473        else
474        {
475            if (log)
476                log->Printf ("SBFrame::GetPC () => error: process is running");
477        }
478    }
479
480    if (log)
481        log->Printf ("SBFrame(%p)::GetPC () => 0x%" PRIx64, frame, addr);
482
483    return addr;
484}
485
486bool
487SBFrame::SetPC (addr_t new_pc)
488{
489    Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
490    bool ret_val = false;
491    Mutex::Locker api_locker;
492    ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
493
494    StackFrame *frame = NULL;
495    Target *target = exe_ctx.GetTargetPtr();
496    Process *process = exe_ctx.GetProcessPtr();
497    if (target && process)
498    {
499        Process::StopLocker stop_locker;
500        if (stop_locker.TryLock(&process->GetRunLock()))
501        {
502            frame = exe_ctx.GetFramePtr();
503            if (frame)
504            {
505                ret_val = frame->GetRegisterContext()->SetPC (new_pc);
506            }
507            else
508            {
509                if (log)
510                    log->Printf ("SBFrame::SetPC () => error: could not reconstruct frame object for this SBFrame.");
511            }
512        }
513        else
514        {
515            if (log)
516                log->Printf ("SBFrame::SetPC () => error: process is running");
517        }
518    }
519
520    if (log)
521        log->Printf ("SBFrame(%p)::SetPC (new_pc=0x%" PRIx64 ") => %i",
522                     frame, new_pc, ret_val);
523
524    return ret_val;
525}
526
527addr_t
528SBFrame::GetSP () const
529{
530    Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
531    addr_t addr = LLDB_INVALID_ADDRESS;
532    Mutex::Locker api_locker;
533    ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
534
535    StackFrame *frame = NULL;
536    Target *target = exe_ctx.GetTargetPtr();
537    Process *process = exe_ctx.GetProcessPtr();
538    if (target && process)
539    {
540        Process::StopLocker stop_locker;
541        if (stop_locker.TryLock(&process->GetRunLock()))
542        {
543            frame = exe_ctx.GetFramePtr();
544            if (frame)
545            {
546                addr = frame->GetRegisterContext()->GetSP();
547            }
548            else
549            {
550                if (log)
551                    log->Printf ("SBFrame::GetSP () => error: could not reconstruct frame object for this SBFrame.");
552            }
553        }
554        else
555        {
556            if (log)
557                log->Printf ("SBFrame::GetSP () => error: process is running");
558        }
559    }
560    if (log)
561        log->Printf ("SBFrame(%p)::GetSP () => 0x%" PRIx64, frame, addr);
562
563    return addr;
564}
565
566
567addr_t
568SBFrame::GetFP () const
569{
570    Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
571    addr_t addr = LLDB_INVALID_ADDRESS;
572    Mutex::Locker api_locker;
573    ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
574
575    StackFrame *frame = NULL;
576    Target *target = exe_ctx.GetTargetPtr();
577    Process *process = exe_ctx.GetProcessPtr();
578    if (target && process)
579    {
580        Process::StopLocker stop_locker;
581        if (stop_locker.TryLock(&process->GetRunLock()))
582        {
583            frame = exe_ctx.GetFramePtr();
584            if (frame)
585            {
586                addr = frame->GetRegisterContext()->GetFP();
587            }
588            else
589            {
590                if (log)
591                    log->Printf ("SBFrame::GetFP () => error: could not reconstruct frame object for this SBFrame.");
592            }
593        }
594        else
595        {
596            if (log)
597                log->Printf ("SBFrame::GetFP () => error: process is running");
598        }
599    }
600
601    if (log)
602        log->Printf ("SBFrame(%p)::GetFP () => 0x%" PRIx64, frame, addr);
603    return addr;
604}
605
606
607SBAddress
608SBFrame::GetPCAddress () const
609{
610    Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
611    SBAddress sb_addr;
612    Mutex::Locker api_locker;
613    ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
614
615    StackFrame *frame = exe_ctx.GetFramePtr();
616    Target *target = exe_ctx.GetTargetPtr();
617    Process *process = exe_ctx.GetProcessPtr();
618    if (target && process)
619    {
620        Process::StopLocker stop_locker;
621        if (stop_locker.TryLock(&process->GetRunLock()))
622        {
623            frame = exe_ctx.GetFramePtr();
624            if (frame)
625            {
626                sb_addr.SetAddress (&frame->GetFrameCodeAddress());
627            }
628            else
629            {
630                if (log)
631                    log->Printf ("SBFrame::GetPCAddress () => error: could not reconstruct frame object for this SBFrame.");
632            }
633        }
634        else
635        {
636            if (log)
637                log->Printf ("SBFrame::GetPCAddress () => error: process is running");
638        }
639    }
640    if (log)
641        log->Printf ("SBFrame(%p)::GetPCAddress () => SBAddress(%p)", frame, sb_addr.get());
642    return sb_addr;
643}
644
645void
646SBFrame::Clear()
647{
648    m_opaque_sp->Clear();
649}
650
651lldb::SBValue
652SBFrame::GetValueForVariablePath (const char *var_path)
653{
654    SBValue sb_value;
655    ExecutionContext exe_ctx(m_opaque_sp.get());
656    StackFrame *frame = exe_ctx.GetFramePtr();
657    Target *target = exe_ctx.GetTargetPtr();
658    if (frame && target)
659    {
660        lldb::DynamicValueType  use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue();
661        sb_value = GetValueForVariablePath (var_path, use_dynamic);
662    }
663    return sb_value;
664}
665
666lldb::SBValue
667SBFrame::GetValueForVariablePath (const char *var_path, DynamicValueType use_dynamic)
668{
669    SBValue sb_value;
670    Mutex::Locker api_locker;
671    Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
672    if (var_path == NULL || var_path[0] == '\0')
673    {
674        if (log)
675            log->Printf ("SBFrame::GetValueForVariablePath called with empty variable path.");
676        return sb_value;
677    }
678
679    ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
680
681    StackFrame *frame = NULL;
682    Target *target = exe_ctx.GetTargetPtr();
683    Process *process = exe_ctx.GetProcessPtr();
684    if (target && process)
685    {
686        Process::StopLocker stop_locker;
687        if (stop_locker.TryLock(&process->GetRunLock()))
688        {
689            frame = exe_ctx.GetFramePtr();
690            if (frame)
691            {
692                VariableSP var_sp;
693                Error error;
694                ValueObjectSP value_sp (frame->GetValueForVariableExpressionPath (var_path,
695                                                                                  eNoDynamicValues,
696                                                                                  StackFrame::eExpressionPathOptionCheckPtrVsMember | StackFrame::eExpressionPathOptionsAllowDirectIVarAccess,
697                                                                                  var_sp,
698                                                                                  error));
699                sb_value.SetSP(value_sp, use_dynamic);
700            }
701            else
702            {
703                if (log)
704                    log->Printf ("SBFrame::GetValueForVariablePath () => error: could not reconstruct frame object for this SBFrame.");
705            }
706        }
707        else
708        {
709            if (log)
710                log->Printf ("SBFrame::GetValueForVariablePath () => error: process is running");
711        }
712    }
713    return sb_value;
714}
715
716SBValue
717SBFrame::FindVariable (const char *name)
718{
719    SBValue value;
720    ExecutionContext exe_ctx(m_opaque_sp.get());
721    StackFrame *frame = exe_ctx.GetFramePtr();
722    Target *target = exe_ctx.GetTargetPtr();
723    if (frame && target)
724    {
725        lldb::DynamicValueType  use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue();
726        value = FindVariable (name, use_dynamic);
727    }
728    return value;
729}
730
731
732SBValue
733SBFrame::FindVariable (const char *name, lldb::DynamicValueType use_dynamic)
734{
735    Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
736    VariableSP var_sp;
737    SBValue sb_value;
738
739    if (name == NULL || name[0] == '\0')
740    {
741        if (log)
742            log->Printf ("SBFrame::FindVariable called with empty name");
743        return sb_value;
744    }
745
746    ValueObjectSP value_sp;
747    Mutex::Locker api_locker;
748    ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
749
750    StackFrame *frame = NULL;
751    Target *target = exe_ctx.GetTargetPtr();
752    Process *process = exe_ctx.GetProcessPtr();
753    if (target && process)
754    {
755        Process::StopLocker stop_locker;
756        if (stop_locker.TryLock(&process->GetRunLock()))
757        {
758            frame = exe_ctx.GetFramePtr();
759            if (frame)
760            {
761                VariableList variable_list;
762                SymbolContext sc (frame->GetSymbolContext (eSymbolContextBlock));
763
764                if (sc.block)
765                {
766                    const bool can_create = true;
767                    const bool get_parent_variables = true;
768                    const bool stop_if_block_is_inlined_function = true;
769
770                    if (sc.block->AppendVariables (can_create,
771                                                   get_parent_variables,
772                                                   stop_if_block_is_inlined_function,
773                                                   &variable_list))
774                    {
775                        var_sp = variable_list.FindVariable (ConstString(name));
776                    }
777                }
778
779                if (var_sp)
780                {
781                    value_sp = frame->GetValueObjectForFrameVariable(var_sp, eNoDynamicValues);
782                    sb_value.SetSP(value_sp, use_dynamic);
783                }
784            }
785            else
786            {
787                if (log)
788                    log->Printf ("SBFrame::FindVariable () => error: could not reconstruct frame object for this SBFrame.");
789            }
790        }
791        else
792        {
793            if (log)
794                log->Printf ("SBFrame::FindVariable () => error: process is running");
795        }
796    }
797
798    if (log)
799        log->Printf ("SBFrame(%p)::FindVariable (name=\"%s\") => SBValue(%p)",
800                     frame, name, value_sp.get());
801
802    return sb_value;
803}
804
805SBValue
806SBFrame::FindValue (const char *name, ValueType value_type)
807{
808    SBValue value;
809    ExecutionContext exe_ctx(m_opaque_sp.get());
810    StackFrame *frame = exe_ctx.GetFramePtr();
811    Target *target = exe_ctx.GetTargetPtr();
812    if (frame && target)
813    {
814        lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue();
815        value = FindValue (name, value_type, use_dynamic);
816    }
817    return value;
818}
819
820SBValue
821SBFrame::FindValue (const char *name, ValueType value_type, lldb::DynamicValueType use_dynamic)
822{
823    Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
824    SBValue sb_value;
825
826    if (name == NULL || name[0] == '\0')
827    {
828        if (log)
829            log->Printf ("SBFrame::FindValue called with empty name.");
830        return sb_value;
831    }
832
833    ValueObjectSP value_sp;
834    Mutex::Locker api_locker;
835    ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
836
837    StackFrame *frame = NULL;
838    Target *target = exe_ctx.GetTargetPtr();
839    Process *process = exe_ctx.GetProcessPtr();
840    if (target && process)
841    {
842        Process::StopLocker stop_locker;
843        if (stop_locker.TryLock(&process->GetRunLock()))
844        {
845            frame = exe_ctx.GetFramePtr();
846            if (frame)
847            {
848                VariableList variable_list;
849
850                switch (value_type)
851                {
852                case eValueTypeVariableGlobal:      // global variable
853                case eValueTypeVariableStatic:      // static variable
854                case eValueTypeVariableArgument:    // function argument variables
855                case eValueTypeVariableLocal:       // function local variables
856                    {
857
858                        SymbolContext sc (frame->GetSymbolContext (eSymbolContextBlock));
859
860                        const bool can_create = true;
861                        const bool get_parent_variables = true;
862                        const bool stop_if_block_is_inlined_function = true;
863
864                        if (sc.block && sc.block->AppendVariables (can_create,
865                                                                   get_parent_variables,
866                                                                   stop_if_block_is_inlined_function,
867                                                                   &variable_list))
868                        {
869                            if (value_type == eValueTypeVariableGlobal)
870                            {
871                                const bool get_file_globals = true;
872                                VariableList* frame_vars = frame->GetVariableList(get_file_globals);
873                                if (frame_vars)
874                                    frame_vars->AppendVariablesIfUnique(variable_list);
875                            }
876                            ConstString const_name(name);
877                            VariableSP variable_sp(variable_list.FindVariable(const_name,value_type));
878                            if (variable_sp)
879                            {
880                                value_sp = frame->GetValueObjectForFrameVariable (variable_sp, eNoDynamicValues);
881                                sb_value.SetSP (value_sp, use_dynamic);
882                                break;
883                            }
884                        }
885                    }
886                    break;
887
888                case eValueTypeRegister:            // stack frame register value
889                    {
890                        RegisterContextSP reg_ctx (frame->GetRegisterContext());
891                        if (reg_ctx)
892                        {
893                            const uint32_t num_regs = reg_ctx->GetRegisterCount();
894                            for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx)
895                            {
896                                const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoAtIndex (reg_idx);
897                                if (reg_info &&
898                                    ((reg_info->name && strcasecmp (reg_info->name, name) == 0) ||
899                                     (reg_info->alt_name && strcasecmp (reg_info->alt_name, name) == 0)))
900                                {
901                                    value_sp = ValueObjectRegister::Create (frame, reg_ctx, reg_idx);
902                                    sb_value.SetSP (value_sp);
903                                    break;
904                                }
905                            }
906                        }
907                    }
908                    break;
909
910                case eValueTypeRegisterSet:         // A collection of stack frame register values
911                    {
912                        RegisterContextSP reg_ctx (frame->GetRegisterContext());
913                        if (reg_ctx)
914                        {
915                            const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
916                            for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx)
917                            {
918                                const RegisterSet *reg_set = reg_ctx->GetRegisterSet (set_idx);
919                                if (reg_set &&
920                                    ((reg_set->name && strcasecmp (reg_set->name, name) == 0) ||
921                                     (reg_set->short_name && strcasecmp (reg_set->short_name, name) == 0)))
922                                {
923                                    value_sp = ValueObjectRegisterSet::Create (frame, reg_ctx, set_idx);
924                                    sb_value.SetSP (value_sp);
925                                    break;
926                                }
927                            }
928                        }
929                    }
930                    break;
931
932                case eValueTypeConstResult:         // constant result variables
933                    {
934                        ConstString const_name(name);
935                        ClangExpressionVariableSP expr_var_sp (target->GetPersistentVariables().GetVariable (const_name));
936                        if (expr_var_sp)
937                        {
938                            value_sp = expr_var_sp->GetValueObject();
939                            sb_value.SetSP (value_sp, use_dynamic);
940                        }
941                    }
942                    break;
943
944                default:
945                    break;
946                }
947            }
948            else
949            {
950                if (log)
951                    log->Printf ("SBFrame::FindValue () => error: could not reconstruct frame object for this SBFrame.");
952            }
953        }
954        else
955        {
956            if (log)
957                log->Printf ("SBFrame::FindValue () => error: process is running");
958        }
959    }
960
961    if (log)
962        log->Printf ("SBFrame(%p)::FindVariableInScope (name=\"%s\", value_type=%i) => SBValue(%p)",
963                     frame, name, value_type, value_sp.get());
964
965
966    return sb_value;
967}
968
969bool
970SBFrame::IsEqual (const SBFrame &that) const
971{
972    lldb::StackFrameSP this_sp = GetFrameSP();
973    lldb::StackFrameSP that_sp = that.GetFrameSP();
974    return (this_sp && that_sp && this_sp->GetStackID() == that_sp->GetStackID());
975}
976
977bool
978SBFrame::operator == (const SBFrame &rhs) const
979{
980    return IsEqual(rhs);
981}
982
983bool
984SBFrame::operator != (const SBFrame &rhs) const
985{
986    return !IsEqual(rhs);
987}
988
989SBThread
990SBFrame::GetThread () const
991{
992    Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
993
994    ExecutionContext exe_ctx(m_opaque_sp.get());
995    ThreadSP thread_sp (exe_ctx.GetThreadSP());
996    SBThread sb_thread (thread_sp);
997
998    if (log)
999    {
1000        SBStream sstr;
1001        sb_thread.GetDescription (sstr);
1002        log->Printf ("SBFrame(%p)::GetThread () => SBThread(%p): %s",
1003                     exe_ctx.GetFramePtr(),
1004                     thread_sp.get(),
1005                     sstr.GetData());
1006    }
1007
1008    return sb_thread;
1009}
1010
1011const char *
1012SBFrame::Disassemble () const
1013{
1014    Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1015    const char *disassembly = NULL;
1016    Mutex::Locker api_locker;
1017    ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1018
1019    StackFrame *frame = NULL;
1020    Target *target = exe_ctx.GetTargetPtr();
1021    Process *process = exe_ctx.GetProcessPtr();
1022    if (target && process)
1023    {
1024        Process::StopLocker stop_locker;
1025        if (stop_locker.TryLock(&process->GetRunLock()))
1026        {
1027            frame = exe_ctx.GetFramePtr();
1028            if (frame)
1029            {
1030                disassembly = frame->Disassemble();
1031            }
1032            else
1033            {
1034                if (log)
1035                    log->Printf ("SBFrame::Disassemble () => error: could not reconstruct frame object for this SBFrame.");
1036            }
1037        }
1038        else
1039        {
1040            if (log)
1041                log->Printf ("SBFrame::Disassemble () => error: process is running");
1042        }
1043    }
1044
1045    if (log)
1046        log->Printf ("SBFrame(%p)::Disassemble () => %s", frame, disassembly);
1047
1048    return disassembly;
1049}
1050
1051
1052SBValueList
1053SBFrame::GetVariables (bool arguments,
1054                       bool locals,
1055                       bool statics,
1056                       bool in_scope_only)
1057{
1058    SBValueList value_list;
1059    ExecutionContext exe_ctx(m_opaque_sp.get());
1060    StackFrame *frame = exe_ctx.GetFramePtr();
1061    Target *target = exe_ctx.GetTargetPtr();
1062    if (frame && target)
1063    {
1064        lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue();
1065        value_list = GetVariables (arguments, locals, statics, in_scope_only, use_dynamic);
1066    }
1067    return value_list;
1068}
1069
1070SBValueList
1071SBFrame::GetVariables (bool arguments,
1072                       bool locals,
1073                       bool statics,
1074                       bool in_scope_only,
1075                       lldb::DynamicValueType  use_dynamic)
1076{
1077    Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1078
1079    SBValueList value_list;
1080    Mutex::Locker api_locker;
1081    ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1082
1083    StackFrame *frame = NULL;
1084    Target *target = exe_ctx.GetTargetPtr();
1085
1086    if (log)
1087        log->Printf ("SBFrame::GetVariables (arguments=%i, locals=%i, statics=%i, in_scope_only=%i)",
1088                     arguments,
1089                     locals,
1090                     statics,
1091                     in_scope_only);
1092
1093    Process *process = exe_ctx.GetProcessPtr();
1094    if (target && process)
1095    {
1096        Process::StopLocker stop_locker;
1097        if (stop_locker.TryLock(&process->GetRunLock()))
1098        {
1099            frame = exe_ctx.GetFramePtr();
1100            if (frame)
1101            {
1102                size_t i;
1103                VariableList *variable_list = NULL;
1104                variable_list = frame->GetVariableList(true);
1105                if (variable_list)
1106                {
1107                    const size_t num_variables = variable_list->GetSize();
1108                    if (num_variables)
1109                    {
1110                        for (i = 0; i < num_variables; ++i)
1111                        {
1112                            VariableSP variable_sp (variable_list->GetVariableAtIndex(i));
1113                            if (variable_sp)
1114                            {
1115                                bool add_variable = false;
1116                                switch (variable_sp->GetScope())
1117                                {
1118                                case eValueTypeVariableGlobal:
1119                                case eValueTypeVariableStatic:
1120                                    add_variable = statics;
1121                                    break;
1122
1123                                case eValueTypeVariableArgument:
1124                                    add_variable = arguments;
1125                                    break;
1126
1127                                case eValueTypeVariableLocal:
1128                                    add_variable = locals;
1129                                    break;
1130
1131                                default:
1132                                    break;
1133                                }
1134                                if (add_variable)
1135                                {
1136                                    if (in_scope_only && !variable_sp->IsInScope(frame))
1137                                        continue;
1138
1139                                    ValueObjectSP valobj_sp(frame->GetValueObjectForFrameVariable (variable_sp, eNoDynamicValues));
1140                                    SBValue value_sb;
1141                                    value_sb.SetSP(valobj_sp,use_dynamic);
1142                                    value_list.Append(value_sb);
1143                                }
1144                            }
1145                        }
1146                    }
1147                }
1148            }
1149            else
1150            {
1151                if (log)
1152                    log->Printf ("SBFrame::GetVariables () => error: could not reconstruct frame object for this SBFrame.");
1153            }
1154        }
1155        else
1156        {
1157            if (log)
1158                log->Printf ("SBFrame::GetVariables () => error: process is running");
1159        }
1160    }
1161
1162    if (log)
1163    {
1164        log->Printf ("SBFrame(%p)::GetVariables (...) => SBValueList(%p)", frame, value_list.opaque_ptr());
1165    }
1166
1167    return value_list;
1168}
1169
1170SBValueList
1171SBFrame::GetRegisters ()
1172{
1173    Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1174
1175    SBValueList value_list;
1176    Mutex::Locker api_locker;
1177    ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1178
1179    StackFrame *frame = NULL;
1180    Target *target = exe_ctx.GetTargetPtr();
1181    Process *process = exe_ctx.GetProcessPtr();
1182    if (target && process)
1183    {
1184        Process::StopLocker stop_locker;
1185        if (stop_locker.TryLock(&process->GetRunLock()))
1186        {
1187            frame = exe_ctx.GetFramePtr();
1188            if (frame)
1189            {
1190                RegisterContextSP reg_ctx (frame->GetRegisterContext());
1191                if (reg_ctx)
1192                {
1193                    const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
1194                    for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx)
1195                    {
1196                        value_list.Append(ValueObjectRegisterSet::Create (frame, reg_ctx, set_idx));
1197                    }
1198                }
1199            }
1200            else
1201            {
1202                if (log)
1203                    log->Printf ("SBFrame::GetRegisters () => error: could not reconstruct frame object for this SBFrame.");
1204            }
1205        }
1206        else
1207        {
1208            if (log)
1209                log->Printf ("SBFrame::GetRegisters () => error: process is running");
1210        }
1211    }
1212
1213    if (log)
1214        log->Printf ("SBFrame(%p)::GetRegisters () => SBValueList(%p)", frame, value_list.opaque_ptr());
1215
1216    return value_list;
1217}
1218
1219SBValue
1220SBFrame::FindRegister (const char *name)
1221{
1222    Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1223
1224    SBValue result;
1225    ValueObjectSP value_sp;
1226    Mutex::Locker api_locker;
1227    ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1228
1229    StackFrame *frame = NULL;
1230    Target *target = exe_ctx.GetTargetPtr();
1231    Process *process = exe_ctx.GetProcessPtr();
1232    if (target && process)
1233    {
1234        Process::StopLocker stop_locker;
1235        if (stop_locker.TryLock(&process->GetRunLock()))
1236        {
1237            frame = exe_ctx.GetFramePtr();
1238            if (frame)
1239            {
1240                RegisterContextSP reg_ctx (frame->GetRegisterContext());
1241                if (reg_ctx)
1242                {
1243                    const uint32_t num_regs = reg_ctx->GetRegisterCount();
1244                    for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx)
1245                    {
1246                        const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoAtIndex (reg_idx);
1247                        if (reg_info &&
1248                            ((reg_info->name && strcasecmp (reg_info->name, name) == 0) ||
1249                             (reg_info->alt_name && strcasecmp (reg_info->alt_name, name) == 0)))
1250                        {
1251                            value_sp = ValueObjectRegister::Create (frame, reg_ctx, reg_idx);
1252                            result.SetSP (value_sp);
1253                            break;
1254                        }
1255                    }
1256                }
1257            }
1258            else
1259            {
1260                if (log)
1261                    log->Printf ("SBFrame::FindRegister () => error: could not reconstruct frame object for this SBFrame.");
1262            }
1263        }
1264        else
1265        {
1266            if (log)
1267                log->Printf ("SBFrame::FindRegister () => error: process is running");
1268        }
1269    }
1270
1271    if (log)
1272        log->Printf ("SBFrame(%p)::FindRegister () => SBValue(%p)", frame, value_sp.get());
1273
1274    return result;
1275}
1276
1277bool
1278SBFrame::GetDescription (SBStream &description)
1279{
1280    Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1281    Stream &strm = description.ref();
1282
1283    Mutex::Locker api_locker;
1284    ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1285
1286    StackFrame *frame;
1287    Target *target = exe_ctx.GetTargetPtr();
1288    Process *process = exe_ctx.GetProcessPtr();
1289    if (target && process)
1290    {
1291        Process::StopLocker stop_locker;
1292        if (stop_locker.TryLock(&process->GetRunLock()))
1293        {
1294            frame = exe_ctx.GetFramePtr();
1295            if (frame)
1296            {
1297                frame->DumpUsingSettingsFormat (&strm);
1298            }
1299            else
1300            {
1301                if (log)
1302                    log->Printf ("SBFrame::GetDescription () => error: could not reconstruct frame object for this SBFrame.");
1303            }
1304        }
1305        else
1306        {
1307            if (log)
1308                log->Printf ("SBFrame::GetDescription () => error: process is running");
1309        }
1310
1311    }
1312    else
1313        strm.PutCString ("No value");
1314
1315    return true;
1316}
1317
1318SBValue
1319SBFrame::EvaluateExpression (const char *expr)
1320{
1321    SBValue result;
1322    ExecutionContext exe_ctx(m_opaque_sp.get());
1323    StackFrame *frame = exe_ctx.GetFramePtr();
1324    Target *target = exe_ctx.GetTargetPtr();
1325    if (frame && target)
1326    {
1327        SBExpressionOptions options;
1328        lldb::DynamicValueType fetch_dynamic_value = frame->CalculateTarget()->GetPreferDynamicValue();
1329        options.SetFetchDynamicValue (fetch_dynamic_value);
1330        options.SetUnwindOnError (true);
1331        return EvaluateExpression (expr, options);
1332    }
1333    return result;
1334}
1335
1336SBValue
1337SBFrame::EvaluateExpression (const char *expr, lldb::DynamicValueType fetch_dynamic_value)
1338{
1339    SBExpressionOptions options;
1340    options.SetFetchDynamicValue (fetch_dynamic_value);
1341    options.SetUnwindOnError (true);
1342    return EvaluateExpression (expr, options);
1343}
1344
1345SBValue
1346SBFrame::EvaluateExpression (const char *expr, lldb::DynamicValueType fetch_dynamic_value, bool unwind_on_error)
1347{
1348    SBExpressionOptions options;
1349    options.SetFetchDynamicValue (fetch_dynamic_value);
1350    options.SetUnwindOnError (unwind_on_error);
1351    return EvaluateExpression (expr, options);
1352}
1353
1354lldb::SBValue
1355SBFrame::EvaluateExpression (const char *expr, const SBExpressionOptions &options)
1356{
1357    Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1358
1359    Log *expr_log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1360
1361    ExecutionResults exe_results = eExecutionSetupError;
1362    SBValue expr_result;
1363
1364    if (expr == NULL || expr[0] == '\0')
1365    {
1366        if (log)
1367            log->Printf ("SBFrame::EvaluateExpression called with an empty expression");
1368        return expr_result;
1369    }
1370
1371    ValueObjectSP expr_value_sp;
1372
1373    Mutex::Locker api_locker;
1374    ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1375
1376    if (log)
1377        log->Printf ("SBFrame()::EvaluateExpression (expr=\"%s\")...", expr);
1378
1379    StackFrame *frame = NULL;
1380    Target *target = exe_ctx.GetTargetPtr();
1381    Process *process = exe_ctx.GetProcessPtr();
1382
1383    if (target && process)
1384    {
1385        Process::StopLocker stop_locker;
1386        if (stop_locker.TryLock(&process->GetRunLock()))
1387        {
1388            frame = exe_ctx.GetFramePtr();
1389            if (frame)
1390            {
1391                if (target->GetDisplayExpressionsInCrashlogs())
1392                {
1393                    StreamString frame_description;
1394                    frame->DumpUsingSettingsFormat (&frame_description);
1395                    Host::SetCrashDescriptionWithFormat ("SBFrame::EvaluateExpression (expr = \"%s\", fetch_dynamic_value = %u) %s",
1396                                                         expr, options.GetFetchDynamicValue(), frame_description.GetString().c_str());
1397                }
1398
1399                exe_results = target->EvaluateExpression (expr,
1400                                                          frame,
1401                                                          expr_value_sp,
1402                                                          options.ref());
1403                expr_result.SetSP(expr_value_sp, options.GetFetchDynamicValue());
1404
1405                if (target->GetDisplayExpressionsInCrashlogs())
1406                    Host::SetCrashDescription (NULL);
1407            }
1408            else
1409            {
1410                if (log)
1411                    log->Printf ("SBFrame::EvaluateExpression () => error: could not reconstruct frame object for this SBFrame.");
1412            }
1413        }
1414        else
1415        {
1416            if (log)
1417                log->Printf ("SBFrame::EvaluateExpression () => error: process is running");
1418        }
1419    }
1420
1421#ifndef LLDB_DISABLE_PYTHON
1422    if (expr_log)
1423        expr_log->Printf("** [SBFrame::EvaluateExpression] Expression result is %s, summary %s **",
1424                         expr_result.GetValue(),
1425                         expr_result.GetSummary());
1426
1427    if (log)
1428        log->Printf ("SBFrame(%p)::EvaluateExpression (expr=\"%s\") => SBValue(%p) (execution result=%d)",
1429                     frame,
1430                     expr,
1431                     expr_value_sp.get(),
1432                     exe_results);
1433#endif
1434
1435    return expr_result;
1436}
1437
1438bool
1439SBFrame::IsInlined()
1440{
1441    Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1442    ExecutionContext exe_ctx(m_opaque_sp.get());
1443    StackFrame *frame = NULL;
1444    Target *target = exe_ctx.GetTargetPtr();
1445    Process *process = exe_ctx.GetProcessPtr();
1446    if (target && process)
1447    {
1448        Process::StopLocker stop_locker;
1449        if (stop_locker.TryLock(&process->GetRunLock()))
1450        {
1451            frame = exe_ctx.GetFramePtr();
1452            if (frame)
1453            {
1454
1455                Block *block = frame->GetSymbolContext(eSymbolContextBlock).block;
1456                if (block)
1457                    return block->GetContainingInlinedBlock () != NULL;
1458            }
1459            else
1460            {
1461                if (log)
1462                    log->Printf ("SBFrame::IsInlined () => error: could not reconstruct frame object for this SBFrame.");
1463            }
1464        }
1465        else
1466        {
1467            if (log)
1468                log->Printf ("SBFrame::IsInlined () => error: process is running");
1469        }
1470
1471    }
1472    return false;
1473}
1474
1475const char *
1476SBFrame::GetFunctionName()
1477{
1478    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1479    const char *name = NULL;
1480    ExecutionContext exe_ctx(m_opaque_sp.get());
1481    StackFrame *frame = NULL;
1482    Target *target = exe_ctx.GetTargetPtr();
1483    Process *process = exe_ctx.GetProcessPtr();
1484    if (target && process)
1485    {
1486        Process::StopLocker stop_locker;
1487        if (stop_locker.TryLock(&process->GetRunLock()))
1488        {
1489            frame = exe_ctx.GetFramePtr();
1490            if (frame)
1491            {
1492                SymbolContext sc (frame->GetSymbolContext(eSymbolContextFunction | eSymbolContextBlock | eSymbolContextSymbol));
1493                if (sc.block)
1494                {
1495                    Block *inlined_block = sc.block->GetContainingInlinedBlock ();
1496                    if (inlined_block)
1497                    {
1498                        const InlineFunctionInfo* inlined_info = inlined_block->GetInlinedFunctionInfo();
1499                        name = inlined_info->GetName().AsCString();
1500                    }
1501                }
1502
1503                if (name == NULL)
1504                {
1505                    if (sc.function)
1506                        name = sc.function->GetName().GetCString();
1507                }
1508
1509                if (name == NULL)
1510                {
1511                    if (sc.symbol)
1512                        name = sc.symbol->GetName().GetCString();
1513                }
1514            }
1515            else
1516            {
1517                if (log)
1518                    log->Printf ("SBFrame::GetFunctionName () => error: could not reconstruct frame object for this SBFrame.");
1519            }
1520        }
1521        else
1522        {
1523            if (log)
1524                log->Printf ("SBFrame::GetFunctionName() => error: process is running");
1525
1526        }
1527    }
1528    return name;
1529}
1530
1531