google / google/EarlGrey

Question: why we need to add EarlGrey.framework to DYLD_INSERT_LIBRARIES

Aperta
#653 8 commenti 0 reazioni 0 assegnatari Vedi su GitHub
Lingua principale
Objective-C
Stelle
5.7k
Fork
737
Merge medio
1g 20h
PR unite (30g)
5

Descrizione

I've read https://github.com/google/EarlGrey/blob/master/docs/ifaq.md and it explained why.

I am wondering if this is necessary, so I did some experiments:

1. I added a module initializer to EarlGray.m:

__attribute__((constructor))
static void initializer(int argc, char** argv, char** envp) {
static int initialized = 0;
if (!initialized) {
// Initialization code.
initialized = 1;
}
}

and setup a breakpoint in it.

2. Run any test in ExampleTest, when the breakpoint is hit, it shows the following call stack:

* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
* frame #0: 0x0000000151817b2f (*hide test name*)`initializer(argc=5, argv=0x00007ffee21268a0, envp=0x00007ffee21268d0) at EarlGrey.m:34
frame #1: 0x00000001336d7c16 dyld_sim`ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) + 420
frame #2: 0x00000001336d7e46 dyld_sim`ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) + 40
frame #3: 0x00000001336d36da dyld_sim`ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, char const*, ImageLoader::InitializerTimingList&, ImageLoader::UninitedUpwards&) + 330
frame #4: 0x00000001336d2898 dyld_sim`ImageLoader::processInitializers(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&, ImageLoader::UninitedUpwards&) + 134
frame #5: 0x00000001336d292c dyld_sim`ImageLoader::runInitializers(ImageLoader::LinkContext const&, ImageLoader::InitializerTimingList&) + 74
frame #6: 0x00000001336c9956 dyld_sim`dyld::runInitializers(ImageLoader*) + 82
frame #7: 0x00000001336cf076 dyld_sim`dlopen + 803
frame #8: 0x000000013e24aa47 libdyld.dylib`dlopen + 86
frame #9: 0x0000000136b00808 CoreFoundation`_CFBundleDlfcnLoadBundle + 152
frame #10: 0x0000000136b00694 CoreFoundation`_CFBundleLoadExecutableAndReturnError + 324
frame #11: 0x00000001342b4ec1 Foundation`-[NSBundle loadAndReturnError:] + 520
frame #12: 0x00000001337a3860 IDEBundleInjection`__XCBundleInjection + 798
frame #13: 0x00000001336d7c16 dyld_sim`ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) + 420
frame #14: 0x00000001336d7e46 dyld_sim`ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) + 40
frame #15: 0x00000001336d36da dyld_sim`ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, char const*, ImageLoader::InitializerTimingList&, ImageLoader::UninitedUpwards&) + 330
frame #16: 0x00000001336d2898 dyld_sim`ImageLoader::processInitializers(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&, ImageLoader::UninitedUpwards&) + 134
frame #17: 0x00000001336d292c dyld_sim`ImageLoader::runInitializers(ImageLoader::LinkContext const&, ImageLoader::InitializerTimingList&) + 74
frame #18: 0x00000001336c715d dyld_sim`dyld::initializeMainExecutable() + 166
frame #19: 0x00000001336cac98 dyld_sim`dyld::_main(macho_header const*, unsigned long, int, char const**, char const**, char const**, unsigned long*) + 4412
frame #20: 0x00000001336c63d4 dyld_sim`start_sim + 136
frame #21: 0x000000013c40cded dyld`dyld::useSimulatorDyld(int, macho_header const*, char const*, int, char const**, char const**, char const**, unsigned long*, unsigned long*) + 2200
frame #22: 0x000000013c40a7a3 dyld`dyld::_main(macho_header const*, unsigned long, int, char const**, char const**, char const**, unsigned long*) + 436
frame #23: 0x000000013c4063d4 dyld`dyldbootstrap::start(macho_header const*, int, char const**, long, macho_header const*, unsigned long*) + 453
frame #24: 0x000000013c4061d2 dyld`_dyld_start + 54

3. Also add a break point at the beginning main function of App under test, and confirm:
a. it is hit later than loading EarlGray.framework
b. check EarlGray.framework did get loaded by dyld

So looks like once test target is linked against EarlGrey.framework, it get loaded at a very early stage when dyld is loading libraries for AUT. Is library loaded through DYLD_INSERT_LIBRARIES get loaded earlier than this? If true, is there anything EarlGrey is tracking even before main function get running?

Guida per i contributori

Apri la guida per i contributori

Direzione di ricerca

Inizia da docs/ifaq.md e dall’initializer in EarlGrey.m, quindi confronta lo stack delle chiamate dyld riportato con il momento in cui viene eseguita la funzione main dell’app. Il lavoro è completato quando è documentato se DYLD_INSERT_LIBRARIES viene caricato prima del framework collegato e se EarlGrey tiene traccia di qualcosa prima dell’esecuzione di main.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
ios, objective-c
Ambito
mobile-dev, testing-qa
Tipo di issue
Documentazione
Difficoltà
4/5
Tempo stimato
3-5 giorni
Stato di attività
Ferma
Chiarezza
Da chiarire
Idoneità per principianti
25/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.