We could also just give the Module a std::string with the description
and update it in the few places where we actually update it. The
m_arch already has a setter in place that just needs to be used in a
few more places, so the infrastructure is kind of already there (at
least for m_arch). The description would just have its own mutex.


Am Fr., 5. Feb. 2021 um 00:39 Uhr schrieb Jorge Gorbe Moya via
lldb-dev <lldb-dev@lists.llvm.org>:
>
> Wouldn't it be preferable to try_lock in GetDescription (which is the one 
> currently acquiring the mutex) instead? ReportError doesn't touch any mutex 
> itself and will happily report the rest of the error if GetDescription bails 
> out. For the test case I sent it would look like this:
>
> error:  {0x0000000b}: invalid abbreviation code 123, please file a bug and 
> attach the file at the start of this error message
> error:  {0x0000000b}: invalid abbreviation code 123, please file a bug and 
> attach the file at the start of this error message
> error:  {0x0000000b}: invalid abbreviation code 123, please file a bug and 
> attach the file at the start of this error message
>
> which is way better than a deadlock IMO.
>
>
>
>
> On Thu, Feb 4, 2021 at 12:16 PM Pavel Labath <pa...@labath.sk> wrote:
>>
>> Please have a look at
>> <https://lists.llvm.org/pipermail/lldb-dev/2020-October/016479.html>,
>> which is the last time this came up.
>>
>>
>> One quick'n'dirty solution would be to have `Module::ReportError` _try_
>> to get the module lock, and if it fails, just bail out. That obviously
>> means you won't get to see the error message which triggerred the
>> deadlock (though we could also play around with that and try printing
>> the error message without the module description or something), but it
>> will at least get you past that point...
>>
>> pl
>>
>> On 04/02/2021 21:04, Jorge Gorbe Moya via lldb-dev wrote:
>> > Hi,
>> >
>> > I've found a deadlock in lldb (see attached test case, you can build it
>> > with just `clang -o test test.s`), but I'm a total newbie and I have no
>> > idea what's the right way to fix it.
>> >
>> > The problem happens when an error is found during DIE extraction when
>> > preloading symbols. As far as I can tell, it goes like this:
>> >
>> > 1. Module::PreloadSymbols locks Module::m_mutex
>> > 2. A few layers below it, we end up in ManualDWARFIndex::Index, which
>> > dispatches DIE extractions to a thread pool:
>> >
>> > |for (size_t i = 0; i < units_to_index.size(); ++i)
>> > pool.async(extract_fn, i); pool.wait(); |
>> >
>> > 3. extract_fn in the snippet above ends up executing
>> > DWARFDebugInfoEntry::Extract and when there's an error during
>> > extraction, Module::GetDescription is called while generating the error
>> > message.
>> > 4. Module::GetDescription tries to acquire Module::m_mutex from a
>> > different thread, while the main thread has the mutex already locked and
>> > it's waiting for DIE extraction to end, causing a deadlock.
>> >
>> > If we make Module::GetDescription not lock the problem disappears, so
>> > the diagnosis looks correct, but I don't know what would be the right
>> > way to fix it. Module::GetDescription looks more or less safe to call
>> > without locking: it just prints m_arch, m_file, and m_object_name to a
>> > string, and those look like fields that wouldn't change after the Module
>> > is initialized, so maybe it's okay? But I feel like there must be a
>> > better solution anyway. Any advice?
>> >
>> > Best,
>> > Jorge
>> >
>> >
>> >
>> >
>> >
>> >
>> >
>> >
>> > _______________________________________________
>> > lldb-dev mailing list
>> > lldb-dev@lists.llvm.org
>> > https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-dev
>> >
>>
> _______________________________________________
> lldb-dev mailing list
> lldb-dev@lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-dev
_______________________________________________
lldb-dev mailing list
lldb-dev@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-dev

Reply via email to