在 MacOS 上,我看到一个看起来像这样的堆栈(在堆栈的最顶端是一个陷阱,有问题的代码,但我想了解我是如何到达那里的)
(gdb) where
...
#4 0x0000000112fdefc8 in appLibInit::appLibInit ()
#5 0x0000000112fdef71 in __sti__$E ()
#6 0x00007fff5fc112f7 in __dyld__ZN16ImageLoaderMachO18doModInitFunctionsERKN11ImageLoader11LinkContextE ()
#7 0x00007fff5fc0d20c in __dyld__ZN11ImageLoader23recursiveInitializationERKNS_11LinkContextEj ()
#8 0x00007fff5fc0d1b0 in __dyld__ZN11ImageLoader23recursiveInitializationERKNS_11LinkContextEj ()
#9 0x00007fff5fc0d1b0 in __dyld__ZN11ImageLoader23recursiveInitializationERKNS_11LinkContextEj ()
#10 0x00007fff5fc0d1b0 in __dyld__ZN11ImageLoader23recursiveInitializationERKNS_11LinkContextEj ()
#11 0x00007fff5fc0d2f4 in __dyld__ZN11ImageLoader15runInitializersERKNS_11LinkContextE ()
#12 0x00007fff5fc038b4 in __dyld__ZN4dyld24initializeMainExecutableEv ()
#13 0x00007fff5fc06ea1 in __dyld__ZN4dyld5_mainEPK11mach_headermiPPKcS5_S5_ ()
#14 0x00007fff5fc01695 in __dyld__ZN13dyldbootstrap5startEPK11mach_headeriPPKcl ()
#15 0x00007fff5fc0103a in __dyld__dyld_start ()
#16 0x0000000100000000 in ?? ()
#17 0x0000000000000001 in ?? ()
函数 appLibInit::appLibInit 是我们代码中全局对象的 C++ 构造函数,所以我猜我在某种预主代码中,可能处理所有链接到的共享库(奇怪的是代码在问题不是我们期望与我们联系的东西,除非它被其他东西拖进来)。
mac c++filt 似乎没有解码这些 __dyld 前缀符号。
有人知道一些描述 MacOS 进程启动顺序的文档,这可能会给我更多的线索吗?