Hi Greg,

thank you for the response.

I have only one concern about backtrace(). Is it safe to be used from a signal 
handler? What happens in case of corrupted stack, stack overflow or corrupted 
heap. Won’t the backtrace() call try to read invalid data and possibly crash as 
well? I need it to be reliable. As it is in section 3 of the manpages I suppose 
it is not a system call and it is not listed as a signal handler safe function.

Best regards,

Jakub

On 12 May 2015, at 20:17, Greg Clayton <gclay...@apple.com> wrote:

> You best bet for simplicity is to use backtrace(). LLDB has code that does 
> this in the host layer:
> 
> void
> Host::Backtrace (Stream &strm, uint32_t max_frames)
> {
>    if (max_frames > 0)
>    {
>        std::vector<void *> frame_buffer (max_frames, NULL);
>        int num_frames = ::backtrace (&frame_buffer[0], frame_buffer.size());
>        char** strs = ::backtrace_symbols (&frame_buffer[0], num_frames);
>        if (strs)
>        {
>            // Start at 1 to skip the "Host::Backtrace" frame
>            for (int i = 1; i < num_frames; ++i)
>                strm.Printf("%s\n", strs[i]);
>            ::free (strs);
>        }
>    }
> }
> 
> Using LLDB.framework is probably too expensive and you can't guarantee a user 
> system will have it installed since it is only installed with Xcode or the 
> command line tools package that is available separately.
> 
> The above code will be the cheapest way memory wise compared to using LLDB.
> 
> Greg
> 
>> On May 12, 2015, at 2:22 AM, Jakub Bednář <jakub.bed...@avg.com> wrote:
>> 
>> Hello everyone,
>> 
>> I am trying to develop a crash handler, that is able to detect which part of 
>> my code did cause a crash. The process registers a signal handler. When it 
>> crashes, the signal handler is called with siginfo_t. But the information 
>> there might point to some libc function (memcmp, memcopy, etc.). I need to 
>> find out, which part of my code up the stack is responsible for calling it. 
>> Currently I am relying on systems CrashReporter, but for some reason I am 
>> getting reports from users with .crash files missing, so maybe it does not 
>> create the .crash file for all possible crash scenarios? It also does not 
>> carry parts of heap etc so its use is limited.
>> 
>> I have tried several things with no results so far.
>> 
>> 1. Google’s crashpad and breakpad can generate a minidump, but they 
>> currently can’t correctly unwind stack that is in signal handler.
>> 2. stackshot(1) creates some stacks, but they are divided to kernel and user 
>> stacks and have many frames that seems to be wrong. They are not displayed 
>> in lldb for instance.
>> 3. backtrace(3) seems risky to be used from signal handler, especially when 
>> the stack can be corrupted.
>> 4. Taking LLDB.framework with me as suggested in one of the mailing list 
>> threads could work, but the framework has 43MB.
>> 
>> Trying to find out some documentation and reading forums and mailing lists, 
>> I got stuck on two questions and I hope someone here can help me out.
>> 
>> a. How can I get into the depths of stack unwinding? Can you please point me 
>> to any literature, articles to get into it. I know where to find it in LLDB 
>> source code, but it is a dark magic for me and reading the code without 
>> understanding the concepts does not help.
>> b. Do you know about any project that I could use just for stack unwinding. 
>> I need mainly x86_64 darwin systems.
>> c. Is there possibly any API to Mac OS X system crash reporter so I can 
>> utilize it? Would be great to get on-demand stacks of process or maybe even 
>> a minidump.
>> d. Are there any compiler options for clang that could make stack unwinding 
>> easier? I believe on Windows you can work only with ebp chains. That would 
>> help a lot.
>> 
>> Thank you very much for any help.
>> 
>> Best regards,
>> 
>> Jakub 
>> _______________________________________________
>> lldb-dev mailing list
>> lldb-dev@cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev
> 


_______________________________________________
lldb-dev mailing list
lldb-dev@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev

Reply via email to