[lldb-dev] Assert in DYLDRendezvous::UpdateSOEntries
Kopec, Matt
matt.kopec at intel.com
Fri Jun 14 09:54:46 PDT 2013
Unfortunately, the original author of the majority of the original POSIX/Linux code isn't around anymore.
However, looking into the issue, I think the code here is expecting an eConsistent state after an eAdd/eDelete since the library entries don't get updated until you actually get the eConsistent state. This is probably why there is an m_previous and m_current.
Maybe the behaviour you see is ok. I'm not sure. I think better understanding of the system dynamic linker/loader behaviour here may be needed.
Curiously, do you get the same assert without a step? i.e. just running?
Thanks,
Matt
On 2013-06-13, at 9:50 PM, Michael Sartain <mikesart at gmail.com> wrote:
> I just hit the below assert on line 138 stepping over a dlclose().
>
> 120| bool
> 121| DYLDRendezvous::UpdateSOEntries()
> 122| {
> 123| SOEntry entry;
> 124|
> 125| if (m_current.map_addr == 0)
> 126| return false;
> 127|
> 128| // When the previous and current states are consistent this is the first
> 129| // time we have been asked to update. Just take a snapshot of the currently
> 130| // loaded modules.
> 131| if (m_previous.state == eConsistent && m_current.state == eConsistent)
> 132| return TakeSnapshot(m_soentries);
> 133|
> 134| // If we are about to add or remove a shared object clear out the current
> 135| // state and take a snapshot of the currently loaded images.
> 136| if (m_current.state == eAdd || m_current.state == eDelete)
> 137| {
> 138+> assert(m_previous.state == eConsistent);
> 139| m_soentries.clear();
> 140| m_added_soentries.clear();
> 141| m_removed_soentries.clear();
> 142| return TakeSnapshot(m_soentries);
> 143| }
>
> It's called by this code in DYLDRendezvous::Resolve():
>
> 106| // The rendezvous was successfully read. Update our internal state.
> 107| m_rendezvous_addr = info_addr;
> 108| m_previous = m_current;
> 109| m_current = info;
> 110|
> 111+> return UpdateSOEntries();
>
> m_previous is being set to m_current and both are eDelete now, but that assert above is claiming it should be eConsistent.
>
> Is this a bogus assert, or is the Resolve() function messing with m_previous when it shouldn't be?
> -Mike
> _______________________________________________
> lldb-dev mailing list
> lldb-dev at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev
More information about the lldb-dev
mailing list