<html>
<head>
<style><!--
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 12pt;
font-family:Calibri
}
--></style></head>
<body class='hmmessage'><div dir='ltr'>Does the following qualify as "interactive usage"?  It seems using "process" works in myfile.func(), or I was just lucky? Thanks.<BR> <BR>(lldb) script myfile.func(args)<br> <BR><div>> Subject: Re: [lldb-dev] lldb type summary provider - SBProcess is invalid<br>> From: gclayton@apple.com<br>> Date: Wed, 14 Sep 2016 09:33:20 -0700<br>> CC: egranata@apple.com; lldb-dev@lists.llvm.org<br>> To: leikong@msn.com<br>> <br>> <br>> > On Sep 13, 2016, at 9:50 PM, Lei Kong via lldb-dev <lldb-dev@lists.llvm.org> wrote:<br>> > <br>> > Thanks!<br>> > SBValue.process works!<br>> >  <br>> > I have another script that I run manually to search process memory for certain patterns, not a type summary provider, there is no SBValue passed to my script, in such a case, how do I get current process?<br>> >  <br>> If this is python a command line command you are making, use the variant that takes an execution context:<br>> <br>> def my_command(debugger, command, exe_ctx, result, dict):<br>>     # Always use the specified execution context to get the target, process<br>>     # thread and frame. If this command gets run from a breakpoint callback<br>>     # these will not match the debugger's selected target, the selected <br>>     # process in the target, the selected thread in the process and the <br>>     # selected frame in the thread.<br>>     target = exe_ctx.GetTarget()<br>>     process = exe_ctx.GetProcess()<br>>     thread = exe_ctx.GetThread()<br>>     frame = exe_ctx.GetFrame()<br>> <br>> <br>> The execution context is explicitly specified for you.<br>> <br>> > From: Enrico Granata<br>> > Sent: Tuesday, September 13, 2016 10:31 AM<br>> > To: Lei Kong<br>> > Cc: lldb-dev@lists.llvm.org<br>> > Subject: Re: [lldb-dev] lldb type summary provider - SBProcess is invalid<br>> >  <br>> > <br>> >> On Sep 13, 2016, at 10:02 AM, Lei Kong via lldb-dev <lldb-dev@lists.llvm.org> wrote:<br>> >> <br>> >> I wrote a lldb type summary provider for wstring with 16bit wchar on Ubuntu 16.04.<br>> >> <br>> >> Things work fine if I manually do the following in lldb:<br>> >> <br>> >> (lldb) script import mytypes<br>> >> (lldb) type summary add -F mytypes.wstring_SummaryProvider "std::__1::wstring"<br>> >> <br>> >> I tried to make things easier with auto-loading by adding the following to .lldbinit:<br>> >> <br>> >> script import mytypes<br>> >> type summary add -F mytypes.wstring_SummaryProvider "std::__1::wstring"<br>> >> <br>> >> Then I got a failure of "SBProcess is invalid" when printing a wstring variable.<br>> >> <br>> >> My type summary function has the following, which I believe is where the error is encountered:<br>> >> <br>> >> content = lldb.process.ReadMemory(bufferAddr, byteCount, error)<br>> >> <br>> >> Maybe this is because "process" is not assigned yet when the type summary is added during auto-loading? Or this is a bug in lldb? Does anyone know how to work around this issue?<br>> >> <br>> >> <br>> > <br>> > Good hunch :-)<br>> > Maybe we should do a better job at documenting this, but http://lldb.llvm.org/python-reference.html reads<br>> > <br>> > "While extremely convenient, these variables (lldb.process et alia) have a couple caveats that you should be aware of. First of all, they hold the values of the selected objects on entry to the embedded interpreter. They do not update as you use the LLDB API's to change, for example, the currently selected stack frame or thread. <br>> > Moreover, they are only defined and meaningful while in the interactive Python interpreter. There is no guarantee on their value in any other situation, hence you should not use them when defining Python formatters, breakpoint scripts and commands (or any other Python extension point that LLDB provides). As a rationale for such behavior, consider that lldb can run in a multithreaded environment, and another thread might call the "script" command, changing the value out from under you."<br>> > <br>> > As part of a formatter, you get passed an SBValue. One of the things you can ask of an SBValue is the process it came from, thusly:<br>> > <br>> > value.GetProcess()<br>> > <br>> > That's the SBProcess object you want to use<br>> > <br>> >>  <br>> >> Thanks much<br>> >> <br>> >>  <br>> >>  <br>> >>  <br>> >> _______________________________________________<br>> >> lldb-dev mailing list<br>> >> lldb-dev@lists.llvm.org<br>> >> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-dev<br>> > <br>> > <br>> > Thanks,<br>> > - Enrico<br>> > <img title="Envelope with down arrow above" class="Emoji$1F4E9$AEB RenderedEmoji" alt="Envelope with down arrow above" src="https://a.gfx.ms/emoji_1F4E9.png"> egranata@.com <img title="Black telephone" class="Emoji$0260E$ACF RenderedEmoji" alt="Black telephone" src="https://a.gfx.ms/emoji_0260E.png">️ 27683<br>> > <br>> > _______________________________________________<br>> > lldb-dev mailing list<br>> > lldb-dev@lists.llvm.org<br>> > http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-dev<br>> <br></div>                                       </div></body>
</html>