Ah, got it. That works. Thanks again!

-Greg

On Oct 15, 2012, at 6:10 PM, Greg Clayton <[email protected]> wrote:

> Woops, I forgot the two read and write args. Try this:
> 
>       launch_info.AddOpenFileAction (1, '/tmp/stdout.txt', False, True)
> 
> On Oct 15, 2012, at 6:05 PM, Greg Hazel <[email protected]> wrote:
> 
>> error = lldb.SBError()
>> 
>> as in the example.
>> 
>> I tried your LaunchInfo method, which sounds promising, but I got:
>> 
>> Traceback (most recent call last):
>> File "crundebug", line 20, in <module>
>>   launch_info.AddOpenFileAction(1, '/tmp/stdout.txt')
>> File 
>> "/System/Library/PrivateFrameworks/LLDB.framework/Versions/A/Resources/Python/lldb/__init__.py",
>>  line 6029, in AddOpenFileAction
>>   return _lldb.SBLaunchInfo_AddOpenFileAction(self, *args)
>> TypeError: SBLaunchInfo_AddOpenFileAction() takes exactly 5 arguments (3 
>> given)
>> 
>> -Greg
>> 
>> On Oct 15, 2012, at 5:57 PM, Greg Clayton <[email protected]> wrote:
>> 
>>> How are you creating the error you are passing in the last argument? It 
>>> should be:
>>> 
>>> error = lldb.SBError()
>>> target.Launch(debugger.GetListener(), 
>>>            ['X', 'Y', 'Z'], 
>>>            None,
>>>            None,
>>>            '/tmp/stdout.txt',
>>>           None,
>>>            None, 
>>>           0,
>>>            False, 
>>>           error);
>>> 
>>> I would suggest using:
>>> 
>>>  SBProcess
>>>  SBTarget::Launch (SBLaunchInfo &launch_info, SBError& error);
>>> 
>>> If possible as this is the future of our API. Other will eventually be 
>>> removed.
>>> 
>>>     launch_info = lldb.SBLaunchInfo (['X', 'Y', 'Z'])
>>>     # The '1' below is for STDOUT_FILENO
>>>     launch_info.AddOpenFileAction (1, '/tmp/stdout.txt')
>>>     error = lldb.SBError()
>>>     process = target.Launch (launch_info, error)
>>> 
>>> When you don't care about the error, you can pass a temporary:
>>> 
>>>     process = target.Launch (launch_info, lldb.SBError())
>>> 
>>> 
>>> 
>>> On Oct 15, 2012, at 12:47 PM, [email protected] wrote:
>>> 
>>>> That worked at the time, but something seems to have broken the python 
>>>> wrapper for the long version of SBTarget::Launch. Probably in 
>>>> 10.8.something
>>>> 
>>>> This works:
>>>>  target.LaunchSimple(['X', 'Y', 'Z'], None, os.getcwd())
>>>> 
>>>> This does not:
>>>>  target.Launch(debugger.GetListener(), ['X', 'Y', 'Z'], None,
>>>>                None, '/tmp/stdout.txt', None,
>>>>                None, 0, False, error)
>>>> 
>>>> The error is:
>>>> File 
>>>> "/System/Library/PrivateFrameworks/LLDB.framework/Versions/A/Resources/Python/lldb/__init__.py",
>>>>  line 6351, in Launch
>>>>  return _lldb.SBTarget_Launch(self, *args)
>>>> NotImplementedError: Wrong number of arguments for overloaded function 
>>>> 'SBTarget_Launch'.
>>>> Possible C/C++ prototypes are:
>>>>  Launch(lldb::SBTarget *,lldb::SBListener &,char const **,char const 
>>>> **,char const *,char const *,char const *,char const 
>>>> *,uint32_t,bool,lldb::SBError &)
>>>>  Launch(lldb::SBTarget *,lldb::SBLaunchInfo &,lldb::SBError &)
>>>> 
>>>> Passing None for the argv parameter works fine, but a list or a tuple 
>>>> (even empty) gives that error.
>>>> 
>>>> 
>>>> -Greg
>>>> 
>>>> 
>>>> On Mon, Apr 23, 2012 at 4:09 PM, Greg Hazel <[email protected]> wrote:
>>>> Ah, perfect. Works like a charm, thanks!
>>>> 
>>>> -Greg
>>>> On Monday, April 23, 2012 at 3:32 PM, Jim Ingham wrote:
>>>> 
>>>>> There's a more complicated SBTarget::Launch in SBTarget.h that takes a 
>>>>> path for the target's stdout/stdin/stderr. Should be able to get the tty 
>>>>> path for the current terminal and use that.
>>>>> 
>>>>> Jim
>>>>> 
>>>>> 
>>>>> On Apr 23, 2012, at 3:22 PM, Greg Hazel wrote:
>>>>> 
>>>>>> First off, thanks for your help!
>>>>>> 
>>>>>> I got both of those methods working to some extent, but both have little 
>>>>>> issues.
>>>>>> 
>>>>>> The pexpect approach outputs the lldb prompts and other output in 
>>>>>> addition to the backtrace, which is not ideal. (Also I can't seem to get 
>>>>>> it to terminate properly in the "Process .* exited with status" case..)
>>>>>> 
>>>>>> The Python HandleCommand approach lets me control lldb properly, but the 
>>>>>> stdout/stderr of the inferior is being swallowed. I found the parameters 
>>>>>> to redirect output to a file and the GetSTDOUT function, but not a way 
>>>>>> to just output stdout/err to the current terminal directly, as lldb 
>>>>>> itself seems to. It's pretty easy to build a thread that dumps 
>>>>>> GetSTDOUT/ERR, but the stdout/stderr wouldn't interleave quite the same 
>>>>>> way as they would without the buffering. Is there a way to get the same 
>>>>>> behavior as lldb?
>>>>>> 
>>>>>> -Greg
>>>>>> On Monday, April 23, 2012 at 11:21 AM, Johnny Chen wrote:
>>>>>> 
>>>>>>> Hi Greg,
>>>>>>> 
>>>>>>> ToT/utils/test/run-until-faulted provides a similar scenario. 
>>>>>>> Basically, it uses pexpect to spawn an lldb command line program,
>>>>>>> and to run the inferior until it faults and give the control back to 
>>>>>>> the user to interact with lldb. You could easily modify it to
>>>>>>> just print out a backtrace and to give back the control or just exit 
>>>>>>> the lldb program.
>>>>>>> 
>>>>>>> You're welcome to modify the thing or to add your handy utility.
>>>>>>> 
>>>>>>> Thanks.
>>>>>>> 
>>>>>>> On Apr 23, 2012, at 11:14 AM, Jim Ingham <[email protected]> wrote:
>>>>>>> 
>>>>>>>> The lldb command line tool doesn't have a batch mode. Feel free to 
>>>>>>>> file a bug on this (or just add it yourself...) We haven't gotten 
>>>>>>>> around to this yet because most of the sort of thing you would do with 
>>>>>>>> more complex gdb scripts, we envisioned doing in Python instead.
>>>>>>>> 
>>>>>>>> What you want to do would be quite easy in Python. For instance, 
>>>>>>>> examples/python/disass.py has a quick example of launching a process & 
>>>>>>>> stopping at a breakpoint. That does pretty much what you want, you 
>>>>>>>> just want to catch any stop state bug eStateExited, enumerate the 
>>>>>>>> threads - there's an iterator for that in the process, so you can just 
>>>>>>>> do:
>>>>>>>> 
>>>>>>>> for t in process:
>>>>>>>> 
>>>>>>>> and then get the backtrace for the thread. There's a routine in 
>>>>>>>> test/lldbutils.py (print_stacktrace) that does a fairly fancy job of 
>>>>>>>> this, and of course you can always get the command interpreter from 
>>>>>>>> the debugger object and call HandleCommand to run an lldb command-line 
>>>>>>>> command... The data for the command comes back in the result object so 
>>>>>>>> you can print it to stdout, or some log file or whatever you want to 
>>>>>>>> do with it.
>>>>>>>> 
>>>>>>>> lldb's Python API's do have documentation that you can access in 
>>>>>>>> Python, or just look at the files in include/lldb/API, the C++ -> 
>>>>>>>> Python translation is pretty straight-forward.
>>>>>>>> 
>>>>>>>> The page:
>>>>>>>> 
>>>>>>>> http://lldb.llvm.org/python-reference.html
>>>>>>>> 
>>>>>>>> has some info on how to load the lldb module into stand-alone Python, 
>>>>>>>> which is probably what you want to do.
>>>>>>>> 
>>>>>>>> Hope this helps.
>>>>>>>> 
>>>>>>>> Jim
>>>>>>>> 
>>>>>>>> 
>>>>>>>> 
>>>>>>>> On Apr 20, 2012, at 10:55 PM, Greg Hazel wrote:
>>>>>>>> 
>>>>>>>>> Hi,
>>>>>>>>> 
>>>>>>>>> I'd like to run my process in lldb automatically, and print a 
>>>>>>>>> backtrace if an error occurs but exit normally otherwise. This sort 
>>>>>>>>> of thing can be achieved (sloppily) with gdb using something like 
>>>>>>>>> this:
>>>>>>>>> 
>>>>>>>>> echo -e "run\nthread apply all bt" > foo.gdb
>>>>>>>>> gdb -batch -x foo.gdb my_process
>>>>>>>>> 
>>>>>>>>> Is something like this possible? I'd be willing to write some Python 
>>>>>>>>> if needed.
>>>>>>>>> 
>>>>>>>>> -Greg
>>>>>>>>> 
>>>>>>>>> _______________________________________________
>>>>>>>>> lldb-dev mailing list
>>>>>>>>> [email protected]
>>>>>>>>> http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev
>>>>>>>> 
>>>>>>>> _______________________________________________
>>>>>>>> lldb-dev mailing list
>>>>>>>> [email protected]
>>>>>>>> http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev
>>>>>> 
>>>>>> _______________________________________________
>>>>>> lldb-dev mailing list
>>>>>> [email protected]
>>>>>> http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev
>>>> 
>>>> 
>>>> _______________________________________________
>>>> lldb-dev mailing list
>>>> [email protected]
>>>> http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev
>>> 
>> 
> 


_______________________________________________
lldb-dev mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev

Reply via email to