The test "TestExec.py" has been on and off flakey on the GreenDragon MacOS bots for a while now. I'm trying to fix that. It adds a lot of noise to the bots.
For background:
The job of detecting an exec used to be handled by the DynamicLoaderMacOSX plugin. But when dyld switched over to a remote API approach rather than data structures lldb inspects, that job became hard. About the only clue remaining for the new dyld API loader (DynamicLoaderMacOS) is whether the program is back at dyld_start when it gets a SIGTRAP. But if dyld has moved in the course of the exec then the new dyld_start address is not the one we knew it as before the exec, so this detection will fail. To make this work on the lldb side, we'd have to refresh the shared library state every time we got a SIGTRAP. But that's expensive.
Fortunately, newer debugservers figure this out on their end and annotate the stop packet with "reason:exec". So there's no need to do it on the lldb side. But because we didn't want to deal with code signing on the bots, they sometimes run older debugservers. And indeed, when Adrian and I were investigating the failures by looking at the packet log we only saw failures when the stop reason didn't include reason:exec.
Also fortunately, in order to support other tools that haven't updated to the new dyld API's, for now dyld is still maintaining the data structures lldb used to look at.
So this patch adds back the check for the dyld info data structure moving that the DynamicLoaderMacOSX used. For debugservers that send reason:exec, this code won't ever get run since ProcessGDBRemote will immediately turn the SIGTRAP into an exec. And it will work correctly with older debugservers until dyld actually removes this structure. At that point, the info address will be LLDB_INVALID_ADDRESS, and this code won't help anymore. But presumably by then we won't have any debugservers we care about that don't send "reason:exec".
Perhaps add a /// comment explaining what is being stored here?