2017-08-01 11 views
7

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ıç.

+0

Yığın izini almak için lldb'de çalıştırmayı denediniz mi? – clemens

+0

Soruda yazdığım gibi, kütüphane sessizce önceden yüklenmemiş, bu yüzden lldb'de ne tür bir araya getireceğimi bilmiyorum? –

+0

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

cevap

4

Sen env komutla çevreyi ayarlayabilirsiniz lldb, kodunuzu çalıştırabilirsiniz: çöker kadar programınızı çalıştırabilirsiniz

env DYLD_FORCE_FLAT_NAMESPACE=1 
env DYLD_INSERT_LIBRARIES=./foo/my.dylib 
run 

lldb ile. exit() (veya _exit()) ile anormal olarak varsa, b exit ve b _exit ile sembolik kesme noktaları ayarlamanız gerekir. Böylece başarısız olduğu yerde backtrace alma şansınız var.

İlgili konular