符号延迟加载

Posted yilang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了符号延迟加载相关的知识,希望对你有一定的参考价值。

当我们在windbg里执行lm指令后,回见到如下情况:

技术图片

 

有的模块名后面跟的时pdb symbols,表示已加载符号,且后面还跟着符号的详细路径。有的模块后面跟着的是deferred,表示模块已经加载,但是调试器还没有尝试加载它的符号。符号将在需要的时候被加载。那么什么是延迟加载?

符号延迟加载

默认情况下,目标模块加载时并没有实际加载符号信息。符号是在调试器需要使用时才加载的。这称为延迟符号加载(deferred symbol loading 或 lazy symbol loading)。当该选项启用时,调试器在遇到不认识的符号时才会进行符号加载。当延迟符号加载被禁用时,进程的启动可能变得慢很多,因为所有符号在模块加载时就会被加载起来。在WinDbg中,对于没有模块前缀的符号,延迟符号加载的特性可以使用Debug菜单的Resolve Unqualified Symbols选项来更改。

技术图片

通过使用ld (Load Symbols)命令或.reload (Reload Module)命令和/f选项,可以忽略延迟符号加载 。他们强制指定符号被立即加载起来,即使其他符号的加载是延迟的。如果符号路径改变了,符号不会自动重新加载。默认情况下,延迟符号加载是启用的。在CDB和KD中, -s 命令行选项可以关掉它。在CDB中也可以通过tools.ini文件的LazyLoad选项来关掉。当调试器运行起来之后,可以通过.symopt+0x4或.symopt-0x4命令来打开或关闭。

以上是关于符号延迟加载的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate延迟加载

Hibernate延迟加载机制

hibernate延迟加载

延迟加载模块中的角度延迟加载模块

延迟加载

MyBatis一对多查询及延迟加载