MacOS 10.12.6'da, paylaşılan bir kitaplığım ve bir yürütülebilir dosyam var (her ikisi de yerleşiktir, SIP olmamalıdır AFAIK'yi uygulayın) ve kütüphaneyi yürütülebilir dosya için önceden yüklemek istiyorum. Sessizce aksi 1'lik bir geri dönüş koduyla başarısız ve:DYLD_FORCE_FLAT_NAMESPACE = 1 DYLD_INSERT_LIBRARIES =./Foo/my.dylib ./bar/exec, 1 w/o benim çalıştırılabilir çalıştırmayı döndürür
$ ./bar/exec
<does stuff>
$ DYLD_FORCE_FLAT_NAMESPACE=1 DYLD_INSERT_LIBRARIES=./foo/my.dylib ./bar/exec
<returns immediately>
$ echo $?
1
# 1 is not an explicitly returned value from ./bar/exec
man dyld
belgelenen gibi ben ya DYLD_PRINT_LIBRARIES
veya DYLD_PRINT_LIBRARIES_POST_LAUNCH
seçenekleri eklemek ikisi de kütüphane ve yürütülebilir hem başarıyla yüklenmiş olmasıyla gösterirse:
...
dyld: loaded: /full/path/to/exec
dyld: loaded: ./foo/my.dylib
...
Önceden yüklenebilen çalıştırmayı dtruss veya lldb'de çalıştırmaya çalışırsam, kitaplık önceden yüklenmeden çalışır. Bu, mantıklı olabilir çünkü bu araçlar SIP korumalıdır.
Bunu hata ayıklama hakkında nasıl giderim?
(lldb) env DYLD_FORCE_FLAT_NAMESPACE=1 DYLD_INSERT_LIBRARIES=./foo/my.dylib
(lldb) run
...
Process 24130 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 2.1
frame #0: 0x00007fffc8aac310 libsystem_kernel.dylib`__exit
...
(lldb) bt
* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 2.1
* frame #0: 0x00007fffc8aac310 libsystem_kernel.dylib`__exit
frame #1: 0x000000010008ebac my.dylib`my_init at my.c:86 [opt]
frame #2: 0x0000000100018a1b dyld`ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) + 385
frame #3: 0x0000000100018c1e dyld`ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) + 40
frame #4: 0x00000001000144aa dyld`ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, char const*, ImageLoader::InitializerTimingList&, ImageLoader::UninitedUpwards&) + 338
frame #5: 0x0000000100013524 dyld`ImageLoader::processInitializers(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&, ImageLoader::UninitedUpwards&) + 138
frame #6: 0x00000001000135b9 dyld`ImageLoader::runInitializers(ImageLoader::LinkContext const&, ImageLoader::InitializerTimingList&) + 75
frame #7: 0x0000000100005434 dyld`dyld::initializeMainExecutable() + 125
frame #8: 0x00000001000098c6 dyld`dyld::_main(macho_header const*, unsigned long, int, char const**, char const**, char const**, unsigned long*) + 3966
frame #9: 0x0000000100004249 dyld`dyldbootstrap::start(macho_header const*, int, char const**, long, macho_header const*, unsigned long*) + 470
frame #10: 0x0000000100004036 dyld`_dyld_start + 54
budur:
GÜNCELLEME
teşekkürler ben LLDB için aksine LLDB kendisinden preload ortamı ayarlayarak lldb altında dönüş kodu 1 çıkış çoğaltmak mümkün duyuyorum, @macmoonshine için hata ayıklama için bir başlangıç.
Yığın izini almak için lldb'de çalıştırmayı denediniz mi? – clemens
Soruda yazdığım gibi, kütüphane sessizce önceden yüklenmemiş, bu yüzden lldb'de ne tür bir araya getireceğimi bilmiyorum? –
Yürütücünüzü 'lldb' içinde çalıştırırsanız, çökmesi de gerekir. 'lldb ', çarpışmadan sonra' bt 'yazıyorsa, çarpışma pozisyonunu gösterir. – clemens