在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进程启动序列的文档,这可能会让我对这里发生的事情有更多的了解?
发布于 2012-03-20 06:21:37
dyld的源代码可以在线获得:
http://www.opensource.apple.com/source/dyld/
您可以通过简单地删除__dyld前缀来解码损坏的符号名称。添加前缀可能是为了防止与恰好定义相同C++函数的用户代码冲突(例如,如果您自己编译dyld的某些部分)。
更一般地说,您看到的是库的加载和初始化。动态库可以在加载函数时声明该函数应该运行;这看起来就像您的appLibInit::appLibInit()正在发生的事情。(如果库是由主二进制文件加载的,这可能会在main()之前发生。)
在C++中可能发生这种情况的一种方式是,如果您全局声明了任何具有构造函数的对象。
https://stackoverflow.com/questions/9778774
复制相似问题