JDevlieghere added a comment.
My first observations:
- We call `ResolveTypeUID` without going through the symbol vendor (similar to
`GetDeclContextForUID` in the stack trace). This is easy to fix, just add
locking to these functions.
- The module in the symbol vendor is different from the one in the symbol file.
This seems more tricky and I'm not sure if this expected?
I looked at TestCallCPPFunction where my newly added assertion triggered in
`ParseCompileUnitSupportFiles` which I found odd since we're taking the module
lock in symbol vendor.
frame #4: 0x000000010590c083
_lldb.so`lldb_private::SymbolFile::AssertModuleLock(this=0x000000010388ac00) at
SymbolFile.cpp:160
157 // We assert that we have to module lock by trying to acquire the
lock from a
158 // different thread. Note that we must abort if the result is true
to
159 // guarantee correctness.
-> 160 assert(std::async(
161 std::launch::async,
162 [this] {
163 return
this->GetObjectFile()->GetModule()->GetMutex().try_lock();
(lldb) p GetObjectFile()->GetModule()
(lldb::ModuleSP) $1 =
std::__1::shared_ptr<lldb_private::Module>::element_type @ 0x0000000118905378
strong=1 weak=1 {
__ptr_ = 0x0000000118905378
}
(lldb) fr sel 7
frame #7: 0x000000010591035b
_lldb.so`lldb_private::SymbolVendor::ParseCompileUnitSupportFiles(this=0x0000000100184f90,
sc=0x00007ffeefbf79a8, support_files=0x0000000118904d70) at
SymbolVendor.cpp:171
168 if (module_sp) {
169 std::lock_guard<std::recursive_mutex>
guard(module_sp->GetMutex());
170 if (m_sym_file_ap.get())
-> 171 return m_sym_file_ap->ParseCompileUnitSupportFiles(sc,
support_files);
172 }
173 return false;
174 }
(lldb) p module_sp
(lldb::ModuleSP) $0 =
std::__1::shared_ptr<lldb_private::Module>::element_type @ 0x0000000100189ec0
strong=6 weak=18 {
__ptr_ = 0x0000000100189ec0
}
Repository:
rLLDB LLDB
https://reviews.llvm.org/D52543
_______________________________________________
lldb-commits mailing list
[email protected]
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits